Loops 带简介的开放式软循环
我一直在使用Win32的OpenAL软件,我遇到了一个特殊的问题 我的目标是播放一个循环声音,它有一个单镜头的介绍部分,类似于带有循环标记的.WAV文件。据我所知,这必须在OpenAL中通过在源代码上使用多个缓冲区来实现。通常,我的方法是将两个缓冲区排队,然后等待第二个缓冲区播放,并将源设置为循环。这是可行的,但问题是,一旦我准备好停止声音,我似乎无法将最后一个缓冲区解列。我的代码大致如下所示:Loops 带简介的开放式软循环,loops,buffer,openal-soft,Loops,Buffer,Openal Soft,我一直在使用Win32的OpenAL软件,我遇到了一个特殊的问题 我的目标是播放一个循环声音,它有一个单镜头的介绍部分,类似于带有循环标记的.WAV文件。据我所知,这必须在OpenAL中通过在源代码上使用多个缓冲区来实现。通常,我的方法是将两个缓冲区排队,然后等待第二个缓冲区播放,并将源设置为循环。这是可行的,但问题是,一旦我准备好停止声音,我似乎无法将最后一个缓冲区解列。我的代码大致如下所示: // set up the sound alSourceQueueBuffers(source, 1
// 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
}
其结果似乎是缓冲区未正确排队,下次播放此源代码时将听到。我知道通常只能在缓冲区播放结束后将其解列,但我认为我可以在停止的声音上自由地将任何缓冲区解列。我想知道是否是我使用循环标志导致了这种行为
我非常感谢你的建议
谢谢,,
迈克看来有办法解决这个问题。我无法取消播放缓冲区的队列,但我可以使用以下行完全清除队列:
alSourcei(source, AL_BUFFER, AL_NONE);
停止声音后,这将很好地工作。我认为正确使用
以及资源队列缓冲区(source、1和buffer1)
是创建一个缓冲区数组并将其发送进来,而不是调用两次,而是在数组上调用一次,如下所示:
ALuint buffers[2] = { buffer1, buffer2 };
alSourceUnqueueBuffers(source, 2, buffers);
注意,我们使用2的大小来表示2个缓冲区