0

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

根据文档 [PDF]AL_INVALID_OPERATION意思是:“没有当前上下文。” 这似乎不是真的,因为 OpenAL 已经并且继续播放其他音频就好了!

可以肯定的是,我ALCcontext* temp = alcGetCurrentContext( );在这里打电话,它返回了一个有效的上下文。

此处是否存在文档中未提及的其他错误情况?

更多详细信息:调用此代码时正在播放声源,但我从阅读规范中得到的印象是,您可以在播放源时安全地将处理过的缓冲区排入队列。如果有任何错误,它PrintALError只是打印的包装器。alGetError

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

4

2 回答 2

0

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

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

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

于 2013-05-31T10:32:43.250 回答
-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--; }
于 2013-05-30T19:11:01.127 回答