音效輸出進階技巧:當「聚集裝置」(Aggregate Devices)失效時的替代方案
在 OSx86 上修補好 AppleHDA 後,若想讓類比音源輸出(Line Out)與數碼光纖/同軸(S/PDIF)同時發聲,內置的「聚集裝置」往往只會從單一介面輸出且缺乏軟件音量控制。本文分享結合 Soundflower 與 Xcode AU Lab 實現全喇叭同步輸出與音量調節的實戰方案。
- 主筆作者
- @Dies 發表於 2008-11-28
- 所屬專區
- OSx86 10.X 核心架構與安裝配置
- 典藏規模與紀錄
- 212,798 次歷史閱讀 · 5 則精選技術筆記(萃取自 6 則原始回帖) · 2008-11-28 – 2011-11-13
- 參與貢獻成員 (5)
- @Dies (2)@Ianxxx@fahrvergnuugen@mr_murder@zorro23
- 相關硬件參考
- Mac USB Audio DACs ↗ SATA III & NVMe SSDs ↗ USB 3.2 Boot Flash Drives ↗
我不確定這是只有我的硬件配置才會遇到的特殊狀況,還是其他人也面臨相同的困擾,但我覺得背後的原理應該能幫到想達成類似多聲道同步輸出需求的朋友。
至少對我而言,這方面的相關資訊非常難找;而當我好不容易找到解決方案時,內容卻早已過時。我原本也很想在這裏附上當年那篇討論帖的連結,但無奈實在找不回來了……
對我來說,在非標準 PC 硬件上運行 OS X 的一大缺點在於音效路由機制:其他主流作業系統只要裝好驅動程式,就能毫不費力地自動將音訊同時傳送到所有可用的輸出介面;然而 OS X 處理這件事的方式卻截然不同。在標準 Apple 硬件環境下,CoreAudio 或許是一套更優秀的音訊架構,但在這種情況下卻顯得相當不夠友善。
在完成 HDA 音效修補後,系統成功識別內置音效卡,耳機孔、音源輸出(Line Out)、S/PDIF 數碼輸出與咪高峰全都運作正常,非常棒。接下來我只需要讓聲音同時從 Line Out 與 S/PDIF 輸出即可。照理說這應該不成問題,我在網上查到的所有資料都說只要建立一個「聚集裝置」(Aggregate Device)就能「即設即用」。
然而我的實際測試結果卻是:
a.) 完全行不通!無論我怎麼設定,聲音永遠只會從其中一個輸出介面發出——也就是排在聚集裝置清單最頂端的那個介面。
b.) 由於數碼輸出(Digital Out)在系統內不支援軟件音量控制,這意味著就算聚集裝置真的成功運作,我也完全無法透過軟件調整該裝置的音量。
最終我的解決方案是結合使用 Soundflower ↗ 以及包含在 Xcode 開發工具內的 AU Lab(路徑為 /Developer/Applications/Audio/AU Lab)。安裝 Soundflower 後,系統會新增兩個虛擬音訊裝置(一個 2 聲道、一個 16 聲道),但在你設定路由之前它們並不會有任何實質作用,而這正是 AU Lab 派上用場的地方。
安裝完 Soundflower 並重新開機後,我開啟「音訊 MIDI 設定」(Audio/MIDI Setup),新增了一個名為「Surround Sound」的聚集裝置,並將「數碼輸出」(Digital Output)、「音源輸出」(Line Out)以及新出現的「Soundflower (16ch)」勾選合併在一起。接著我開啟 AU Lab 並開始配置這些新裝置:在應用程式啟動後出現的第一個視窗中,我新增了幾組輸出(Outputs),讓它同時涵蓋 Line Out 與 S/PDIF 的輸出聲道。
在下一個部分(Inputs),我只需要設定一組輸入。
接下來的步驟就是關鍵所在:我點擊「Input Channels」(輸入聲道),並選擇「Soundflower (16ch)」裝置;
然後點擊「Output Channels」(輸出聲道),選擇我稍早建立的「Surround Sound」聚集裝置,再按下「Done」(完成)。
最終呈現出如下圖的配置介面:
畫面中額外加入的 Bus 1 與 Bus 2 作用就像擴音機一樣,能讓聲音變得更響亮清晰;至於保留那組未使用的輸出(Unused Output),是因為我發現如果不留著它的話,有時會出現刺耳的迴授雜音(Feedback)。
老實說,這個解決方案實在稱不上優雅,而且本質上它並不是真正的環繞聲(Surround Sound),而是將立體聲複製輸出;但它確實解決了我的問題!現在我的全部 7 個喇叭加上重低音音箱都能同時發聲,而且還能直接用系統軟件調整總音量。最後只要將這個 AU Lab 設定檔設為「登入時自動開啟」,平時只需將視窗最小化或按右鍵隱藏起來,使用上就不會造成太大不便了。
希望這篇分享能對遇到相同問題的朋友有所幫助。
社群實測與技術補充筆記
自 6 則原始討論回帖中萃取 5 則高價值技術回應
這招太管用了,非常感謝!
我還研究出一個不用每次開機都手動把視窗最小化的方法:
用 TextMate(或任何純文字編輯器)開啟儲存好的 .trak(AU Lab 設定檔),捲動到最底部,將原本的:
<key>Window Frame</key>
<string>{{388, 40}, {355, 577}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{360, 540}</string>
修改為:
<key>Window Frame</key>
<string>{{1, 1}, {1, 1}}</string>
<key>Window Max</key>
<string>{2560, 1622}</string>
<key>Window Min</key>
<string>{1, 1}</string>
美中不足的是,如果在結束程式前沒有先手動關閉該設定檔,退出時會跳出閃退錯誤訊息;不過魚與熊掌不可兼得,這樣已經很方便了。
另一個更優雅的解決方案是使用與 Soundflower 同屬一間軟件公司開發的「Upmix」程式,但遺憾的是它不僅是付費軟件,而且售價高達近 500 美元!
版主編輯:抱歉 Ianxxx,我不小心誤刪了你貼文的前半段內容,請問方便重新補上嗎?萬分抱歉!
沒問題 :-) Ian
我特地註冊帳號就是為了上來向你道謝!我整整花了兩天時間研究怎樣讓我的 Mac 同時從兩張音效卡輸出聲音,真不敢相信在 OS X 下要做到這件事居然這麼困難。
超讚的教學 (Y),非常感謝!希望未來能出現更「乾淨俐落」的原生解決方案……目前看來 VoodooHDA 相當有希望。
@Diesa.) 完全行不通!無論我怎麼設定,聲音永遠只會從其中一個輸出介面發出——也就是排在聚集裝置清單最頂端的那個介面。
播放雙聲道立體聲(Stereo)音源時確實會這樣,因為 OS X 並沒有內置「喇叭填充」(Speaker Fill)選項,音訊只會被傳送到媒體來源所指定的對應獨立聲道(Discrete Channel)上。請問你有試過播放帶有 AC3 5.1 聲道的影片檔,並將 Perian 設為多聲道輸出嗎?另外,Apple 內置的「DVD 播放程式」只支援透過 S/PDIF(數碼輸出)輸出 5.1 環繞聲,若要走類比多聲道輸出則必須改用 VLC 播放器。
@Diesb.) 由於數碼輸出(Digital Out)在系統內不支援軟件音量控制,這意味著就算聚集裝置真的成功運作,我也完全無法透過軟件調整該裝置的音量。
S/PDIF 數碼輸出沒有軟件音量控制是很正常的吧?因為數碼輸出訊號並不會經過軟件層處理,而是直接原封不動地進行數碼直通(Pass-thru)輸出。
我自己是將 3 個類比音源輸出(Line-out)合併為一個 5.1 聲道的聚集裝置(晶片為 ALC888),但合併後同樣會失去軟件音量控制功能,我想這是 OS X「聚集裝置」本身的架構限制。
不過我自己摸索出一個小技巧,遇到相同問題的朋友可以按照以下步驟強制啟用軟件音量控制:
1) 先在「系統偏好設定」›「聲音」中,確保你打算使用的每一個獨立輸出介面音量都已調到最大。
2) 照常在「音訊 MIDI 設定」中建立聚集裝置,並配置好各個聲道對應的喇叭。
3) 使用 Soundflowerbed(Soundflower 附帶的選單列工具),將聚集裝置的 6 個聲道分別對應到 Soundflower (16ch) 的前 6 個聲道。
4) 將系統預設音效輸出設為 Soundflower (16ch),並在「音訊 MIDI 設定」中將其喇叭配置設為多聲道輸出。
5) 大功告成!現在你的 5.1 聲道系統就擁有完整的系統軟件音量控制功能了!
希望這招能幫到大家……
@mr_murderS/PDIF 數碼輸出沒有軟件音量控制是很正常的吧?因為數碼輸出訊號並不會經過軟件層處理,而是直接原封不動地進行數碼直通(Pass-thru)輸出。
從純技術角度來說,你說的當然沒錯,因為系統預設會假設負責接收解碼該數碼訊號的後端器材(或最終輸出裝置)本身就具備音量控制功能。
但是,至少就我的使用經驗而言,其他所有主流作業系統(無論是 Linux 還是 Windows)通常都會為系統內每一個可用的輸出介面提供軟件層級的音量控制功能。
特定輸出裝置的聲音延遲(不同步)問題
現在到了 OS X Lion,在「音訊 MIDI 設定」中建立「多重輸出裝置」(Multi-Output Device)讓多個介面同時發聲已經變得非常簡單了。
我的黑蘋果主機同時使用標準類比音源輸出(Line-out,連接至立體聲擴音機)以及 HDMI 音訊輸出(連接至 LG 液晶電視的內置小喇叭)。
但問題是,我的 LG 液晶電視那邊會有非常明顯的聲音延遲(回音感)。
我正在尋找一種能夠單獨為類比 Line-out 加上些許音訊延遲、而數碼輸出保持零延遲的解決方案,這樣兩邊的喇叭就能完全同步發聲了。
請問有人知道該怎麼做到嗎?
文獻來源與貢獻者溯源名錄(共 5 位具名成員 · 原始討論串 #1645)
| 成員用戶名 | 本卷貢獻角色 | 發帖數 | 活躍時間窗 |
|---|---|---|---|
| @Dies | 主筆作者 | 2 | 2008-11-28 → 2009-04-27 |
| @Ianxxx | 協作成員 | 1 | 2008-12-17 |
| @fahrvergnuugen | 協作成員 | 1 | 2009-04-03 |
| @mr_murder | 協作成員 | 1 | 2009-04-25 |
| @zorro23 | 協作成員 | 1 | 2011-11-13 |