如何使用PortAudio循环播放wav文件?

问题描述 投票:0回答:1

使用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;
}
portaudio libsndfile
1个回答
0
投票

在这里发布问题的同时,我向代码所有者寻求帮助,他们回复了完美的解决方案:

正如所写,流将在文件末尾关闭,但这 不一定会发生。当到达文件末尾时,您可以使用 sf_seek(p_data->file, 0, SF_SEEK_SET) 倒回到开头 文件的内容。

为了创建一个中断事件,你可以添加一个成员done int;到 callback_data_s 并将其初始化为 0。然后当你想要中断时 要发生你可以将其设置为 1。然后在回调中你只需 检查 p_data->done == 1 是否并退出。

© www.soinside.com 2019 - 2024. All rights reserved.