我正在学习如何使用ALSA轮询/等待填充声卡缓冲区。我想知道Paul Davis(JACK的作者)2002年名为“最小中断驱动程序”的示例代码在今天是否仍然有效:
http://equalarea.com/paul/alsa-audio.html
我还读到过snd_pcm_wait()使用poll()系统调用,所以应该可以。不使用系统调用的snd_pcm_avail_update()会返回正确的帧数,因为它是在snd_pcm_wait()之后调用的(这可能会更新缓冲区的状态)吗?
while (1) {
/* wait till the interface is ready for data, or 1 second
has elapsed.
*/
if ((err = snd_pcm_wait (playback_handle, 1000)) < 0) {
fprintf (stderr, "poll failed (%s)\n", strerror (errno));
break;
}
/* find out how much space is available for playback data */
if ((frames_to_deliver = snd_pcm_avail_update (playback_handle)) < 0) {
if (frames_to_deliver == -EPIPE) {
fprintf (stderr, "an xrun occured\n");
break;
} else {
fprintf (stderr, "unknown ALSA avail update return value (%d)\n",
frames_to_deliver);
break;
}
}
frames_to_deliver = frames_to_deliver > 4096 ? 4096 : frames_to_deliver;
/* deliver the data */
if (playback_callback (frames_to_deliver) != frames_to_deliver) {
fprintf (stderr, "playback callback failed\n");
break;
}
}
snd_pcm_close (playback_handle);
exit (0);
}发布于 2019-07-26 21:50:07
在每个周期边界上,都会自动更新各种缓冲区指针,在每个周期边界上都会传递中断。
snd_pcm_wait()被这样的中断唤醒,因此在调用之后,snd_pcm_avail_update()读取的状态是正确的。
https://stackoverflow.com/questions/57222173
复制相似问题