2013-05-30 3 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 및 리눅스에서 다음 작품 :

// 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에 구현 잘못 오류가 발생합니다 보인다는 것이다. 사양은 소스가 재생되는 동안 처리로 표시되었습니다 버퍼 unqueue 할 수 있어야한다고 말한다 : 주어진 큐 항목의

제거를 소스 중 하나가 중지되지 않는 한 (할 수 없습니다 다음 경우에 전체 큐가 처리 된 것으로 간주 됨), 또는 대기열 항목이 이미 처리 된 경우 (AL_PLAYING 또는 AL_PAUSED 소스).

그 근거로 저는 이것이 OpenAL 구현의 버그 일 가능성이 높다고 말하고 싶습니다. 누군가가 좀 더 구체적인 답을 줄 수 있기를 바랍니다.