1

ALSAを使用してオーディオサンプルを再生するオーディオアプリケーションがあります。「hw:0」デバイスは次のように設定されています。サンプル:48kHz、16ビットLEバッファサイズ:1920フレーム(= 20ミリ秒)周期サイズ:960フレーム(= 10ミリ秒)これは擬似コードです。

snd_pcm_sframes_t delayp = 0;
snd_pcm_sframes_t availp = 0;

while(true)
{
    snd_pcm_delay(m_pHandle, &delayp);
    availp = snd_pcm_avail(m_pHandle);
    print "Delay" + delay + "Available" + availp
    err = snd_pcm_writei(m_pHandle, data, periodSize);
    availp = snd_pcm_avail_update(m_pHandle);
    print "Wrote " + err + "samples - samples available" + avail;
}

ログは次のようになります。

Periodsize 960 frames for a periodtime of 20 ms
Buffersize 1920 frames for a buffertime of 40 ms

Delay: 0 frames/ 0 ms; available 1920 frames/ 40
Wrote 960 frames; available after write: 960 frames/ 20 ms

xrunRecovery: Underrun!!! (at least 0.669 ms/ 32.112 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40
Wrote 960 frames; available after write: 960 frames/ 20 ms
Delay: 955 frames/ 19.8958 ms; available 965 frames/ 20.1042
Wrote 960 frames; available after write: 9 frames/ 0.1875 ms
Delay: 906 frames/ 18.875 ms; available 1014 frames/ 21.125
...
Delay: 952 frames/ 19.8333 ms; available 968 frames/ 20.1667
Wrote 960 frames; available after write: 18 frames/ 0.375 ms

xrunRecovery: Underrun!!! (at least 234.825 ms/ 11271.6 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40

Wrote 960 frames; available after write: 960 frames/ 20 ms

xrunRecovery: Underrun!!! (at least 0.869 ms/ 41.712 frames long

Delay: 0 frames/ 0 ms; available 1920 frames/ 40

奇妙なことが2つあります。1。960フレームを書き込んだものはすべて、snd_pcm_avail_updateが常にこれを反映しているとは限りません。2。突然、xrunが発生します。たとえば、18フレームしか使用できない場合、次の行は、バッファに新しいピリオドを書き込もうとしたときにxrunを示します。

誰かがここで何が起こっているのか説明してもらえますか?

4

1 に答える 1

1

960フレームを書き込むと、使用可能なフレームの数が960減少します。同時に、再生されるサンプルによって、使用可能なフレームの数が増加します。

バッファが空になるとアンダーランが発生します。ログによると、プログラムは約234ミリ秒間実行されませんでした。

于 2012-12-14T14:53:50.343 に答える