Arch-Linux

短音頻播放已靜音,需要在後台預熱或輔助音頻

  • May 31, 2021

我注意到這發生在我的 ArchLinux PC 和我的 ArchLinux MacBook 中。我需要通過短音來獲取應用程序通知,並且我發現這不是由於通知應用程序而是系統本身的問題,並且它發生在兩個截然不同的系統中。

當我播放一個簡短的音頻文件時,就像paplay /usr/share/sounds/freedesktop/stereo/message.oga我第一次播放時聽不見一樣。

如果我按順序再次播放它,我會聽到它並且播放正確,我總是按順序重複它。

如果我等待大約 10 秒再播放一次,它就會靜音(就像開始時一樣):只有在熱身時才會響起。

相同的情況發生在aplay /usr/share/sounds/alsa/Front_Left.wav,但由於它的音調較長,因此問題僅發生在文件的開頭。起初我只聽到“t left”,缺少“fron”。之後我完整而清晰地聽到它:“左前”。如果我等待 10 秒,則再次“離開”。

如果我在媒體播放器的後台播放音樂文件,則不會發生此問題。僅當電腦不播放任何聲音時才會發生。

如何解決這個問題?(除了讓 PC 在後台的守護程序中播放聽不見的聲音以使其始終處於預熱狀態)

僅使用 alsa 問題仍然存在的相關測試會話:

~ ❯❯❯ sudo mv /usr/bin/pulseaudio /usr/bin/pulseaudio.bak
~ ❯❯❯ pulseaudio.bak --kill
W: [pulseaudio.bak] main.c: Couldn't canonicalize binary path, cannot self execute.
~ ❯❯❯ paplay /usr/share/sounds/freedesktop/stereo/message.oga
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
~ ❯❯❯ ps axu | grep -i pulse
francis+ 31563  0.0  0.0  10796  2144 pts/2    S+   14:35   0:00 grep --color=auto -i pulse

~ ❯❯❯ aplay -D plughw:0,7 /usr/share/sounds/alsa/Front_Left.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: Generic Analog [Generic Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: Generic Digital [Generic Digital]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
~ ❯❯❯ lspci -nn | grep -i audio
00:1f.3 Audio device [0403]: Intel Corporation Device [8086:a2f0]

更新

Linux 核心 4.11.2 之後,ALC1220 編解碼器在

~ ❯❯❯ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC1220 Analog [ALC1220 Analog]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC1220 Digital [ALC1220 Digital]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
 Subdevices: 1/1
 Subdevice #0: subdevice #0

我已經連接了我的耳機並設法重現了這個問題,aplay但使用方式不同:

~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/alsa/Front_Left.wav
~ ❯❯❯ aplay -D plughw:0,0 /usr/share/sounds/purple/alert.wav
...

我必須播放位於不同目錄中的不同音頻文件,如果播放一個播放然後另一個播放之間的間隔無關緊要,則兩個播放都會在開始時被剪切。如果一個文件播放一次,之後再播放同一目錄中的文件不會重現問題,也不會等待它“冷卻”(我已經等了 1 分鐘)。paplay打開pulseaudio時也會發生同樣的情況。通過 HDMI 播放時,它會在兩個測試案例中重現。

更新 2

雖然我很懶惰,但我還沒有向 ALSA 開發人員報告這個問題,但是,我創建了一個使用者 systemd 單元

[Unit]
Description=Continuous silence

[Service]
ExecStart=/usr/bin/play -qn

[Install]
WantedBy=default.target

只需將其保存到~/.config/systemd/user/continuous-silence.service並使用systemctl --user enable continuous-silence.

假設接收聲音系統需要在輸出聲音之前“喚醒”,並且它只接收到初始批次的聲音數據後才這樣做,如果這在接收聲音系統中無法修復,則丟棄第一批,一種解決方法是連續輸出靜音,例如使用playfrom sox

play -n

編輯

有了它在 Windows 上工作的附加資訊,以及音效卡(“英特爾公司設備”)和編解碼器(“通用”)都無法通過名稱辨識的資訊,也可能是一些驅動程序問題。編解碼器中有一個“保持活動啟用”(KAE)位,可能需要設置,可能由混音器控制,但我對此知之甚少。

向 ALSA 開發人員送出錯誤,提供lspci -nn資訊和cat /proc/asound/card*/codec\#*. (您也可以將後者的輸出放入 pastebin 並使用連結編輯您的問題,以便我查看)。

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