OpenAL Soft - Loop with Intro

时间:2015-10-03 00:27:43

标签: loops buffer openal-soft

我一直在为Win32使用OpenAL软件,我遇到了一个特殊的问题。

我的目标是播放具有一次性前奏部分的循环声音,类似于带有循环标记的.WAV文件。据我了解,这必须通过在源上使用多个缓冲区在OpenAL中实现。通常,我的方法是将两个缓冲区排队,然后等到第二个缓冲区正在播放,并将源设置为循环。这是有效的,但问题是,一旦我准备停止声音,我似乎无法将最后一个缓冲区排队。我的代码大致如下:

// set up the sound
alSourceQueueBuffers(source, 1, &buffer1);
alSourceQueueBuffers(source, 1, &buffer2);
alSourcePlay(source);

...

// check to loop sound in update
ALint buffer;
alGetSourcei(source, AL_BUFFER, &buffer);
if (buffer == buffer2)
{
    alSourcei(source, AL_LOOPING, true);
}

..

// check to stop sound in update
if (shouldStop)
{
    alSourcei(source, AL_LOOPING, false);
    alSourceStop(source);

    alSourceUnqueueBuffers(source, 1, &buffer1);
    alSourceUnqueueBuffers(source, 1, &buffer2); // AL_INVALID_OPERATION
}

结果似乎是缓冲区未正确排列,并且在下次播放此源时会听到。我知道通常你只能在完成播放后将缓冲区排成队,但我认为我可以自由地将任何缓冲区排在停止的声音上。我想知道是否我使用循环标志导致此行为?

我非常感谢任何建议。

谢谢你, 麦克

2 个答案:

答案 0 :(得分:0)

看起来有办法解决这个问题。我无法排队播放缓冲区,但我可以用这一行彻底清除队列:

alSourcei(source, AL_BUFFER, AL_NONE);

停止声音后,这样可以正常工作。

答案 1 :(得分:0)

我认为正确使用alSourceUnqueueBuffers(source, 1, &buffer1);是为了创建一个缓冲区数组并将其发送,而不是两次调用它,你在数组上调用它一次,如下所示:

ALuint buffers[2] = { buffer1, buffer2 };
alSourceUnqueueBuffers(source, 2, buffers);

注意我们使用2的大小来表示2个缓冲区。