Paul Davis 的 2002 "Interrupt Driven" ALSA 示例代码今天仍然有效吗?
Paul Davis' 2002 "Interrupt Driven" ALSA Example Code Still Valid Today?
我正在学习如何 poll/wait 使用 ALSA API 填充声卡缓冲区。我想知道 Paul Davis(JACK 的作者)2002 年标题为 "A Minimal Interrupt-Driven Program" 的示例代码在今天是否仍然有效:
http://equalarea.com/paul/alsa-audio.html
我还读到 snd_pcm_wait()
使用 poll()
系统调用,所以应该没问题。不使用系统调用的 snd_pcm_avail_update()
是否会 return 正确的帧数,因为它是在 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);
}
各种缓冲区指针会在传送中断的每个周期边界自动更新。
snd_pcm_wait()
就是被这种中断唤醒的,所以直接调用后,snd_pcm_avail_update()
读取的状态是正确的。
我正在学习如何 poll/wait 使用 ALSA API 填充声卡缓冲区。我想知道 Paul Davis(JACK 的作者)2002 年标题为 "A Minimal Interrupt-Driven Program" 的示例代码在今天是否仍然有效:
http://equalarea.com/paul/alsa-audio.html
我还读到 snd_pcm_wait()
使用 poll()
系统调用,所以应该没问题。不使用系统调用的 snd_pcm_avail_update()
是否会 return 正确的帧数,因为它是在 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);
}
各种缓冲区指针会在传送中断的每个周期边界自动更新。
snd_pcm_wait()
就是被这种中断唤醒的,所以直接调用后,snd_pcm_avail_update()
读取的状态是正确的。