正在重新启动流式处理OpenAL源
Restarting Streaming OpenAL Source?
为什么我的流式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特定的术语,但我见过的每个音频系统都有这些功能。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- C++ 是使用 OpenAL 进行实时 PCM fft 音频处理
- 正在重新启动流式处理OpenAL源