6

誰かがどのようにsnd_pcm_writeiを説明できますか

snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer,
                                 snd_pcm_uframes_t size)

動作しますか?

私はそれをそのように使用しました:

for (int i = 0; i < 1; i++) {
   f = snd_pcm_writei(handle, buffer, frames);

   ...
}

http://pastebin.com/m2f28b578の完全なソースコード

これは、snd_pcm_writei()のすべてのフレームの数を指定するのでbufferはなく、

sample_rate*レイテンシー=frames

したがって、たとえば次の場合:sample_rate=44100レイテンシ=0.5[s] all_frames = 100000

私が与えるべきフレームの数snd_pcm_writei()

sample_rate*レイテンシ=フレーム44100*0.5 = 22050

そして、forループの反復回数は次のようになりますか?:

(int)100000/22050 = 4; フレーム付き=22050

と1つ余分ですが、

100000 mod 22050 = 11800

フレーム?

それはどのように機能しますか?

ルイーズ

http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#gf13067c0ebde29118ca05af76e5b17a9

4

4 に答える 4

9

フレームは、バッファから書き込むフレーム(サンプル)の数である必要があります。システムのサウンドドライバーは、これらのサンプルをすぐにサウンドカードに転送し始め、一定の速度で再生されます。

レイテンシーはいくつかの場所で導入されます。カードに転送されるのを待っている間、ドライバーによってバッファリングされたデータからの待ち時間があります。いつでもカードに転送されているデータでいっぱいのバッファが少なくとも1つあり、アプリケーション側にバッファリングがあります。これはあなたが心配しているようです。

アプリケーション側のレイテンシーを減らすには、自分に合った最小のバッファーを作成する必要があります。アプリケーションがDSPタスクを実行する場合、それは通常1ウィンドウ分のデータです。

ループ内に小さなバッファーを書き込むことには利点はありません-先に進んですべてを一度に書き込むだけです-しかし、理解しておくべき重要なポイントがあります:レイテンシーを最小限に抑えるために、アプリケーションはドライバーがデータを書き込むよりも速くドライバーに書き込む必要がありますサウンドカードを使用しないと、より多くのデータが蓄積され、より多くのレイテンシが蓄積されることになります。

サウンドドライバーを使用してロックステップでデータを生成するのが比較的簡単な設計については、サウンド再生エンジンにコールバック関数を登録することに基づくジャック( http://jackaudio.org/ )を参照してください。実際、レイテンシーが本当に心配な場合は、自分でジャックを使用するのではなく、ジャックを使用する方がよいでしょう。

于 2010-02-02T15:14:40.960 に答える
6

「時期尚早」のデバイス閉鎖の理由は、デバイスが閉鎖される前にすべてのデータが再生されることを確認するために、snd_pcm_drain(handle);前に電話をかける必要があるためだと思います。snd_pcm_close(handle);

于 2013-03-07T20:26:50.297 に答える
4

ALSAチュートリアルで見つけたいくつかの例を使用して、なぜsnd_pcm_writei()うまくいかないのかを判断するためにいくつかのテストを行いました。結論としてsnd_pcm_close ()、サウンドデバイスが送信された完全なストリームを再生する前に、単純な例が実行されていました。

レートをに設定し11025、128バイトのランダムバッファを使用し、snd_pcm_writei()サウンドの1秒ごとに11025/128でループしました。snd_pcm_write()2秒の音を出すには、2秒で86*2回の通話が必要でした。

データをオーディオに変換するのに十分な時間をデバイスに与えるために、ループの後にforループを使用して、関数snd_pcm_writei()の実行を遅らせました。snd_pcm_close()

テスト後、関数が呼び出される前に、サンプルコードがデバイスのレイテンシーを克服するのに十分なサンプルを提供しなかったと結論付けなければなりませんでした。snd_pcm_closeこれは、close関数のレイテンシーがsnd_pcm_write()関数よりも少ないことを意味します。

于 2012-11-18T08:15:42.267 に答える
1

ALSAドライバーの開始しきい値が適切に設定されていない場合(この場合は約2秒)、snd_pcm_writei()の直後にデータレンダリングを開始するためにsnd_pcm_start()を呼び出す必要があります。または、ALSAデバイスのSWパラメータで適切なしきい値を設定することもできます。

参照:

于 2014-09-21T17:07:59.020 に答える