gpt4 book ai didi

c - Paul Davis 的 2002 "Interrupt Driven"ALSA 示例代码今天仍然有效吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:45 27 4
gpt4 key购买 nike

我正在学习如何使用 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() 是否会返回正确的帧数,因为它是在 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() 读取的状态是正确的。

关于c - Paul Davis 的 2002 "Interrupt Driven"ALSA 示例代码今天仍然有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com