2016-10-27 20 views
0

私はportaudioのウェブサイトにあるhereの録音プログラムのサンプルを使って作業しています。そして、フレームインデックスがどのようにインクリメントされているのか混乱していますportaudioがコールバックをバーストで返すのはなぜですか?

バッファサイズが512フレームで、サンプルレートが44100Hzに設定されている場合、プログラムはバッファを介して動作し、コールバックを返し、 11.6msごとに512フレームインデックスを増加させます。 main()では、現在のフレームインデックスを12msごとに出力しています(例のように1000msごとに反対ですが、残りのコードはそれらのものと同じです)。しかし、そうではありません。これは出力の塊です:

index at 12 ms = 0 
index at 24 ms = 0 
index at 36 ms = 1024 
index at 48 ms = 1024 
index at 60 ms = 2048 
index at 72 ms = 2048 
index at 84 ms = 2048 
index at 96 ms = 3072 
index at 108 ms = 3072 
index at 120 ms = 3072 
index at 132 ms = 4096 
index at 144 ms = 4096 
index at 156 ms = 4096 
index at 168 ms = 5120 
index at 180 ms = 5120 
index at 192 ms = 5120 
index at 204 ms = 6144 
index at 216 ms = 7680 

ご覧のとおり、これは変わった形で増えています。インデックスは36msまで0にとどまり、最大1024までジャンプし、インデックスは60msで1024から2048に突然増加します。インデックスが増加する方法は、それが期待する方法ではなく、矛盾しています。インデックスは1024から2048に増分するには24ms、次に2048から3072に増やすには36msかかりますが、その後は1224から6144に増やして6144から7680に増加します。

ここでは何が起こっているのですか出力をより安定した速度で得るにはどうすればよいですか?おそらくALSAのオーディオバッファサイズと関係がありますか?

+1

おそらく、計測クロックの方が予想よりも細かくなります。 –

+0

どうやら、あなたは 'main'からコールバック状態を非同期にサンプリングしようとしています。フレームインデックスとタイムスタンプを配列(コールバック自体)に格納する方がよいでしょう。そして、 'main'からその情報を出力することができます。 – user3386109

+0

"フレームインデックス"とはどういう意味ですか?この番号はどこから来ていますか? –

答えて

0

PortAudioコールバックバッファのサイズは、必ずしもホストのバッファサイズではありません。両方の関係は複雑です。なぜなら、すべてのホストAPIがすべてのバッファサイズをサポートするわけではないからです。しかし、PortAudioは要求されたコールバックバッファサイズをサポートするために "適応"します。

PortAudioは、ユーザーバッファーサイズ、要求された待ち時間、サポートされているホストバッファーサイズ、およびヒューリスティックを含む複数の制約を組み込んだアルゴリズムを使用してホストバッファーサイズを計算します。

たとえば、非常に小さいコールバックバッファサイズを要求してもレイテンシが大きい場合、PortAudioはより大きなホストバッファサイズを使用する可能性があり、バースト的なコールバックが発生する可能性があります。それはあなたのために起きているようです:1024フレームのホストバッファサイズ、しかし512フレームのPAコールバックバッファサイズ。

より多くの情報がここに私の答えである: Time between callback calls?

私はより一貫性の割合で起こって出力を得るために何ができるのでしょうか?

Pa_OpenStream()に対する適切なパラメータのレイテンシを小さくします。

一部のPortAudioホストAPIには、ホストバッファサイズを強制するためのホストAPI固有のメカニズムもあります。 ALSAがそのオプションを提供しているかどうかはわかりません。

また、paFramesPerBufferUnspecifiedオプションを使用すると、要求された待ち時間に基づいてPortAudioとALSAがネゴシエートするバッファサイズで、より定期的なコールバックが発生するはずです。

1024フレームのホストバッファを取得する理由には、ALSA固有またはデバイス固有の理由があることに注意してください。しかし、私は最初に上記を試みます。

関連する問題