非インターリーブモードでシングルチャンネルオーディオを再生しています。スピーカーにオーディオデータを書き込んでいるときにアンダーランが発生しています:ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred
これが私が書く方法です:
printf("%d",snd_pcm_avail (spkhandle));
ret = snd_pcm_writen(spkhandle, pSpeakerBuf , framesIn18Millisec);
if(ret < 0)
{
snd_pcm_recover(spkhandle, ret, 0);
}
ALSAの実行を防ぐためのさまざまな方法/パラメーター構成は何ですか?
(私はLinux 3.0、ARMを使用しています)
編集:これはsnd_pcm_avail()APIを使用したバッファー測定です
snd_pcm_avail = 2304 << snd_pcm_writen call 1 success
snd_pcm_avail = 2160 << snd_pcm_writen call 2 success
snd_pcm_avail = 2016 << snd_pcm_writen call 3 success
snd_pcm_writen error -32 Broken pipe << snd_pcm_writen call 4 failure
ALSA lib pcm.c:7339:(snd_pcm_recover) underrun occurred << And displays this message
Markoが要求した出力は次のとおりです。
snd_output_t* out;
....
// Do alsa parameters init ....
....
snd_output_stdio_attach(&out, stderr, 0);
snd_pcm_dump_sw_setup(spkhandle, out);
tstamp_mode : NONE
period_step : 1
avail_min : 144
period_event : 0
start_threshold : 288
stop_threshold : 2304
silence_threshold: 0
silence_size : 0
boundary : 1207959552