以下是代码:
ALint cProcessedBuffers = 0;
ALenum alError = AL_NO_ERROR;
alGetSourcei(m_OpenALSourceId, AL_BUFFERS_PROCESSED, &cProcessedBuffers);
if((alError = alGetError()) != AL_NO_ERROR)
{
throw "AudioClip::ProcessPlayedBuffers - error returned from alGetSroucei()";
}
alError = AL_NO_ERROR;
if (cProcessedBuffers > 0)
{
alSourceUnqueueBuffers(m_OpenALSourceId, cProcessedBuffers, arrBuffers);
if((alError = alGetError()) != AL_NO_ERROR)
{
throw "AudioClip::ProcessPlayedBuffers - error returned from alSourceUnqueueBuffers()";
}
}
对alGetSourcei的调用将返回cProcessedBuffers> 0,但以下对alSourceUnqueueBuffers的调用失败,并带有INVALID_OPERATION。这是一种不常发生的不稳定错误。包含此示例代码的程序是在紧密循环中运行的单线程应用程序(通常与显示循环同步,但在这种情况下,我不使用任何类型的定时回调)。
答案 0 :(得分:0)
首先尝试alSourceStop(m_OpenALSourceId)
。
然后alUnqueueBuffers()
,之后,重新开始alSourcePlay(m_OpenALSourceId)
播放。
我通过这种方式解决了同样的问题。但我不知道为什么要这样做
答案 1 :(得分:0)
在this SO thread中提到,
如果您在流媒体源上启用了AL_LOOPING,则无队列操作将失败。
循环标志在启用时对缓冲区有某种锁定。 @MyMiracle的答案也暗示了这一点,停止了声音释放,但没有必要..
AL_LOOPING并不意味着在流媒体源上设置,因为你管理队列中的源数据。继续排队,它将继续播放。从数据的开头排队,它将循环。