Raspberry Pi ZeroのI2S DACとポップノイズの関係 その3 MUTE制御の動き
概要
- NosPiDAC Zeroなどで音楽を楽しんでいるときに気になるポップノイズについて調べたこと・やったことをメモ。
- ちょっと時間が空いてしまいましたが、その3ではALSA SoCのCallbackを追っかけたメモを置いておきます。
調査
- まずはsoc_pcm階層からのコールシーケンスを作成しました。
- sound/soc/soc_pcm.cからdaiやcodecのcallbackを呼び出しています
適当にdev_infoを埋めてMoodeAudioで再生・次曲送り・停止しdmesgから拾いあげてます。
digital_muteがcodec側にcallbackされるMUTE制御です。0で解除、1でミュートのActive High論理。
- MUTE制御とクロック制御の関連を確認し、効果があるか検証します。
MUTE関連の動き シーケンス
- アクション 再生開始
- soc_pcm_open
- startup
- stop_clock
- startup
- soc_pcm_hw_params
- hw_params bclk算出・サンプリングレート設定
- start_clock
- hw_params bclk算出・サンプリングレート設定
- soc_pcm_prepare
- prepare
- digital_mute 0 mute release
- soc_pcm_trigger
- trigger 1 再生開始 1曲目
- start_clock
- trigger 1 再生開始 1曲目
- soc_pcm_trigger
- trigger 0 再生停止
- stop
stop_clockdai->active
- stop
- trigger 0 再生停止
- アクション 次曲送り
- soc_pcm_prepare
- prepare
- digital_mute 0 mute release
- soc_pcm_trigger
- trigger 1 再生開始 2曲目
- start_clock
- trigger 1 再生開始 2曲目
- soc_pcm_trigger
- trigger 0 再生停止
- stop
stop_clockdai->active
- stop
- trigger 0 再生停止
- アクション 次曲送り サンプリングレート変更
- soc_pcm_close
- digital_mute 1 mute
- shutdown
- stop
stop_clockcontinuos clock
- stop_clock
- stop
- soc_pcm_open
- startup
- soc_pcm_hw_params
- hw_params サンプリングレート設定
- soc_pcm_prepare
- prepare
- digital_mute 0 mute release
- soc_pcm_trigger
- trigger 1 start_clock 再生開始 3曲目
- soc_pcm_trigger
- trigger 0 再生停止
- stop
stop_clockdai->active
- stop
- trigger 0 再生停止
- soc_pcm_close
- digital_mute 1 mute
- shutdown
- stop
stop_clockcontinuos clock
- stop_clock
- stop
- 再生停止
確認結果
クロック制御周り
- stop_clockの呼び出し場所を追っかけると、shutdown時以外はstop_clockしてなさそう。
- digital_mute 1でMute解除前にstart_clockしてるので、外部Muteではポップを防げそうに見える。
次曲送り時はクロック出っ放しにログ上では見える
サンプリングレートが変わるときはclose->openしているようで、shutdownまで走っている
SND_SOC_DAIFMT_CONT(continuous clock)フラグを立てても、shutdownではstop_clockする
- trigger 0 のstop_clockはSND_SOC_DAIFMT_CONTフラグを立てなくてもdai->activeが有効なのでstop_clockしない。
- shutdownでは、SND_SOC_DAIFMT_CONTフラグを立てるとstop関数ではstop_clockしないが、最終的にstop_clockを直接呼んでるので意味無い
- 最初の曲やサンプリングレートが変わった後の一発目はポップノイズが出そうです。
でもポップノイズは出ている。TXONのオフ/オンのタイミングで出ている?