C ALSA编程:如何立即停止

C ALSA编程:如何立即停止,c,linux,audio,alsa,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 faile

我正在构建一个具有播放和停止功能的音频应用程序。函数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 );
}
playaudio()
{
... ...
int err=snd_pcm_open(&handle,“default”,snd_pcm_STREAM_回放,0);
如果(误差<0)
{
printf(“SCM打开失败:%s\n”,snd_strerror(err));
退出(err);
}
而(0
音频播放时,程序在snd_pcm_排水管(手柄)线路上被阻塞;直到播放完成。在此期间,我希望停止音频播放。我的操作是点击UI上的停止按钮,最后调用snd_pcm_drop(m_handle)。语音实际上已停止,但程序运行仍停留在snd_pcm_排水管(句柄)的线路上,直到几秒钟后,即播放音频文件的播放时间

我的问题是: 执行停止操作后,如何使snd_pcm_漏极立即等待? 如果没有,是否有其他方法实现立即停止,并保持playaudio功能等待播放完成


多谢各位

snd\u pcm\u drain
处于活动状态时,如何调用另一个函数?用线?你读了吗?JNI从java代码中调用了另一个stopaudio()。在JavaSwingUI中,我有一个用于音频停止的JButton。在JButton的click事件中,C代码stopaudio()最终通过激活snd_pcm_drain的JNI调用。我还没有看过文档。我会继续的。谢谢分享。