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 个缓冲区。
我一直在使用 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 个缓冲区。