使用 M-Audio Audiophile USB 與 ALSA 和 Jack 的指南

v1.5

Thibault Le Meur <Thibault.LeMeur@supelec.fr>

本文件是關於將 M-Audio Audiophile USB (tm) 裝置與 ALSA 和 JACK 配合使用的指南。

歷史

  • v1.4 - Thibault Le Meur (2007-07-11)

  • v1.5 - Thibault Le Meur (2007-07-12) - 添加了 AC3/DTS 直通訊息

Audiophile USB 規格和正確用法

本部分提醒有關裝置功能和限制的重要事實。

該裝置有 4 個音訊介面和 2 個 MIDI 埠

  • 模擬立體聲輸入 (Ai)

    • 此埠支援 2 對線路電平音訊輸入(1/4 英寸 TS 和 RCA)

    • 連線 1/4 英寸 TS(插孔)聯結器時,RCA 聯結器將被停用

  • 模擬立體聲輸出 (Ao)

  • 數字立體聲輸入 (Di)

  • 數字立體聲輸出 (Do)

  • Midi 輸入 (Mi)

  • Midi 輸出 (Mo)

內部 DAC/ADC 具有以下特徵

  • 16 位或 24 位的取樣深度

  • 從 8kHz 到 96kHz 的取樣率

  • 兩個介面不能同時使用不同的取樣深度。

此外,Audiophile USB 文件給出了以下警告

在切換位深度之前,請退出所有正在執行的音訊應用程式

由於 USB 1.1 頻寬的限制,根據所選的音訊模式,可以同時啟用的介面數量有限

  • 16 位/48kHz ==> 4 個輸入通道 + 4 個輸出通道

    • Ai+Ao+Di+Do

  • 24 位/48kHz ==> 4 個輸入通道 + 2 個輸出通道,或 2 個輸入通道 + 4 個輸出通道

    • Ai+Ao+Do 或 Ai+Di+Ao 或 Ai+Di+Do 或 Di+Ao+Do

  • 24 位/96kHz ==> 2 個輸入通道 _或_ 2 個輸出通道(僅半雙工)

    • Ai 或 Ao 或 Di 或 Do

關於數字介面的重要事實:

  • Do 埠還支援環繞編碼的 AC-3 和 DTS 直通,儘管我尚未在 Linux 下對其進行測試

    • 請注意,在此設定中,只能啟用 Do 介面

  • 除了錄製音訊數字流之外,啟用 Di 埠還可以將裝置與外部取樣時鐘同步

    • 因此,僅當連線了有效的數字源時,才必須啟用 Di 埠

    • 在未連線數字源的情況下啟用 Di 可能會導致同步錯誤(例如,以奇怪的取樣率播放聲音)

ALSA 中的 Audiophile USB MIDI 支援

載入以下模組後,將自動支援 Audiophile USB MIDI 埠

  • snd-usb-audio

  • snd-seq-midi

無需其他設定。

ALSA 中的 Audiophile USB 音訊支援

Audiophile USB 裝置的音訊功能由 snd-usb-audio 模組處理。此模組可以在預設模式(沒有任何特定於裝置的引數)下工作,或者在具有稱為 device_setup 的特定於裝置的引數的“高階”模式下工作。

預設的 Alsa 驅動程式模式

snd-usb-audio 驅動程式的預設行為是在啟動時列出裝置的功能,並在應用程式需要時啟用所需的模式:例如,如果使用者正在以 24 位深度模式錄製,並且立即想切換到 16 位深度模式,則 snd-usb-audio 模組將動態地重新配置裝置。

這種方法的優點是可以讓驅動程式根據使用者的需求自動從取樣率/深度切換。但是,那些在 Windows 下使用該裝置的人都知道這不是該裝置的工作方式:在 Windows 下,必須先關閉應用程式,然後才能使用 m-audio 控制面板來切換裝置的工作模式。因此,正如我們將在下一節中看到的那樣,這種預設的 Alsa 驅動程式模式可能會導致裝置錯誤配置。

現在讓我們回到預設的 Alsa 驅動程式模式。在這種情況下,Audiophile 介面以以下方式對映到 alsa pcm 裝置(我假設裝置的索引為 1)

  • hw:1,0 是播放中的 Ao 和捕獲中的 Di

  • hw:1,1 是播放中的 Do 和捕獲中的 Ai

  • hw:1,2 是 AC3/DTS 直通模式下的 Do

在此模式下,裝置使用大端位元組編碼,因此支援的音訊格式為 S16_BE(對於 16 位深度模式)和 S24_3BE(對於 24 位深度模式)。

