Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新启动流式开源?_C++_Openal - Fatal编程技术网

C++ 重新启动流式开源?

C++ 重新启动流式开源?,c++,openal,C++,Openal,为什么我的流式开源有时会进入AL_STOPPED状态,迫使我调用alSourcePlay?这通常发生在调用send不够快时,即在调试模式下。当oal源没有足够的队列缓冲区时,它会自动停止吗?我如何避免这种情况 void send(audio_buffer audio) override { ALenum state; alGetSourcei(source_, AL_SOURCE_STATE,&state); if(state != AL_

为什么我的流式开源有时会进入
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.";
}
void发送(音频\缓冲音频)覆盖
{           
阿伦状态;
alGetSourcei(源、所有源、状态和状态);
如果(状态!=AL_播放)
alSourcePlay(source_417;//有时会发生这种情况,通常是在调用“send”的速度不够快时。
ALuint缓冲区=0;
alSourceUnqueueBuffers(源、1和缓冲区);
if(缓冲区)
{
alBufferData(buffer,alu格式,audio.data(),static_cast(audio.size()*sizeof(int16_t)),48000);
alSourceQueueBuffers(源、1和缓冲区);
}
其他的

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

(1) 您可以将其配置为从循环缓冲区播放,您将向其提供相关数据。其缺点是,如果缓冲区不足时间过长,它会听到重复的声音,但它会具有一些更好的性能特征(碎片等)

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

(3) 最后,您可以对音频发送操作执行线程,这样,只要音频线程没有耗尽,它就可以继续在后台发送数据


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

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

(1) 您可以将其配置为从循环缓冲区播放,您将向其提供相关数据。其缺点是,如果缓冲区不足时间过长,它会听到重复的声音,但它会具有一些更好的性能特征(碎片等)

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

(3) 最后,您可以对音频发送操作执行线程,这样,只要音频线程没有耗尽,它就可以继续在后台发送数据

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