2011-08-09 105 views
0

下面的代碼:爲什麼會alSourceUnqueueBuffers失敗,INVALID_OPERATION

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

順便說一句,這是在OSX上運行。 – Gerald

回答

0

請先嚐試alSourceStop(m_OpenALSourceId)。 然後alUnqueueBuffers(),之後,重新開始播放alSourcePlay(m_OpenALSourceId)

我用這種方法解決了同樣的問題。但我不知道爲什麼有

0

this SO thread提到這樣做,

如果你有一個流源的unqueue操作將失敗啓用AL_LOOPING。

啓用時,循環標誌在緩衝區上具有某種鎖定。通過@MyMiracle答案在此提示爲好,停止持有聲音版本,但它沒有必要..

AL_LOOPING並不意味着要在流源設置,如管理的源數據隊列。保持排隊,它會繼續玩。從數據開始排隊,它將循環。

相關問題