21.1.1 オーディオデバイスオブジェクト

オーディオデバイスオブジェクトはopen()で返され、このオブジェ クトには以下のメソッドが定義されています (controlオブジェクトは除きます。これにはgetinfo()setinfo()fileno()drain()だけが定義されて います):

close( )
このメソッドはデバイスを明示的に閉じます。 オブジェクトを削除しても、それを参照しているものがあって、すぐに閉じてく れない場合に便利です。 閉じられたデバイスを使うことはできません。

fileno( )
デバイスに関連づけられたファイルディスクリプタを返します。 これは、後述のSIGPOLLの通知を組み立てるのに使われます。

drain( )
このメソッドは全ての出力中のプロセスが終了するまで待って、それから制御が 戻ります。 このメソッドの呼び出しはそう必要ではありません: オブジェクトを削除すると自動的にオーディオデバイスを閉じて、暗黙のうちに 吐き出します。

flush( )
このメソッドは全ての出力中のものを捨て去ります。 ユーザの停止命令に対する反応の遅れ(1秒までの音声のバッファリングによっ て起こります)を避けるのに使われます。

getinfo( )
このメソッドは入出力のボリューム値などの情報を引き出して、オーディオス テータスのオブジェクト形式で返します。 このオブジェクトには何もメソッドはありませんが、現在のデバイスの状態を示 す多くの属性が含まれます。 属性の名称と意味は<sun/audioio.h>audio(7I)に記載があ ります。 メンバー名は相当するCのものとは少し違っています: ステータスオブジェクトは1つの構造体です。 その中の構造体であるplayのメンバーには名前の初めに"o_"がつ いていて、recordには"i_"がついています。 そのため、Cのメンバーであるplay.sample_rateo_sample_rateとして、record.gaini_gainとして 参照され、 monitor_gainはそのままmonitor_gainで参照されます。

ibufcount( )
このメソッドは録音側でバッファリングされるサンプル数を返します。 つまり、プログラムは同じ大きさのサンプルに対するread()の 呼び出しをブロックしません。

obufcount( )
このメソッドは再生側でバッファリングされるサンプル数を返します。 残念ながら、この数値はブロックなしに書き込めるサンプル数を調べるのには 使えません。というのは、カーネルの出力キューの長さは可変だからです。

read( size)
このメソッドはオーディオ入力からsizeのサイズのサンプルを読み込ん で、Pythonの文字列として返します。 この関数は必要なデータが得られるまで他の操作をブロックします。

setinfo( status)
このメソッドはオーディオデバイスのステータスパラメータを設定します。 パラメータstatusgetinfo()で返されたり、 プログラムで変更されたオーディオステータスオブジェクトです。

write( samples)
パラメータとしてオーディオサンプルをPython文字列を受け取り、再生します。 もし十分なバッファの空きがあればすぐに制御が戻り、そうでないならブロック されます。

オーディオデバイスはSIGPOLLを介して様々なイベントの非同期通知に対応して います。 Pythonでこれをどのようにしたらできるか、例を挙げます:

def handle_sigpoll(signum, frame):
    print 'I got a SIGPOLL update'

import fcntl, signal, STROPTS

signal.signal(signal.SIGPOLL, handle_sigpoll)
fcntl.ioctl(audio_obj.fileno(), STROPTS.I_SETSIG, STROPTS.S_MSG)

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。