一個例外是 hw:1,2 埠,據報告它符合小端 (supposedly supporting S16_LE),但實際上僅處理 S16_BE 流。這已在核心 2.6.23 及更高版本中修復,現在在此預設驅動程式模式下,hw:1,2 介面據報告為大端。

示例

  • 將 S24_3BE 編碼的原始檔案播放到 Ao 埠

    % aplay -D hw:1,0 -c2 -t raw -r48000 -fS24_3BE test.raw
    
  • 從 Ai 埠錄製 S24_3BE 編碼的原始檔案

    % arecord -D hw:1,1 -c2  -t raw -r48000 -fS24_3BE test.raw
    
  • 將 S16_BE 編碼的原始檔案播放到 Do 埠

    % aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test.raw
    
  • 將 ac3 取樣檔案播放到 Do 埠

    % aplay -D hw:1,2 --channels=6 ac3_S16_BE_encoded_file.raw
    

如果您對預設的 Alsa 驅動程式模式感到滿意,並且沒有遇到任何問題,則可以跳過以下章節。

高階模組設定

由於上述硬體限制,Alsa 驅動程式在預設模式下進行的裝置初始化可能會導致裝置處於損壞狀態。例如,一個特別令人討厭的問題是,從 Ai 介面捕獲的聲音聽起來失真(好像音量增益過高)。

對於遇到此問題的人,snd-usb-audio 模組有一個新的模組引數,稱為 device_setup(此引數是在核心版本 2.6.17 中引入的)

初始化 Audiophile USB 的工作模式

就 Audiophile USB 裝置而言,此值允許使用者指定

  • 取樣深度

  • 取樣率

  • 是否使用 Di 埠

當使用 device_setup=0x00 初始化時,snd-usb-audio 模組的行為與省略引數時相同(請參閱上面的“預設 Alsa 驅動程式模式”段落)

以下小節中描述了其他模式。

16 位模式

支援的兩種模式是

  • device_setup=0x01

    • 停用 Di 的 16 位 48kHz 模式

    • 可以同時使用 Ai、Ao、Do

    • hw:1,0 在捕獲模式下不可用

    • hw:1,2 不可用

  • device_setup=0x11

    • 啟用 Di 的 16 位 48kHz 模式

    • 可以同時使用 Ai、Ao、Di、Do

    • hw:1,0 在捕獲模式下可用

    • hw:1,2 不可用

在這種模式下,裝置僅以 16 位模式執行。在核心 2.6.23 之前,裝置據報告為大端,但實際上它們是小端,因此播放檔案就是使用的問題

% aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test_S16_LE.raw

其中 “test_S16_LE.raw” 實際上是一個小端取樣檔案。

感謝 Hakan Lennestal(他發現了裝置在這些模式下的小端特性),已提交了修復程式(預計在核心 2.6.23 中),並且 Alsa 現在報告小端介面。因此,現在播放檔案就像使用一樣簡單

% aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_LE test_S16_LE.raw

24 位模式

支援的三種模式是

  • device_setup=0x09

    • 停用 Di 的 24 位 48kHz 模式

    • 可以同時使用 Ai、Ao、Do

    • hw:1,0 在捕獲模式下不可用

    • hw:1,2 不可用

  • device_setup=0x19

    • 啟用 Di 的 24 位 48kHz 模式

    • 可以同時使用來自 {Ai,Ao,Di,Do} 的 3 個埠

    • hw:1,0 在捕獲模式下可用,並且必須將有效的數字源連線到 Di

    • hw:1,2 不可用

  • device_setup=0x0D0x10

    • 24 位 96kHz 模式

    • 預設情況下,為此模式啟用了 Di,但不需要連線到有效的源

    • 一次只能使用來自 {Ai,Ao,Di,Do} 的 1 個埠

    • hw:1,0 在捕獲模式下可用

    • hw:1,2 不可用

在這些模式下,裝置僅符合大端(有關 aplay 命令示例,請參閱上面的“預設 Alsa 驅動程式模式”)

AC3 w/ DTS 直通模式

感謝 Hakan Lennestal,我現在有一份報告說此模式有效。

  • device_setup=0x03

    • 僅啟用 Do 埠的 16 位 48kHz 模式

    • AC3 與 DTS 直通

    • 請注意,在此設定中,Do 埠對映到 pcm 裝置 hw:1,0

用於在此模式下播放 AC3/DTS 編碼的 .wav 檔案的命令列

% aplay -D hw:1,0 --channels=6 ac3_S16_LE_encoded_file.raw

如何使用 device_setup 引數

可以給出引數

  • 透過手動探測裝置(以 root 身份):

    # modprobe -r snd-usb-audio
    # modprobe snd-usb-audio index=1 device_setup=0x09
    
  • 或者在模組配置檔案(通常是 /etc/modprobe.d/ 目錄中的 .conf 檔案)中配置模組選項時:

    alias snd-card-1 snd-usb-audio
    options snd-usb-audio index=1 device_setup=0x09
    

