このコードはタイトなループで実行され、snd_pcm_writen()
でブロックすることを意図していると思います .サンプルレートは指定されていません。数字はすべてきれいに割り切れるので、48kHz だと思います。
私がここで行っていると思うことは次のとおりです:
snd_pcm_write()
提供されたすべてのフレームを書き込むことを保証するものではありません (戻り値はエラー状態についてのみチェックされます)。snd_pcm_avail()
のログから判断 実際にはavail_min
を消費しています または144
それぞれにフレーム。これは 3 ミリ秒のオーディオです。- この時点でオーディオが実行されていないと仮定すると、2 回の書き込みの後、バッファ内のフレーム数は
start_threshold
になります。 -288
で サンプル;音声出力開始 printf()
の呼び出し ブロックして、snd_pcm_avail()
を覚えているようです オーディオ出力ハードウェアと同期する必要があり、ブロックする可能性もあります。再生より 6 ミリ秒進んでいるため、snd_pcm_writen()
の 3 回目の呼び出し時にバッファが枯渇している可能性は十分にあります。
要約すると、 printf()
を呼び出すべきではありません この時点で、おそらく snd_pcm_writen()
という事実を補う必要があります pSpeakerBuf
のすべてのフレームを消費していません