2013-05-30 33 views
0

我想實現流音頻,我遇到了一個問題,其中OpenAL給了我一個錯誤代碼似乎是不可能給出的文檔中的信息。OpenAL unqueueing錯誤代碼,不完整的文檔

int buffersProcessed = 0; 
alGetSourcei(m_Source, AL_BUFFERS_PROCESSED, &buffersProcessed); 
PrintALError(); 

int toAddBufferIndex; 

// Remove the first buffer from the queue and move it to 
//the end after buffering new data. 
if (buffersProcessed > 0) 
{ 
    ALuint unqueued; 
    alSourceUnqueueBuffers(m_Source, 1, &unqueued); 
         ///////////////////////////////// 
    PrintALError(); // Prints AL_INVALID_OPERATION // 
         ///////////////////////////////// 
    toAddBufferIndex = firstBufferIndex; 
} 

the documentation [PDF]AL_INVALID_OPERATION表示: 「目前沒有任何背景。」這看起來不可能是真的,因爲OpenAL已經並繼續播放其他音頻就好了!

可以肯定的是,我在這裏調用了ALCcontext* temp = alcGetCurrentContext();,它返回了一個有效的上下文。

有沒有其他的錯誤條件可能在這裏沒有提到的文檔?

更多細節:聲源播放時,該代碼被調用,但我從閱讀的規範得到的印象是,你可以放心地unqueue處理緩衝區而源播放。 PrintALError只是一個alGetError的包裝,如果有任何錯誤,則會打印。

我在Mac(OS 10.8.3)上,以防萬一。

+0

這可能只是在函數成功時獲取錯誤代碼是未定義的?因此,該功能可能會成功,但無論如何您都會打印錯誤代碼,因此無效。您應該在打印錯誤之前檢查功能是否失敗。 –

+0

alGetError()是檢查OpenAL中的函數是否失敗的方法,這就是PrintALError所做的。在沒有錯誤時調用PrintALError獲取錯誤代碼AL_NO_ERROR,並且在這種情況下我不打印任何東西。 –

回答

-1

要處理多個緩衝區的條件,請使用循環。 iOS和Linux以下工作:

// UN queue used buffers ALint buffers_processed = 0; alGetSourcei(streaming_source, AL_BUFFERS_PROCESSED, & buffers_processed); // get source parameter num used buffs while (buffers_processed > 0) { // we have a consumed buffer so we need to replenish ALuint unqueued_buffer; alSourceUnqueueBuffers(streaming_source, 1, & unqueued_buffer); available_AL_buffer_array_curr_index--; available_AL_buffer_array[available_AL_buffer_array_curr_index] = unqueued_buffer; buffers_processed--; }
+0

你讀過這個問題了嗎? 我的循環是在其他地方,因爲引擎的結構方式,我必須僅排出一個緩衝區。 –

0

到目前爲止,我所收集的是,它似乎如果你unqueue一個緩衝區,而源玩這個的OpenAL實現正確拋出一個錯誤。規範說,你應該能夠在源播放時將已標記爲處理的緩衝區排隊:

除非源停止,否則不能移除給定的隊列條目(在這種情況下,然後整個隊列被視爲已處理),或隊列條目是否已處理(AL_PLAYING或AL_PAUSED源)。

在此基礎上,我會說這可能是我的OpenAL實現中的一個錯誤。如果有人可以給出更具體的答案,我會打開這個問題。