初始化裝置時的注意事項

  • 裝置上的正確初始化要求在開啟裝置電源之前將 device_setup 提供給模組。因此,如果您使用上面描述的“手動探測”方法,請注意在此初始化之後再開啟裝置電源。

  • 未能遵守此操作將導致裝置錯誤配置。在這種情況下,請關閉裝置電源,取消探測 snd-usb-audio 模組,然後使用正確的 device_setup 引數再次探測它,然後再(並且只能在此時)再次開啟裝置電源。

  • 如果您已在有效模式下正確初始化了裝置,然後想切換到另一種模式(可能具有另一種取樣深度),也請使用以下步驟

    • 首先關閉裝置電源

    • 登出 snd-usb-audio 模組 (modprobe -r)

    • 透過更改 /etc/modprobe.d/*.conf 中的 device_setup 選項來更改 device_setup 引數

    • 開啟裝置電源

  • 已將針對此最後一個問題的解決方法應用於核心 2.6.23,但這可能不足以確保裝置初始化的“穩定性”。

適用於駭客的技術細節

本節適用於想要了解裝置內部結構以及 Alsa 如何支援它的駭客。

Audiophile USB 的 device_setup 結構

如果您想了解 Audiophile USB 的 device_setup 神奇數字,則需要對二進位制計算有一些非常基本的瞭解。但是,這不是使用該引數所必需的,您可以跳過本節。

device_setup 是一個位元組長,其結構如下

+---+---+---+---+---+---+---+---+
| b7| b6| b5| b4| b3| b2| b1| b0|
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | Di|24B|96K|DTS|SET|
+---+---+---+---+---+---+---+---+

其中

  • b0 是 SET

    • 如果初始化 device_setup,則必須設定它

  • b1 是 DTS

    • 僅針對具有 DTS/AC3 的數字輸出設定它

    • 未測試此設定

  • b2 是速率選擇標誌

    • 當設定為 1 時,速率範圍為 48.1-96kHz

    • 否則,取樣率範圍為 8-48kHz

  • b3 是位深度選擇標誌

    • 當設定為 1 時,取樣為 24 位長

    • 否則,它們為 16 位長

    • 請注意,b2 意味著 b3,因為僅 24 位取樣支援 96kHz 模式

  • b4 是數字輸入標誌

    • 當設定為 1 時,裝置假定已連線有效的數字源

    • 如果在埠上看不到任何源,則不應啟用 Di(這會導致同步問題)

    • b4 由 b2 隱含(因為一次只能啟用一個埠,因此不會發生同步錯誤)

  • b5 到 b7 保留供將來使用,必須設定為 0

    • 對於 b7、b6、b4,可能分別變為 Ao、Do、Ai

注意事項

  • 沒有檢查您將給 device_setup 的值

    • 例如,選擇 0x05 (16bits 96kHz) 將回退到 0x09,因為 b2 意味著 b3。但是 /var/log/messages 中_不會_有_任何_警告

  • 由於 USB 匯流排限制導致的硬體約束未經過檢查

    • 選擇 b2 將準備好所有介面以進行 24 位/96kHz,但您一次只能使用一個介面

此裝置的 USB 實現細節

如果您對驅動程式駭客不感興趣,可以安全地跳過本節。

本節介紹裝置的一些內部結構,並總結了透過 usb-snooping Windows 和 Linux 驅動程式獲得的資料。

M-Audio Audiophile USB 有 7 個 USB 介面:一個“USB 介面”

  • USB 介面編號 0

  • USB 介面編號 1

    • 音訊控制功能

  • USB 介面編號 2

    • 模擬輸出

  • USB 介面編號 3

    • 數字輸出

  • USB 介面編號 4

    • 模擬輸入

  • USB 介面編號 5

    • 數字輸入

  • USB 介面編號 6

    • 符合 MIDIMAN 怪癖的 MIDI 介面

每個介面都有 5 個備用設定(AltSet 1,2,3,4,5),除了

  • 介面 3(數字輸出)有一個額外的 Alset 編號 6

  • 介面 5(數字輸入)沒有 Alset 編號 3 和 5

以下是 AltSettings 功能的簡短說明

  • AltSettings 1 對應於

    • 24 位深度,48.1-96kHz 取樣模式

    • 自適應播放(Ao 和 Do),同步捕獲(Ai)或非同步捕獲(Di)

  • AltSettings 2 對應於

    • 24 位深度,8-48kHz 取樣模式

    • 非同步捕獲和播放(Ao,Ai,Do,Di)

  • AltSettings 3 對應於

    • 24 位深度,8-48kHz 取樣模式

    • 同步捕獲(Ai)和自適應播放(Ao,Do)

  • AltSettings 4 對應於

    • 16 位深度,8-48kHz 取樣模式

    • 非同步捕獲和播放(Ao,Ai,Do,Di)

  • AltSettings 5 對應於

    • 16 位深度,8-48kHz 取樣模式

    • 同步捕獲(Ai)和自適應播放(Ao,Do)

  • AltSettings 6 對應於

    • 16 位深度,8-48kHz 取樣模式

    • 同步播放 (Do),音訊格式型別 III IEC1937_AC-3

為了確保裝置的正確初始化,驅動程式_必須_知道裝置將如何使用

  • 如果選擇了 DTS,則必須僅註冊具有 AltSet 編號 6 的介面 2

  • 如果 96KHz 僅必須選擇每個介面的 AltSets 編號 1

  • 如果取樣使用 24bits/48KHz,則如果連線了數字輸入,則必須使用 AltSet 2,如果未連線數字輸入,則僅使用 AltSet 編號 3

  • 如果取樣使用 16bits/48KHz,則如果連線了數字輸入,則必須使用 AltSet 4,如果未連線數字輸入,則僅使用 AltSet 編號 5

當將 device_setup 作為引數提供給 snd-usb-audio 模組時,parse_audio_endpoints 函式使用一個稱為 audiophile_skip_setting_quirk 的怪癖,以防止與 device_setup 不對應的 AltSettings 在驅動程式中註冊。

Audiophile USB 和 Jack 支援

本節處理 Jack 中對 Audiophile USB 裝置的支援。

將 Jackd 與該裝置一起使用時,存在 2 個主要的潛在問題

  • 支援 24 位模式下的大端裝置

  • 支援 4 輸入/4 輸出通道

在 Jackd 中直接支援

僅在最新版本中,Jack 支援大端裝置(感謝 Andreas Steinmetz 提供的第一個大端補丁)。我不記得確切的釋出時間,就說使用 jackd 版本 0.103.0 幾乎可以正常工作(只是一個小錯誤影響 16 位大端裝置,但是由於您仔細閱讀了上面的段落,因此您現在正在使用核心 >= 2.6.23,並且您的 16 位裝置現在是小端了 ;-))。

您可以使用以下命令執行 jackd,以使用 Ao 進行播放和使用 Ai 進行錄製

% jackd -R -dalsa -Phw:1,0 -r48000 -p128 -n2 -D -Chw:1,1

使用 Alsa plughw

如果您沒有安裝最新的 Jackd,則可以降級為使用 Alsa plug 轉換器。

例如,這是一種在 Ao 上使用 2 個播放通道和從 Ai 使用 2 個捕獲通道執行 Jack 的方法

% jackd -R -dalsa -dplughw:1 -r48000 -p256 -n2 -D -Cplughw:1,1
但是,您可能會看到以下警告訊息

您似乎正在使用 ALSA 軟體“plug”層,這可能是使用“default”ALSA 裝置的結果。這不如它可能的那樣有效。考慮使用硬體裝置而不是使用 plug 層。

在 Jack 中獲取 2 個輸入和/或輸出介面

如您所見,以這種方式啟動 Jack 伺服器將僅啟用 1 個立體聲輸入(Di 或 Ai)和 1 個立體聲輸出(Ao 或 Do)。

這是由於以下限制

  • Jack 一次只能開啟一個捕獲裝置和一個播放裝置

  • Audiophile USB 被視為 2 個(或 3 個)Alsa 裝置:hw:1,0, hw:1,1(以及可選的 hw:1,2)

如果您想獲得具有 Jack 的 Ai+Di 和/或 Ao+Do 支援,則需要將 Alsa 裝置組合成一個邏輯的“複雜”裝置。

如果您想嘗試一下,我建議閱讀此頁面中的資訊:http://www.sound-man.co.uk/linuxaudio/ice1712multi.html 它與另一個裝置 (ice1712) 相關,但可以進行調整以適合 Audiophile USB。

為 Jackd 啟用多個 Audiophile USB 介面肯定需要

  • 確保您的 Jackd 版本具有 MMAP_COMPLEX 補丁(請參閱 ice1712 頁面)

  • (可能)修補 alsa-lib/src/pcm/pcm_multi.c 檔案(請參閱 ice1712 頁面)

  • 在您的 .asoundrc 檔案中定義一個多裝置(hw:1,0 和 hw:1,1 的組合)

  • 使用此裝置啟動 jackd

到目前為止,我還沒有成功地對此進行測試,如果您在此類設定中獲得任何成功,請給我傳送電子郵件。