OpenAL排队错误代码,文档不完整

时间:2013-05-30 11:46:46

标签: c++ audio-streaming openal

我正在尝试实现流音频,而且我遇到了一个问题,OpenAL给了我一个错误代码似乎不可能给出文档中的信息。

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( );,它返回了一个有效的上下文。

是否有其他错误情况可以在文档中找不到?

更多细节:在调用此代码时正在播放声源,但是通过阅读规范获得的印象是您可以在播放源时安全地将已处理的缓冲区置于队列中。 PrintALError只是alGetError的包装器,如果有任何错误则会打印出来。

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

2 个答案:

答案 0 :(得分:0)

到目前为止,我收集到的是,如果在源播放时将缓冲区排入队列,这个OpenAL实现似乎会错误地抛出错误。规范说你应该能够在源正在播放时将一个标记为处理的缓冲区队列出来:

  

除非停止源(在这种情况下整个队列被视为已处理),或者队列条目已被处理(AL_PLAYING或AL_PAUSED源),否则无法删除给定的队列条目。 /强>

在此基础上,我会说这可能是我的OpenAL实施中的一个错误。我会打开这个问题,万一有人可以给出更具体的答案。

答案 1 :(得分:-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--; }