我一直在为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
}
结果似乎是缓冲区未正确排列,并且在下次播放此源时会听到。我知道通常你只能在完成播放后将缓冲区排成队,但我认为我可以自由地将任何缓冲区排在停止的声音上。我想知道是否我使用循环标志导致此行为?
我非常感谢任何建议。
谢谢你, 麦克
答案 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个缓冲区。