【问题标题】:OpenAL unqueueing error code, incomplete documentationOpenAL 出队错误代码,文档不完整
【发布时间】:2013-05-31 18:32:43
【问题描述】:

我正在尝试实现流式音频,但我遇到了一个问题,鉴于文档中的信息,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),以防万一。

【问题讨论】:

  • 可能只是函数成功时获取错误码未定义?所以这个函数可能是成功的,但是你还是打印了错误代码,所以它是无效的。您应该在打印错误之前检查函数是否失败。
  • alGetError() 是检查函数是否在 OpenAL 中失败的方法,这就是 PrintALError 所做的。在没有错误时调用 PrintALError 会得到错误代码 AL_NO_ERROR,在这种情况下我不会打印任何内容。

标签: c++ audio-streaming openal


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    要处理多个缓冲区的条件,请使用循环。 以下适用于 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--;
    }
    

    【讨论】:

    • 你读过这个问题吗?我的循环在别处,由于引擎的结构方式,我只需要取消一个缓冲区的队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多