2012-03-18 52 views
1

爲什麼我的流式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

這聽起來像是你的基本問題是你的音頻流餓死了。有幾個選項可以用來緩解這個問題,但它們都有自己的副作用:

(1)您可以將其配置爲從循環緩衝區中播放,並向您提供相關數據。這樣做的缺點是,如果你將緩衝區捱餓太久,它會自動重複,但它會有一些更好的性能特徵(碎片等)。

(2)您可以增加發送緩衝區大小。這隻會掩蓋小問題,並可能增加動態內容的延遲。 (3)最後,你可以線程化音頻發送操作,只要音頻線程沒有餓死,它可以繼續在後臺發送數據。

高生產/質量解決方案可能會吸引所有這三個。對於缺乏OpenAL特定術語感到抱歉,但我見過的每個音頻系統都具備這些功能。