Linux(Debian)のHDMIオーディオ出力でクラックやポップが発生します。

Linux(Debian)のHDMIオーディオ出力でクラックやポップが発生します。

問題の説明

Linuxのインストールでは、オーディオが正しく機能するように努めています。ただし、オーディオ信号がゼロになるたびに約0.5秒間だけでも戻ってくると、スピーカーからカチッと音がします。これは、キャラクターが話し始めたり停止したり、音楽の再生が一時停止または再開されるたびにクリック音が発生する連続的な背景ノイズなしでソースを聴くときに最も顕著です。典型的な現代映画は決して完全に緑豊かではありませんが、トークショーやプッシュトゥトーク(PTT)音声通信ソフトウェアなどの特定の種類のコンテンツは完全に壊れています。

システムハードウェアとソフトウェアの設定

Intel i5プロセッサを搭載したメディアPCを作成しました。マザーボードはASUS Prime B560M-Aで、ディスプレイはLG CXシリーズOLEDです。私はDebianテスト(Bullseye)とDebianのデフォルト値であるPulseaudioを使用しています。

サウンドはHDMI1を介して送信され、テレビはオーディオリターンチャンネル(ARC)を介してHarman Kadron AVR(171S)に転送します。 Pulseaudio出力モードは「HDMI1デジタルステレオ」で、マルチパススルーオーディオフォーマットをサポートします。

問題の分離と推定の原因

Debianのオーディオシステムのスリープ(または他の)機能は、完全なサイレントが検出されるとすぐにオーディオ信号をブロックするようです。これにより、AVRがオーディオ出力をオフにし、クリック音が発生します。音が再び出る時も同様です。

AVRのオーディオフォーマットインジケータを見ると、これを確認できます。アンプからソースに切り替えると、受信しているフォーマットが表示されます。信号がある場合、AVRは「2/0/0 48kHz ARC」(標準PCMの場合)または3/2/1 48kHz ARC(DTSの場合)を表示します。 Debianでは、ボリュームがゼロのときにいつでもARC入力に切り替えると、受信機に信号がまったくないことを示す「---ARC」が表示されます。信号が実際にゼロに達するとすぐに終了するようです。

これがLinux/Debianの問題であるかどうかはどうすればわかりますか?

この時点ではまだオプションがあります。 0 のみ受信すると AVR 自体が終了し、0 のみ受信するとテレビが信号伝送を中断した可能性があります。しかし、最も簡単なパススルーモードのテレビを使用してPlaystation 4コンソールを使用して同じ設定をテストできました。問題はDebianでのみ発生しました。

同じ状況でPS4に音がまったく聞こえない場合、AVRはまだ「2/0/0 ARC」を報告します。オーディオの再生が停止または再開されても、カチッと音やパンが鳴りません。つまり、PS4ではオーディオ信号は完全に中断されません。

私は何を試みたか。

私はこのサイトとインターネット全体で同様の問題を抱えている人を検索し、次の提案を見つけました。

値が0に設定されました。

/sys/module/snd_hda_intel/parameters/power_save

Nに設定されています。

/sys/module/snd_hda_intel/parameters/power_save_controller

次の変更は永久に適用されました。

root@mycomputername|/etc/modprobe.d:cat audio_disable_powersave.conf
options snd-hda-intel power_save=0 power_save_controller=N

いくつかの場所では、パルスオーディオの無音アイドル受信機をオフにします。

/etc/pulse/default.pa
/etc/pulse/system.pa

この行をコメントアウトすると:

### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle

この変更後、Pulseaudioが再起動されました。

また、HDMI出力モジュールで自動ストリーミングをYに設定して有効にしました。

/sys/module/snd_hda_codec_hdmi/parameters/enable_silent_stream

上記のモジュール設定と同じ方法で永久に作成されます。

また、Alsamixerの「自動ミュートモード」を無効にしましたが、ヘッドフォンジャックに関連していると思うので、何もしないでください。

一部の情報源はまた、信号を維持するためにaplayを介してゼロ文字列を送信することを提案しています。私はこれを使ってこれをしました。

aplay /dev/zero -f S16_LE

上記のどれも効果がありませんでした。一時停止を押すと常にクリック音が鳴り、出力に沈黙があると常にクリック音が発生します。その後、AVR信号パターンを確認すると、常に信号がまったく受信されていないことがわかりました。

私は完全に精神的に行き、他の方法を試す方法を思い出せず、実際にこの問題を見つけた人の助けに心から感謝します。

答え1

結局、満足のいく答えが見つからず、AVRの自動化のためか、私の状況に合った良い解決策もないようです。 PS4が信号をアクティブに保つことができる理由は不明ですが、少なくとも次の機能は同じ効果を持ちます。

/usr/bin/play -qn synth sin 10 gain -191

私のスピーカーの感度と低いカットオフ周波数より低いです。この機能を有効にすると、ポップ音を聞かずに音楽を一時停止できます。

(編集):誰もより良いソリューションを提供していないので、この答えを受け入れます。さらに、回答をより一般的に役立つようにするには、信号出力データ型が32ビットではなく16ビットの場合は、以下を使用することに注意する価値があります。

/usr/bin/play -qn synth sin 10 gain -95

関連情報