使用PortAudio和SndFile读取WAV文件内容,直接写入输出流来播放声音是可行的,如示例
wavplayer.c
这里,但是有谁知道如何使声音无限循环直到我们关闭流?
static
int
callback
(const void *input
,void *output
,unsigned long frameCount
,const PaStreamCallbackTimeInfo *timeInfo
,PaStreamCallbackFlags statusFlags
,void *userData
)
{
float *out;
callback_data_s *p_data = (callback_data_s*)userData;
sf_count_t num_read;
out = (float*)output;
p_data = (callback_data_s*)userData;
/* clear output buffer */
memset(out, 0, sizeof(float) * frameCount * p_data->info.channels);
/* read directly into output buffer */
num_read = sf_read_float(p_data->file, out, frameCount * p_data->info.channels);
/* If we couldn't read a full frameCount of samples we've reached EOF */
if (num_read < frameCount)
{
return paComplete;
}
return paContinue;
}
在这里发布问题的同时,我向代码所有者寻求帮助,他们回复了完美的解决方案:
正如所写,流将在文件末尾关闭,但这 不一定会发生。当到达文件末尾时,您可以使用 sf_seek(p_data->file, 0, SF_SEEK_SET) 倒回到开头 文件的内容。
为了创建一个中断事件,你可以添加一个成员done int;到 callback_data_s 并将其初始化为 0。然后当你想要中断时 要发生你可以将其设置为 1。然后在回调中你只需 检查 p_data->done == 1 是否并退出。