Introduction to Sound Programming with ALSA その3
下記URLの記事を自分に必要な所だけ訳しているので、メモ書きを。
http://www.linuxjournal.com/article/6735
Sound Buffer and Transfer
まず、録音を例にしてALSAのサウンドバッファと転送の機構を説明します。
サウンドカードは録音しているサンプルを貯めておくハードウェアバッファを持っていて、ハードウェアバッファが一杯になったらALSA側で割り込み処理を行います。
割り込み処理はDMAアクセスでハードウェアバッファからメモリ内に作られているアプリケーションバッファに転送する事です。
同様にして再生の場合は、メモリ内のアプリケーションバッファからハードウェアバッファにDMAアクセスで再生するサンプルが送られます。
ハードウェアバッファはリング構造になっていて終端に達したら、先頭に戻ることになります。
ALSAはハードウェアバッファとアプリケーションバッファへのポインタを使って、現在処理中のメモリを管理しています。
ALSAを使うプログラマは、アプリケーションバッファしか操作しません。
アプリケーションバッファはALSAが提供する関数を用いて、サイズを変更できます。
大量のサイズを指定することもできますが、それを一度の操作でハードウェアバッファに転送すると遅延が発生してしまいます。
そうならないように、ALSAはアプリケーションバッファをピリオドという単位に分割して扱っています。
転送するのはピリオド毎に行います。
このピリオドをOSSではフラグメントと呼んでいます。
ピリオドには複数のフレームが格納され、各フレームはそれが指す時間のサンプルが入っています。
入っているサンプルは一つ以上です。
サンプルは、モノラルなら一つ、ステレオなら二つになります。
データの格納の方法は、ALSAライブラリでちゃんと指定しないといけません。
例えばステレオで、INTERLEAVE-MODEならフレーム内に左右交互にサンプルが格納される事になります。
Over and Unser Run
サウンドデバイスが稼働しているとき、データ(上記のフレームで構成されたサウンド用データの事)はハードウェアバッファとアプリケーションバッファの間を絶え間なく転送される事になります。
録音時にアプリケーションバッファから素早くデータを読めないと、ハードウェアバッファから送られてきたデータでそのアプリケーションバッファ内は上書きされてしまいます。
このエラーをOVERRUNと呼びます。
逆に再生時に素早くデータをおくれず、ハードウェアバッファに再生するべきデータが無くなってしまうエラーをUNDERRUNと呼びます。
ALSAのドキュメントではこの二つのエラーをXRUNと呼んでいます。
XRUNをなくすように、起きても修復できるようにプログラムをしないといけません。