OpenAL Soft - 带介绍的循环

OpenAL Soft - Loop with Intro

我一直在使用 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
}

结果好像是buffer没有正确unqueue,下次播放这个source的时候会听到。我知道通常你只能在缓冲区播放完毕后取消排队,但我认为我可以在停止的声音上自由地取消任何缓冲区。我想知道我对循环标志的使用是否导致了这种行为?

如果有任何建议,我将不胜感激。

谢谢, 迈克

看来有办法解决这个问题。我无法取消播放缓冲区的排队,但我可以用这行完全清除队列:

alSourcei(source, AL_BUFFER, AL_NONE);

这将在停止声音后正常工作。

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

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

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