【问题标题】:Why would alSourceUnqueueBuffers fail with INVALID_OPERATION为什么 alSourceUnqueueBuffers 会因 INVALID_OPERATION 而失败
【发布时间】:2015-03-30 21:23:49
【问题描述】:

代码如下:

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

【问题讨论】:

    标签: openal


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      this SO thread中提到,

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2020-10-14
        • 1970-01-01
        • 2012-04-06
        • 2018-05-16
        • 2016-06-25
        相关资源
        最近更新 更多