Pulseaudio

PulseAudio 耳機問題

  • September 21, 2016

像傳統一樣,我在使用pulseaudio時遇到了一些麻煩。

當我進入 X (DWM) ,執行 google-chrome 並前往 youtube.com 並播放影片時,耳機無法工作,聲音斷斷續續。

speaker-test -c 2 -t wav -D plughw:2,0導致:播放打開錯誤:-16,設備或資源忙

當我重新啟動 X(註銷 -> 登錄)時,瀏覽器中的音頻開始神奇地工作。

**** 播放硬體設備列表 ****

card 0: PCH [HDA Intel PCH], device 0: ALC898 Analog [ALC898 Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC898 Digital [ALC898 Digital]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 2 [HDMI 2]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 3 [HDMI 3]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 2: Device [USB Sound Device], device 0: USB Audio [USB Audio]
 Subdevices: 1/1
 Subdevice #0: subdevice #0

我不知道發生了什麼,下面是我從**/var/log/messages收到的消息**

首次登錄

Mar 11 20:07:31 qwerty pulseaudio[1223]: [pulseaudio] alsa-mixer.c: Volume element Speaker has 8 channels. That's too much
Mar 11 20:07:31 qwerty pulseaudio[1223]: [pulseaudio] alsa-mixer.c: Volume element Speaker has 8 channels. That's too much
Mar 11 20:07:31 qwerty pulseaudio[1223]: [pulseaudio] alsa-mixer.c: Volume element Speaker has 8 channels. That's too much
Mar 11 20:07:31 qwerty pulseaudio[1223]: [pulseaudio] alsa-mixer.c: Volume element Speaker has 8 channels. That's too much
Mar 11 20:07:31 qwerty pulseaudio[1223]: [pulseaudio] alsa-mixer.c: Volume element Speaker has 8 channels. That's too much
Mar 11 20:07:44 qwerty org.a11y.Bus[1007]: Activating service name='org.a11y.atspi.Registry'
Mar 11 20:07:44 qwerty org.a11y.Bus[1007]: Successfully activated service 'org.a11y.atspi.Registry'
Mar 11 20:07:44 qwerty org.a11y.atspi.Registry[1288]: SpiRegistry daemon is running with well-known name - org.a11y.atspi.

第二次登錄

Mar 11 20:08:01 qwerty org.gtk.vfs.Daemon[1007]: A connection to the bus can't be made
Mar 11 20:08:01 qwerty org.gtk.vfs.Daemon[1007]: g_dbus_connection_real_closed: Remote peer vanished with error: Underlyin on an async read (g-io-error-quark, 0). Exiting.
Mar 11 20:08:01 qwerty org.a11y.Bus[1007]: g_dbus_connection_real_closed: Remote peer vanished with error: Underlying GIOS async read (g-io-error-quark, 0). Exiting.
Mar 11 20:08:01 qwerty org.a11y.atspi.Registry[1288]: g_dbus_connection_real_closed: Remote peer vanished with error: Undebytes on an async read (g-io-error-quark, 0). Exiting.
Mar 11 20:08:02 qwerty org.a11y.Bus[1007]: No protocol specified
Mar 11 20:08:17 qwerty org.a11y.Bus[1349]: Activating service name='org.a11y.atspi.Registry'
Mar 11 20:08:17 qwerty org.a11y.Bus[1349]: Successfully activated service 'org.a11y.atspi.Registry'
Mar 11 20:08:17 qwerty org.a11y.atspi.Registry[1539]: SpiRegistry daemon is running with well-known name - org.a11y.atspi.

Asound.conf

pcm.pulse {
   type pulse
}

ctl.pulse {
   type pulse
}

pcm.!default {
   type pulse
}

ctl.!default {
   type pulse
}

ALSA 資訊腳本 v 0.4.64 的輸出

http://www.alsa-project.org/db/?f=5290b8d86207b2cba3c1e4854fea0399e7fdb9f7

如果我繼續殺死所有正在執行的pulseaudio程序,然後執行

speaker-test -c 2 -t wav -D plughw:2,0音頻有效,但顯然不在瀏覽器中。

現在我有兩個選擇,刪除 pulseaudio 並嘗試通過環境變數設置 PCM_DEVICE,這也是 a** 中的一個痛苦,或者嘗試將這個 pulseaudio s*** 排序出來……我寧願花在其他地方的時間。

我不想嘗試通過修復pulseaudio的問題來解決它,因為這個問題只是從無處浮出水面,我不知道我安裝的哪個包破壞了這個,但我沒有更改配置文件中的任何內容,而這個問題就突然出現了。

我為解決這個問題所做的是完全刪除pulseaudio。

apt-get --purge remove pulseaudio*
rm -r ~/.config/pulse

改回我的舊 alsa asound.conf文件並添加了設備環境變數的輸入。

/ETC/ASOUND.CONF

defaults.pcm.!card Device
defaults.ctl.!card Device
defaults.pcm.!device { 
       @func igetenv  
               vars [ ALSA_PCM_DEVICE ]  
               default 0 
}

有用!(“設備”是我的 USB 卡的名稱)

切換到具有多個音頻輸出設備的卡時,我必須設置環境變數。

命令:> ALSA_PCM_CARD=CARD ALSA_PCM_DEVICE=DEVICE firefox

我無法在不將 ALSA_PCM_DEVICE 添加到 asound.conf 的情況下對其進行設置,儘管它在/usr/share/alsa/alsa.conf.

原因是 plughw 使用 ALSA_PCM_DEVICE,如果未設置,則回退到 defaults.pcm.device,而 dmix(/usr/share/alsa/pcm/dmix.conf)僅使用 defaults.pcm.device,而不檢查 ALSA_PCM_DEVICE

這就是為什麼您必須明確重新定義 defaults.pcm.!device 以使其檢查 ALSA_PCM_DEVICE 環境變數

編輯*(IRC 上的總結對話 - ALSA 環境變數)*

除非您有一些不尋常的嵌入式設備/驅動程序。

Alsa 應該提供類似的“預設”=plug->dmix->hw 播放鏈。

它應該開箱即用,根本沒有 ~/.asoundrc。

預設情況下,鏈在卡 0 設備 0 上結束。

或者,從技術上講,它:(1)預設為卡 ALSA_PCM_CARD 環境,如果未設置(2)預設為 ALSA_CARD env.variable,如果未設置(3)預設為“defaults.pcm.card”alsa 變數,如果是未設置 (4) 預設為卡 0。

因此,例如,要讓所有應用程序播放到名為“PCH”的音效卡,您只需要在 ~/.asoundrc(僅限您的使用者)或 /etc/asound.conf(所有使用者)中添加 2 行:

defaults.pcm.!card PCH

defaults.ctl.!card PCH

要覆蓋它並播放名為“耳機”的卡,您可以將應用程序執行為:env ALSA_CARD=Headset some-app-here. cat /proc/asound/cards您可以在或aplay -l輸出中看到卡名。從技術上講,您也可以使用卡號 ( env ALSA_CARD=2 some-app-here),但重新啟動時數字可能會發生變化,因此通常最好使用名稱。

編輯*(IRC 上的總結對話 - PulseAudio)*

Pulseaudio 的做法不同。它沒有添加中間模組,而是添加了一個全域 pulseaudio 守護程序,並且該守護程序直接播放“hw”pcm。所有其他應用程序都應該播放該守護程序,因為當它執行時,沒有其他人可以播放“hw”。這就是為什麼我有“設備或資源很忙”。

所以一個典型的pulseaudio播放鍊是default=“type pulse” module -> pulseaudio daemon -> hw。您不應該將“hw”或“plughw”或“dmix”與pulseaudio一起使用——它們不能一起工作。相反,我應該定義 pcm.!default { type pulse } (實際上 pulseaudio 通常會自動為您執行此操作)

安裝 pulseaudio 後,您只需要 pcm.!default { type pulse }。在大多數發行版中,pulseaudio 會自動執行此操作。(在archlinux上它被打包為一個單獨的“pulseaudio-alsa”包,它基本上只有這個alsa配置,沒有別的)

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