为什么alSourceUnqueueBuffers会因INVALID_OPERATION而失败

时间:2011-08-09 02:09:26

标签: openal

以下是代码:

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。这是一种不常发生的不稳定错误。包含此示例代码的程序是在紧密循环中运行的单线程应用程序(通常与显示循环同步,但在这种情况下,我不使用任何类型的定时回调)。

2 个答案:

答案 0 :(得分:0)


首先尝试alSourceStop(m_OpenALSourceId)。 然后alUnqueueBuffers(),之后,重新开始alSourcePlay(m_OpenALSourceId)播放。

我通过这种方式解决了同样的问题。但我不知道为什么要这样做

答案 1 :(得分:0)

this SO thread中提到,

如果您在流媒体源上启用了AL_LOOPING,则无队列操作将失败。

循环标志在启用时对缓冲区有某种锁定。 @MyMiracle的答案也暗示了这一点,停止了声音释放,但没有必要..

AL_LOOPING并不意味着在流媒体源上设置,因为管理队列中的源数据。继续排队,它将继续播放。从数据的开头排队,它将循环。