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

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

`close`( | )

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

`fileno`( | )

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

`drain`( | )

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

`flush`( | )

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

`getinfo`( | )

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

`ibufcount`( | )

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

`obufcount`( | )

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

`read`( | size)

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

`setinfo`( | status)

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

`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)