为什么我的流式OpenAL源somtimes转到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.";
}
答案 0 :(得分:1)
听起来你的基本问题是你的音频流是饥饿的。您可以使用一些选项来缓解这种情况,但它们都有自己的副作用:
(1)您可以将其配置为从循环缓冲区播放,您要向其提供相关数据。这样做的缺点是,如果你将缓冲区饿得太长,它会发出声音重复,但它会有一些更好的性能特征(碎片等)。
(2)您可以增加发送缓冲区大小。这只会掩盖小问题,并可能增加动态内容的延迟。
(3)最后,你可以通过线程进行音频发送操作,只要音频线程不饿,它就可以继续在后台发送数据。
高产量/高质量的解决方案可能会产生这三个问题。很抱歉缺少OpenAL特定术语,但我见过的每个音频系统都有这些功能。