首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保罗戴维斯的2002年“中断驱动”ALSA示例代码仍然有效的今天?

保罗戴维斯的2002年“中断驱动”ALSA示例代码仍然有效的今天?
EN

Stack Overflow用户
提问于 2019-07-26 14:33:22
回答 1查看 375关注 0票数 0

我正在学习如何使用ALSA轮询/等待填充声卡缓冲区。我想知道Paul Davis(JACK的作者)2002年名为“最小中断驱动程序”的示例代码在今天是否仍然有效:

http://equalarea.com/paul/alsa-audio.html

我还读到过snd_pcm_wait()使用poll()系统调用,所以应该可以。不使用系统调用的snd_pcm_avail_update()会返回正确的帧数,因为它是在snd_pcm_wait()之后调用的(这可能会更新缓冲区的状态)吗?

代码语言:javascript
复制
    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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-26 21:50:07

在每个周期边界上,都会自动更新各种缓冲区指针,在每个周期边界上都会传递中断。

snd_pcm_wait()被这样的中断唤醒,因此在调用之后,snd_pcm_avail_update()读取的状态是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57222173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档