【发布时间】: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