重新启动流式OpenAL来源?

问题描述:

为什么我的流式OpenAL源码时间为AL_STOPPED状态,迫使我致电alSourcePlay?这通常发生在我不调用send的速度时,即在调试模式下。当OAL源没有足够的队列缓冲区时,会自动停止吗?我如何避免这种情况?重新启动流式OpenAL来源?

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特定术语感到抱歉,但我见过的每个音频系统都具备这些功能。