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をなくすように、起きても修復できるようにプログラムをしないといけません。