正在重新启动流式处理OpenAL源

Restarting Streaming OpenAL Source?

本文关键字:处理 OpenAL 重新启动      更新时间:2023-10-16

为什么我的流式OpenAL源有时会进入AL_STOPPED状态,迫使我调用alSourcePlay?这种情况通常发生在我调用send不够快的情况下,即在调试模式下。当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特定的术语,但我见过的每个音频系统都有这些功能。