/dev/audio
必要なヘッダ
<sys/audio.h>
概要
オーディオデバイスは、オーディオ・ストリーム・データの録音・再生に使用される。オーディオ機器の中には、下記の全ての機能を実装していないものがある。そのため、デバイスごとの詳細については、デバイスに付属するマニュアルページを参照すること。
アプリケーションはAUDIO_GETDEV ioctl(2)によって、/dev/audioに割り当てられているデバイスを調べることができる。
オーディオフォーマット
デジタルオーディオデータは量子化された近似値によりアナログ入力を表現する。もっとも単純な場合、それらの量子化データはサンプリング周波数ごとの入力信号の振幅を表す。
入力信号の最適な近似解を得るためには、可能な限り高いサンプリング周波数と精度を使用するべきである。だが、精度を上げるとデータ量が増える。例えば、8KHzのμ-Lawフォーマットでモノラル音声を一分間録音するには、0.5MBの記憶容量を必要とする。一方、一般的なCDオーディオフォーマット(ステレオ、16bit PCM 44.1KHz)では一分あたり10MB必要となる。
オーディオデータはいくつかの異なったフォーマットで表現されうる。オーディオデバイスに設定されているフォーマットは、下記のAUDIO_GETINFO ioctl(2)で調べることができる。
オーディオデータフォーマットは、サンプリングレート・精度・エンコーディング・チャンネル数によって分類される。デバイスがサポートしているフォーマットについては、各デバイスのマニュアルを参照すること。デバイスが直接サポートしているフォーマットに加えて、そのほかの高圧縮率のフォーマットもサポートされる。アプリケーションは録音・再生時にそれらのフォーマットを使用することができる。
サンプリングレート
サンプリングレートは、オーディオデータのサンプリング周波数(一秒あたりのサンプル数)のことである。
エンコーディング
エンコーディングパラメータは、オーディオデータの表現方法を指定する。 μ-LawエンコーディングはCCITT G.711に準拠し、アメリカ・カナダ・日本の電話局で標準に使用されるフォーマットである。 A-LawエンコーディングもまたCCITT G.711の一部であり、その他の国における標準である。 A-Lawとμ-Lawは12bit 8KHzで、8bit/sampleに圧縮されている。最終的なオーディオデータの品質は、電話と同じレベルである。
PCMは非圧縮で符合つきの音声フォーマットで、各サンプル値は入力信号の電圧の振幅を直接的に表現したものである。各サンプル値は、正負の振幅を2の補数で表現する。
精度
精度は、各オーディオサンプルを何ビットで格納するか、を指定する。例えば、μ-LawとA-Lawは8ビットである。 PCMデータは複数種の精度を使用することができる。16ビットが最も一般的である。
チャンネル
オーディオの各チャンネルは、サンプルごとインターリーブされる。ひとつのサンプルフレームは、それぞれのチャンネルから一つずつ取得したサンプルからなる。例えば、ステレオ・16ビットPCMデータの一つのサンプルフレームは、二つの16ビットサンプル値から構成される。また、各データは左から右のチャンネルに該当する。
説明
/dev/audioデバイスは、オーディオ要求を適切な下位のオーディオハードウェアにディスパッチするデバイスドライバである。
オーディオドライバはSTREAMSドライバとして実装されている。オーディオ入力を録音するためには、アプリケーションは/dev/audioデバイスをopen(2)し、そこからread(2)システムコールでデータを読み出さなければならない。同様に、出力データはwrite(2)システムコールによりオーディオ出力ポートに書き込まれる。デバイスの設定はioctl(2)インタフェースによって行われる。
/dev/audioをopenしたときに、このオーディオインターフェースのスーパーセットの機能を提供するミキシングオーディオドライバを開く可能性がある。オーディオミキサーは、排他的なリソースの制限をなくし、同時に複数の録音や再生を行えるようにする。 mixer(7I)とaudio_support(7I)を参照すること。
いくつかのシステムでは、複数個のオーディオデバイスが搭載されていることもある。そのため、アプリケーションの作者には、AUDIODEV環境変数を調べることが推奨されている。もし、この変数が設定されていた場合、その値はデフォルトのオーディオデバイスのパス名を示している。
オーディオデバイスのオープン
オーディオデバイスは排他的なリソースを取り扱う。つまり、一つのデバイスをある一時点で開くことができるプロセスは最大で一つである。しかしながら、オーディオ情報構造体のhw_featuresフィールドに、DUPLEXビットが設定されていた場合は、そのデバイスは二つのプロセスから同時にアクセスすることができる。一つのプロセスが読み込み専用で開き、もう一つのプロセスが書き込み専用で開くことができる。詳細は下記を参照のこと。
デバイスが使用中の場合は、/dev/audioのオープンに失敗する。
open()のoflagにO_NDELAYかO_NONBLOCKが指定されていた場合は、すぐに処理を終了して-1を返し、errnoにEBUSYを設定する。
open()時にO_NDELAYもO_NONBLOCKも指定されていなかった場合は、デバイスが使用可能になるか、プロセスにシグナルが送信されるまで処理を停止する。シグナルが送信された場合は-1を返しerrnoにEINTRが設定される。これにより、プロセスはデバイスが使用可能になるまで待機することが可能になる。
オーディオデバイスが初めて開かれるとき、ドライバはデータフォーマットをデフォルト値(8ビット 8KHz モノラル μ-Law)に設定する。デバイスが他のプロセスによって開かれており、別のフォーマットが設定されていた場合は、このデバイスのフォーマットを変更することは不可能である。
いくつかのデバイスを除いては、設定できるサンプリングレートには制限がある。そのため、オーディオアプリケーションでは、エンコーディング特性はデフォルト設定に依存するよりかは、必要に応じて明示的に設定したほうがいい。
オーディオデバイスは、ある一つのプロセスに対して排他的な入出力を提供する。そのため、稼働時間の長いオーディオアプリケーションは、アイドル状態になったらデバイスを閉じて、必要に応じて再度オープンする様にしたほうがいい。オーディオ情報構造体のplay.waitingとrecord.waitingは、他のプロセスがこのデバイスを必要としているか否かを示す。バックグラウンドで動作するオーディオ出力プロセスは、他のプロセスが書き込みアクセスを要求しているときにはデバイスを開放するべきである。
録音
read() システムコールは、システムのバッファからアプリケーションにデータをコピーする。
通常、read()はユーザのバッファが一杯になるまでブロックする。また、I_NREAD ioctlによって、ブロックせずに読み込むことができるデータ量を調べることができる(streamio(7I)を参照)。
デバイスはノン・ブロッキングモードに設定することもできる。その場合、read()はすぐに処理を終了するが、要求されたデータ量よりも少量のデータしか取得できない可能性がある。この挙動についての完全な情報については、read(2)のmanページを参照すること。
読み込み用にオーディオデバイスが開かれたとき、ドライバは直ちに入力データのバッファリングを開始する。これにより、システムリソースを消耗するため、録音しないプロセスはデバイスを書き込み専用(O_WRONLY)で開くべきである。
AUDIO_SETINFO ioctlでオーディオ情報構造体のrecord.pauseフラグを設定・解除することにより、入力データのSTREAMSバッファへの転送を停止・再開することができる。
STREAMSバッファ内の不要な入力データは、I_FLUSH STREAMS ioctlによって破棄することができる(streamio(7I)を参照)。
録音パラメータを変更した場合は、一旦入力ストリームを停止して中のデータを破棄してから、新しいフォーマットで録音を行うべきである。そうしなかった場合、しばらく古いフォーマットのサンプルが続き、途中から新しいフォーマットのサンプルが読み込まれるようになる。これは、新しいパラメータによりサンプル数が変更された場合は特に重要である。
入力データは、きわめて高速にSTREAMSバッファに蓄積される。最小の、8ビット 8KHz モノラル μ-Lawデータでは一秒あたり8000バイトのデータが蓄積される。デバイスが16ビットlinearかそれ以上に設定された場合はもっと高速になる。データを消費するアプリケーションがこの速度を維持できない場合は、STREAMSキューは一杯になる。そうすると、オーディオ情報構造体にrecord.errorフラグが設定され、新しいデータを格納する領域が空くまで入力が停止される。この場合、入力データには切れ目が生じることになる。そのため、録音を行うアプリケーションは、大規模な初期化を行うときよりも読み込みの準備が整ったあとでデバイスを開くようにするべきである。
再生
write()システムコールは、アプリケーションのバッファからSTREAMS output キューへデータをコピーする。一般的に、write() はユーザのバッファ内の全てのデータが転送されるまでブロックされる。デバイスはノン・ブロッキングモードに設定することもできる。この場合write()は直ちに終了するが、要求されたデータ量よりも少量のデータしか転送されない可能性がある(write(2)システムコールを参照のこと)。
write() システムコールはデータをキューに追加し終わった段階で制御を返す。しかし、実際のオーディオ出力にはもっと時間がかかる可能性がある。AUDIO_DRAIN ioctlを発行することによって、キューに追加されたデータがすべて再生し終わるまでアプリケーションをブロックさせることができる。あるいは、出力ストリームに長さ0のデータ(EOFレコード)を書き込むことで、非同期通知を要求することもできる。そのようなデータが処理されたとき、オーディオ情報構造体のplay.eofフラグがインクリメントされる。
最後のclose()は、オーディオ出力が全て終わるまでブロックする。もし、close()処理中にシグナルを受信したり、あるいはデバイスをクローズせずにプロセスが終了したりした場合は、キューに残っているデータはすべて破棄され、デバイスは直ちにクローズされる。
AUDIO_SETINFO ioctlによって、オーディオ情報構造体のplay.pauseフラグを設定・解除することにより、オーディオ出力を一時停止・再開することができる。キュー内にあるデータはI_FLUSH ioctlによって破棄することができる。(streamio(7I)を参照のこと)
デフォルトでは、STREAMバッファの出力データは 8000バイト/秒の、μ-Law・A-Law・PCMで処理される。もし、出力キューが空になると、オーディオ情報構造体のplay.errorフラグが設定され、次のデータが書き込まれるまで停止する。もしアプリケーションがカレントのサンプルフレームサイズに合わない量のデータを書き込んだ場合は、エラーが生成され間違ったデータは破棄される。追加のデータを書き込むことは可能である。
非同期I/O
I_SETSIG STREAM ioctlによって、入出力の状態変化を通知するSIGPOLLシグナルの非同期通知を有効にすることができる。F_SETFL fcntl(2)によってO_NONBLOCKフラグを設定すると、ノン・ブロッキングなread()とwrite()が可能となる。これは通常、バックグラウンドでの入出力を行うアプリケーションで使用される。
オーディオ制御疑似デバイス
これは、ボリューム・コントロール・パネルや、外部プロセスが使用しているデバイスの設定を変更するような、ある種のアプリケーションにとって有用である。これは/dev/audioctl擬似デバイスによって提供される。/dev/audioctlは複数のプロセスから同時に開くことができる。しかしながら、read()とwrite()は無視される。/dev/audioctlに対するAUDIO_GETINFOとAUDIO_SETINFO ioctlコマンドは/dev/audioの状態や挙動を変更する。
注意:一般的に、オーディオ制御デバイスの名前はオーディオデバイスのパス名の後に"ctl"を付加したものである。
オーディオの状態が変更されたときの通知
オーディオ制御擬似デバイスを開くアプリケーションは、I_SETSIG STREAMS ioctlでS_MSGフラグを設定することによって、オーディオデバイスの状態変更を通知する非同期通知を要求することができる。そのようなプロセスには、下記のイベントが生じたときSIGPOLLシグナルが送信される。
- AUDIO_SETINFO ioctlによって、デバイスの状態が変更された。
- インプット・オーバーフローやアウトプット・アンダーフローが生じた。
- 出力時にEOFレコード(長さ0のバッファ)が処理された。
- 外部のイベント(スピーカーボックスのボリュームコントロールなど)により、デバイスの状態が変更された。
IOCTL
オーディオ情報構造体
オーディオデバイスの状態はAUDIO_GETINFOとAUDIOSETINFOのioctlによって、取得・変更することができる。
これらの操作で使用されるaudio_info構造体が<sys/audio.h>で定義されている。
/*
* この構造体はオーディオデバイスのIOストリームの状態を保持する。
*/
struct audio_prinfo {
/*
* オーディオデータのエンコーディングを保持する
*/
uint_t sample_rate; /* サンプリングレート */
uint_t channels; /* インタリーブされるチャンネル数 */
uint_t precision; /* 1サンプルあたりのビット数 */
uint_t encoding; /* エンコーディング方法 */
/*
* オーディオデバイスの設定を制御する
*/
uint_t gain; /* 音量 */
uint_t port; /* 選択されたIOポート */
uint_t buffer_size; /* IOバッファサイズ */
/*
* カレントのデバイスの状態を保持する
*/
uint_t samples; /* 変換されたサンプル数 */
uint_t eof; /* EOFのカウンタ(再生時のみ) */
uchar_t pause; /* 非0:一時停止、0:再開 */
uchar_t error; /* 非0:オーバーフロー・アンダーフローが発生した */
uchar_t waiting; /* 非0:他のプロセスがアクセスを待っている */
uchar_t balance; /* ステレオ・チャンネル・バランス */
/*
* 読み込み専用のデバイスの状態を示す
*/
uchar_t open; /* 非0:open可能 */
uchar_t active; /* 非0:I/Oが有効 */
uint_t avail_ports; /* 有効なI/Oポート */
uint_t mod_ports; /* 変更可能なI/Oポート */
};
typedef struct audio_prinfo audio_prinfo_t;
/*
* 下記の構造体はAUDIO_GETINFOとAUDIO_SETINFOで使用される
*/
struct audio_info {
audio_prinfo_t record; /* 入力の状態 */
audio_prinfo_t play; /* 出力の状態 */
uint_t monitor_gain; /* 入力を出力に混ぜる度合い */
uchar_t output_muted; /* 非0:出力がミュートになっている */
uint_t hw_features; /* H/Wにより提供される機能 */
uint_t sw_features; /* ソフトウェアにより提供される機能 */
uint_t sw_features_enabled; /* sw_featuresが有効か否か */
};
typedef struct audio_info audio_info_t;
/* エンコードの種別 */
#define AUDIO_ENCODING_ULAW (1) /* μ-Law エンコード */
#define AUDIO_ENCODING_ALAW (2) /* A-Law エンコード */
#define AUDIO_ENCODING_LINEAR (3) /* ライナーPCM */
/*
* record・play・monitorの音量で使用される値
*/
#define AUDIO_MIN_GAIN (0) /* 最小 */
#define AUDIO_MAX_GAIN (255) /* 最大 */
/*
* balanceで使用される値
* (左右の音量のバランスを表す)
*/
#define AUDIO_LEFT_BALANCE (0) /* 左だけ */
#define AUDIO_MID_BALANCE (32) /* 左右同じ */
#define AUDIO_RIGHT_BALANCE (64) /* 右だけ */
/*
* オーディオのポート名
* port・avail_ports・mod_portsで使用する
*/
/* 出力ポート(複数同時に使用できる) */
#define AUDIO_SPEAKER (0x01) /* 内蔵スピーカー */
#define AUDIO_HEADPHONE (0x02) /* ヘッドフォンジャック */
#define AUDIO_LINE_OUT (0x04) /* ライン出力 */
#define AUDIO_SPDIF_OUT (0x08) /* SPDIFポート */
#define AUDIO_AUX1_OUT (0x10) /* aux1 */
#define AUDIO_AUX2_OUT (0x20) /* aux2 */
/* 入力ポート(通常、同時に複数指定する事は不可能) */
#define AUDIO_MICROPHONE (0x01) /* マイク */
#define AUDIO_LINE_IN (0x02) /* ライン入力 */
#define AUDIO_CD (0x04) /* CD入力 */
#define AUDIO_SPDIF_IN (0x08) /* SPDIFポート */
#define AUDIO_AUX1_IN (0x10) /* aux1 */
#define AUDIO_AUX2_IN (0x20) /* aux2 */
#define AUDIO_CODEC_LOOPB_IN (0x40) /* 内蔵ループバック */
/* ハードウェアにより提供される機能を表す */
#define AUDIO_HWFEATURE_DUPLEX (0x00000001u)
/* 再生と録音を同時に行うことができる */
#define AUDIO_HWFEATURE_MSCODEC (0x00000002u)
/* マルチストリームCODEC */
/* ソフトウェアにより提供される機能を表す */
#define AUDIO_SWFEATURE_MIXER (0x00000001u)
/* audio mixer audio pers. mod. */
/* pers.が何なのか判らん*/
/*
* AUDIO_GETDEV ioctlで使用される。
* 現在のオーディオデバイスの特性を取得する。
*/
#define MAX_AUDIO_DEV_LEN (16)
struct audio_device {
char name[MAX_AUDIO_DEV_LEN];
char version[MAX_AUDIO_DEV_LEN];
char config[MAX_AUDIO_DEV_LEN];
};
typedef struct audio_device audio_device_t;
play.gainとrecord.gainは出力と入力の音量を表す。AUDIO_MAX_GAINは音量の最大を表す。オーディオ出力はoutput_mutedに非0を設定することで、一時的にミュートにすることができる。このフィールドをクリアすると、通常の状態で出力が再開される。ほとんどのオーディオデバイスでは、入力データを出力にミックスさせることができる。monitor_gainはこのフィードバックのレベルを表す。
play.portはオーディオデバイスにデータの出力先を指示する。これは、AUDIO_SPEAKER(内蔵スピーカー)・AUDIO_HEADPHONE(ヘッドフォンジャック)・AUDIO_LINE_OUT(ライン出力ポート)・AUDIO_AUX1_OUT(aux1)・AUDIO_AUX2_OUT(aux2)のいずれかである。いくつかのデバイスでは、これらのポートを複数組み合わせて使用することもできる。
play.avail_portsには現在使用可能な出力ポートの一覧を返す。play.mod_portsにはON/OFFを切り替えることができる出力ポートの一覧が設定される。play.mod_ports内に存在しないポートは、常にONであると仮定される。
record.portはオーディオデバイスの入力ポートを指定する。これは、AUDIO_MICROPHONE(マイクロフォンジャック)・AUDIO_LINE_IN(ライン入力ポート)・AUDIO_CD(内蔵CD)・AUDIO_AUX1_IN(aux1)・AUDIO_AUX2_IN(aux2)、AUDIO_CODEC_LOOPB_IN(内部ループバック)のいずれかを使用することができる。
record.avail_portsは現在使用可能な入力ポートの一覧を返す。recorde.mod.portsにはON/OFFを切り替えることができる入力ポートの一覧が設定される。recorde.mod_ports内に含まれないポートは常にONであると仮定される。入力ポートは排他的に使用することができる。
play.balanceとrecorde.balanceは、ステレオデータの左右のバランスを制御するのに使用される。AUDIO_LEFT_BALANCEとAUDIO_MID_BALANCEの間の値が指定された場合は、その指定された値に合わせて右側の音量が絞られる。逆に、AUDIO_MID_BALANCEとAUDIO_RIGHT_BALANCEの間に設定された場合には左側の音量が絞られる。
play.pauseとrecorde.pauseはSTREAMSバッファとオーディオデバイスの間のデータの流れを一時停止したり再開したりするのを制御する為に使用される。play.errorとrecorde.errorはアンダーフローやオーバーフローが起きたことを示す。play.activeとrecorde.activeは指定された方法での入出力が可能か否かを示す。
play.openとrecord.openは、設定されたパーミッションでオープンすることができるか否かを示す。play.waitingとrecorde.waitingはデバイスへのアクセスを待っているプロセスの有無を示す。これらのフラグはプロセスがopen()でブロックされたときに自動的に設定される。あるいは、AUDIO_SETINFO ioctlコマンドを使用したときにも設定される。これらの値は、プロセスがデバイスを閉じることによってアクセスを放棄したときにだけクリアされる。
play.sampleとrecord.sampleはopen()時に0が設定され、STREAMSバッファに入出力が行われたときにサンプル数分だけ加算される。いくつかのデバイスでは、ここのサンプルごとのカウントではなく、サンプルのバッファ数でカウントする様になっている事がある。よって、アプリケーションはsanmpleフィールドが常に正確なサンプル数を示していると期待するべきではない。play.eofは長さ0のバッファが処理されたときに加算される。アプリケーションは、特定のオーディオ出力時に特定のセグメントが処理されたことを検出するために、このフィールドを使用することができる。
recorde.buffer_sizeは、録音操作中にデバイスドライバ内にバッファリングされる入力データの量を指定する。低いレイテンシを要求する特定のアプリケーションでは、この値を適切な値に設定する必要がある。しかし、入力バッファを小さくするとシステムのオーバーヘッドが増加することに注意する必要がある。このフィールドの値はバイト単位で指定され、ドライバはサンプルフレームサイズの定数倍になるよう調整する。いくつかのデバイスでは、このフィールドの値に別の制約がある場合がある。詳細はデバイス指定のマニュアルを参照すること。
アプリケーションが使用するフォーマットを変更して、かつ、recorde.buffer_sizeの値を変更しなかった場合にはデフォルトの値が使用される。よって、この値を変更するアプリケーションはフォーマットを変更するときか、あるいはその後にこの値を変更するようにする必要がある。recorde.buffer_sizeを変更するときには、入力ストリームを一時停止し、フラッシュした後に変更するべきである。そうでなかった場合は、古いフォーマットで読み込まれたデータの後に新しいフォーマットのデータが続く、という形式になる。これは、新しく設定された値がサンプルレートを変更する場合は特に重要である。record.buffer_sizeが最初のパケットで変更された場合、最初もしくはそれ以降のバッファはデバイスのデフォルトのバッファサイズでなければならず、続くバッファは要求されたサイズになる。
record.buffer_sizeは/dev/audioを読み込み用に開いているプロセスでのみ変更することができる。
play.buffer_sizeは現在ではサポートしていない。
オーディオデータフォーマットは、sample_rate・channels・precision・encodingフィールドによって指定される。これらの値は、上記オーディオフォーマットセクションで述べたことに対応する。サポートしている値の組み合わせについては、デバイスのマニュアルを参照すること。
オーディオフォーマットを変更できるのは/dev/audioだけである。いくつかのデバイスでは入出力で同じフォーマットが使用される。この場合、デバイスが複数プロセスで開かれている時にはフォーマットを変更することができない。その為、データフォーマットを変更したときにはioctl()が失敗していないことを確認するべきである。
AUDIO_SETINFO ioctl()によって要求された変更を全て実施することができない場合、ioctl()はデバイスの状態を変更せずに処理を終了し、errnoにEINVALを設定する。
Streamio IOCTL
/dev/audioに対しては、全てのstreamio(7I) ioctlコマンドを使用することができる。/dev/audioctlデバイスは独自のSTREAMSキューを持っている。そのため、/dev/audioctlに対するほとんどのコマンドでは、/dev/audioの状態を変更したり、あるいは/dev/audioの状態を取得したりすることはできない。
/dev/audioctlに対するI_SETSIG ioctlによって状態変化の通知を有効にすることができる。
Audio IOCTL
オーディオデバイスは、下記のioctlをサポートしている。
AUDIO_DRAIN
引数は無視される。このコマンドは、出力STREAMSキューが空になるか、シグナルを受信するまでプロセスを停止させる。/dev/audioctlには使用できない。/dev/audioのcloes()は暗黙的にAUDIO_DRAINコマンドを含んでいる。
AUDIO_GETDEV
引数はaudio_device_t構造体へのポインタである。このコマンドは/dev/audioと/dev/aodioctlの両方に対して使用することができる。nameフィールドに返される値はカレントの/dev/audioハードウェアデバイスを識別する文字列であり、versionの値はハードウェアのバージョンを示す文字列であり、configはデバイスのプロパティを識別するデバイス依存の文字列である。実際の文字列については、デバイス指マニュアルページを参照すること。
AUDIO_GETINFO
引数はaudio_info_t構造体へのポインタである。このコマンドは/dev/audioと/dev/audioctlの両方に対して使用することができる。引数の構造体に、デバイスの現在の状態が返される。
AUDIO_SETINFO
引数はaudio_info_t構造体へのポインタである。このコマンドは/dev/audioと、ある程度の制約があるが/dev/audioctlにも使用することができる。このコマンドは、引数の構造体の値に従ってデバイスの設定を行う。また、構造体の値は設定された内容に従って変更される。
play.sample・record.sample・play.error・record.error・play.eofは、AUDIO_SETINFOが使用されたときにデバイスの状態が反映されることに注意すること。これにより、元の値に戻すときにこれらのフィールドの値を自動的に変更することができるようになる。
/dev/audioが相当するアクセスパーミッションで開かれていない場合、オーディオ情報構造体中の、pauseの様なある種のフィールドは読み込み専用として取り扱われる。そのほかの、音量やエンコード情報のようなフィールドには、設定できる値に制約がある。そのようなフィールドを変更するアプリケーションは、値の変更に成功したことを確認するために戻り値をチェックするべきである。sample_rate・channels・precision・encodingの各フィールドは、/dev/audioctlでは読み込み専用である。そのため、アプリケーションは、オーディオデバイスを閉じるまで、既存のオーディオフォーマットが適切な状態にあることを保証することができる。AUDIO_SETINFOで要求された設定変更に失敗した場合は、-1を返しerrnoにEINVALを設定する。また、他のプロセスがデバイスを使用していた場合にはEBUSYを設定する。
play.gain・record.gain・play.balance・record.balance・play.port・record.port・monitor_gain・output_mutedの各フィールドの値は、一度設定されるとデバイスのオープンやクローズ、自動的なアンロードを通じて、継続的に保持される。dbriドライバのために、デバイスドライバのアンロードが行われると、これらの値は自壊のロード時にデフォルト値にリセットされる。他の全ての設定は/dev/audioのI/Oストリームが閉じられたときにリセットされる。
audio_info_t構造体はAUDIO_INITINFOマクロによって初期化することができる。このマクロは全てのメンバにAUDIO_SETINFOコマンドでは無視される値を設定する。例えば、下記のコードでは他のメンバを変更しないで、出力ポートだけを内蔵スピーカーからヘッドフォンジャックに変更する。
audio_info_t info;
AUDIO_INITINFO(&info);
info.play.port = AUDIO_HEADPHONE;
err = ioctl(audio_fd, AUDIO_SETINFO, &info);
この方法はAUDIO_GETINFOの後にAUDIO_SETINFOを使う場合に生じうる問題を削減する。
エラー
デバイスのオープン時にエラーが発生した場合、errnoに下記の値が設定される。
EBUSY
再生もしくは録音アクセスがビジーであり、かつO_NDELAYかO_NONBLOCKフラグが設定されていた場合。
EINTR
録音もしくは再生アクセスがビジーであり、openで待機している最中にシグナルを受信した場合。
ioctl()でエラーが発生したとき、errnoに下記の値が設定される。
EINVAL
AUIOD_SETINFO ioctlで指定したパラメータが、デバイスでサポートしていないか無効だった場合。
EBUSY
デバイスが他のプロセスにより異なったフォーマットで使用されているために、AUDIO_SETINFO ioctlが失敗した場合。
FILES
指定された物理デバイス名がシステム依存のものだった場合。プログラムは下記の一般デバイス名を使用するべきである。
| /dev/audio |
プライマリオーディオデバイスへのシンボリックリンク |
| /dev/audioctl |
/dev/audioの制御デバイスへのシンボリックリンク |
| /dev/sound/0 |
システムの最初のオーディオデバイス |
| /dev/sound/0ctl |
/dev/sound/0の制御デバイス |
| /usr/share/audio/samples |
オーディオファイル |
このページの情報に間違いがあっても、俺は知らんぜ。
<< 「Solarisで音を出す」に戻る
|