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関連の動き シーケンス

  1. アクション 再生開始
  2. soc_pcm_open
    1. startup
      1. stop_clock
  3. soc_pcm_hw_params
    1. hw_params bclk算出・サンプリングレート設定
      1. start_clock
  4. soc_pcm_prepare
    1. prepare
    2. digital_mute 0 mute release
  5. soc_pcm_trigger
    1. trigger 1 再生開始 1曲目
      1. start_clock
  6. soc_pcm_trigger
    1. trigger 0 再生停止
      1. stop
        1. stop_clock dai->active
  7. アクション 次曲送り
  8. soc_pcm_prepare
    1. prepare
    2. digital_mute 0 mute release
  9. soc_pcm_trigger
    1. trigger 1 再生開始 2曲目
      1. start_clock
  10. soc_pcm_trigger
    1. trigger 0 再生停止
      1. stop
        1. stop_clock dai->active
  11. アクション 次曲送り サンプリングレート変更
  12. soc_pcm_close
    1. digital_mute 1 mute
    2. shutdown
      1. stop
        1. stop_clock continuos clock
      2. stop_clock
  13. soc_pcm_open
    1. startup
  14. soc_pcm_hw_params
    1. hw_params サンプリングレート設定
  15. soc_pcm_prepare
    1. prepare
    2. digital_mute 0 mute release
  16. soc_pcm_trigger
    1. trigger 1 start_clock 再生開始 3曲目
  17. soc_pcm_trigger
    1. trigger 0 再生停止
      1. stop
        1. stop_clock dai->active
  18. soc_pcm_close
    1. digital_mute 1 mute
    2. shutdown
      1. stop
        1. stop_clock continuos clock
      2. stop_clock
  19. 再生停止

確認結果

クロック制御周り

  • 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のオフ/オンのタイミングで出ている?