Я воспроизводю одноканальный звук в режиме без чередования. Когда я записываю аудиоданные в динамик, у меня происходит отключение: 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)
Изменить: вот измерение буфера с использованием API snd_pcm_avail()
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
Вот результат, который запросил Марко:
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
snd_pcm_dump_sw_setup()
в свой код где-нибудь перед тем, как начнется звук, и поделиться с нами выводом консоли? - person marko   schedule 30.01.2013framesIn18Millisec
. Обратите внимание, что для звука CD-качества (частота дискретизации 44 100 Гц) должно быть 793,8 сэмпла за 18 мс. Хотя для частоты дискретизации 8 кГц было бы достаточно 144 семплов... - person twalberg   schedule 30.01.2013alsa_pcm_sw_param_*
иalsa_pcm_hw_param_*
являются «максимальными усилиями» — и вы не всегда получаете то, что хотите. Установка частоты дискретизации является одним из них. После установки параметров всегда имеет смысл проверить, что вы на самом деле получили. - person marko   schedule 30.01.2013