Audio

音效卡和 HDMI 都使用 Intel HDA 驅動程序時聲音不工作。如何交換他們的設備載入順序?

  • April 14, 2017

我有一個 Acer Aspire One 522 上網本,它有一個基於 Conexant CX20584 晶片組的 Intel HDA 音效卡。儘管 KDE 在啟動時確實會輸出聲音,但 flash 和可能許多其他尋找/dev/dsp設備的應用程序都無法通過它輸出聲音,從而呈現出幾乎無用的多媒體體驗。

當我檢查我的 ALSA 播放設備時aplay -l,我可以看到主音頻設備被辨識為卡 1 而不是 0,它被連接到 HDMI:

**** List of PLAYBACK Hardware Devices ****
card 0: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: SB [HDA ATI SB], device 0: CONEXANT Analog [CONEXANT Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0

這樣我得到了一個/dev/dsp1,但似乎大多數應用程序只是硬編碼才能使用/dev/dsp,所以我去尋找某種交換卡索引的方法。在通過 ALSA 文件進行一些研究後,我嘗試使用此/etc/modprobe.d/asound.conf文件為 HDMI 和 Intel HDA 使用的驅動模組分配索引:

options snd cards_limit=2
options snd-hda-codec-conexant index=0
options snd-hda-codec-hdmi index=1
options snd slots=snd-hda-codec-conexant,snd-hda-codec-hdmi

但這並沒有奏效,並且基於我對答案的無盡追求中的一些被遺忘的連結,這似乎是因為這些index指令應該協調模組載入順序,但是這些科勝訊和 HDMI 編解碼器碰巧使用相同的英特爾 HDA驅動模組,所以它似乎不適用於這種情況。

也就是說,當設備使用相同的 ALSA 驅動程序模組(在這種情況下為英特爾 HDA)時,有什麼方法可以定義正確的卡索引?

我終於根據另一個論壇的這篇文章找到了這個問題的答案(參見“嘗試1b”以供參考)。根據它,即使使用的驅動程序相同,也可以指定模組ID:

alias char-major-116 snd
alias snd-card-0 snd-hda-intel
alias snd-card-1 snd-hda-intel

options snd cards_limit=2

options snd-hda-intel id=SB index=0
options snd-hda-intel id=HDMI index=1

從而產生正確的卡片順序並按預期進行正確的工作:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: SB [HDA ATI SB], device 0: CONEXANT Analog [CONEXANT Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: HDMI [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
 Subdevices: 1/1
 Subdevice #0: subdevice #0

對於其他類似情況,您可以檢查/proc/asound卡片的符號連結,它們將是您想要的模組 ID:

$ ls -l /proc/asound/
total 0
lrwxrwxrwx 1 root root 5 Jan 26 19:19 HDMI -> card1
lrwxrwxrwx 1 root root 5 Jan 26 19:19 SB -> card0
dr-xr-xr-x 4 root root 0 Jan 26 19:19 card0
dr-xr-xr-x 3 root root 0 Jan 26 19:19 card1
-r--r--r-- 1 root root 0 Jan 26 19:19 cards
-r--r--r-- 1 root root 0 Jan 26 19:19 devices
-r--r--r-- 1 root root 0 Jan 26 19:19 hwdep
-r--r--r-- 1 root root 0 Jan 26 19:19 modules
dr-xr-xr-x 2 root root 0 Jan 26 19:19 oss
-r--r--r-- 1 root root 0 Jan 26 19:19 pcm
dr-xr-xr-x 2 root root 0 Jan 26 19:19 seq
-r--r--r-- 1 root root 0 Jan 26 19:19 timers
-r--r--r-- 1 root root 0 Jan 26 19:19 version

引用自:https://unix.stackexchange.com/questions/62683