ALSA编程:如何立即停止

时间:2014-04-22 10:43:38

标签: c linux audio alsa

我正在构建一个具有播放和停止功能的音频应用。函数playaudio()用于播放,stopaudio()用于播放。预期的文件格式只是WAV。

playaudio()的主要实现如下:

playaudio()
{
... ...
    int err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
    if ( err < 0 )
    {
       printf("SCM open failed: %s\n", snd_strerror(err));                
       exit(err);
    }

    while ( 0 < numOfFrames) {
        ... ...
        ssize_t frames = snd_pcm_writei(handle, &buffer[0], periodSize);
        ... ...
    }

    snd_pcm_drain(handle);
    snd_pcm_close(handle);
}

stopaudio()
{
    snd_pcm_drop( m_handle );
}

播放音频时,程序在snd_pcm_drain(句柄)行被阻止;直到播放完成。期间,我希望停止音频播放。我的操作是单击UI上的停止按钮并最终调用snd_pcm_drop(m_handle)。语音实际上已停止,但程序运行仍然停留在snd_pcm_drain(句柄)行,直到几秒钟后才播放音频文件的播放时间。

我的问题是: 一旦停止动作,如何让snd_pcm_drain立即等待? 如果没有,是否还有其他方法可以通过保持playaudio功能等待播放完成来实现立即停止?

非常感谢你。

0 个答案:

没有答案