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



我正在学习如何使用 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 occuredn");
                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 failedn");
            break;
        }
    }
    snd_pcm_close (playback_handle);
    exit (0);
}

各种缓冲区指针在每个周期边界自动更新

,中断传递。

snd_pcm_wait()被此类中断唤醒,因此在呼叫后,snd_pcm_avail_update()读取的状态是正确的。

相关内容

最新更新