2012-03-18 22 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)最後に、オーディオスレッドが不足していない限り、バックグラウンドでデータを送信し続けることができます。

高い生産性/品質のソリューションは、おそらくこれらの3つすべてを含んでいます。 OpenAL固有の用語がないのは残念ですが、私が見たすべてのオーディオシステムにはこれらの機能があります。

関連する問題