c++ - 重新启动流式 OpenAL 源代码?

标签 c++ openal

为什么我的流式 OpenAL 源有时会进入 AL_STOPPED 状态,迫使我调用 alSourcePlay?这通常发生在我没有足够快地调用 send 时,即在 Debug模式下。当没有足够的队列缓冲区时,oal 源是否会自动停止?我该如何避免这种情况?

void send(audio_buffer audio) override
{           
    ALenum state; 
    alGetSourcei(source_, AL_SOURCE_STATE,&state);
    if(state != AL_PLAYING)
        alSourcePlay(source_); // This happens sometimes, usually when "send" is not called fast enough.

    ALuint buffer = 0;  
    alSourceUnqueueBuffers(source_, 1, &buffer);
    if(buffer)
    {
        alBufferData(buffer, AL_FORMAT_STEREO16, audio.data(), static_cast<ALsizei>(audio.size()*sizeof(int16_t)), 48000);
        alSourceQueueBuffers(source_, 1, &buffer);
    }
    else
        LOG << "Dropped audio.";
}

最佳答案

听起来您的基本问题是您的音频流不足。您可以使用一些选项来缓解这种情况,但它们都有自己的副作用:

(1) 您可以将其配置为从您提供相关数据的循环缓冲区播放。这样做的缺点是,如果您长时间占用缓冲区,它会重复自己的声音,但它会有一些更好的性能特征(碎片等)。

(2) 您可以增加发送缓冲区的大小。这只会掩盖小问题,并可能增加动态内容的延迟。

(3) 最后,可以线程化音频发送操作,这样只要音频线程不饿死,它就可以在后台继续发送数据。

高产量/高质量的解决方案可能涉及所有这三个方面。很抱歉缺少 OpenAL 特定术语,但我见过的每个音频系统都具有这些功能。

关于c++ - 重新启动流式 OpenAL 源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763063/

相关文章:

c++ - fmt 库 - 格式化为(编译时)string_view

c++ - OpenAL alGenBuffers 错误代码 40964 解决方法

c++ - 在 OpenAL 库中播放流

audio - 如何使用 openAL (java) 重新加载 wav 文件

c++ - 捕获音频输出

c++ - 如何在 C++ 中引用类结构中的函数?

c++ - 递归地 intToStr

c++ - IMFMediaSink,如何设置编码器属性?

c++ - TCP/IP 和设计网络应用程序

openal - alGetError()(在OpenAL中)返回-1而不是有效的错误代码是什么意思?