39.3. "cd" --- SGI システムの CD-ROM へのアクセス
*************************************************

バージョン 2.6 で非推奨: "cd" モジュールは Python 3 で削除されました。

このモジュールは Silicon Graphics CD ライブラリへのインターフェースを
提供します。 Silicon Graphics システムだけで利用可能です。

ライブラリは次のように使われます。CD-ROM デバイスを "open()" で開き、
"createparser()" で CD からデータをパースするためのパーザを作ります。
"open()" で返されるオブジェクトは CD からデータを読み込むのに使われま
すが、 CD-ROM デバイスのステータス情報や、CD の情報、たとえば目次など
を得るのにも使われます。 CD から得たデータはパーザに渡され、パーザはフ
レームをパースし、あらかじめ加えられたコールバック関数を呼び出します。

オーディオ CD はトラック *tracks* あるいはプログラム *programs* (同じ
意味で、どちらかの用語が使われます) に分けられます。トラックはさらにイ
ンデックス *indices* に分けられます。オーディオ CD は、CD 上の各トラッ
クのスタート位置を示す目次 *table of contents* を持っています。インデ
ックス 0 は普通、トラックの始まりの前のポーズです。目次から得られるト
ラックのスタート位置は通常、インデックス 1 のスタート位置です。

CD 上の位置は 2 通りの方法で得ることができます。それはフレームナンバー
と、分、秒、フレームの 3 つの値からなるタプルの 2 つです。ほとんどの関
数は後者を使います。位置は CD の開始位置とトラックの開始位置の両方に相
対的になります。

"cd" モジュールは次の関数と定数を定義します:

cd.createparser()

   不透明なパーザオブジェクトを作って返します。パーザオブジェクトのメ
   ソッドは下に記載されています。

cd.msftoframe(minutes, seconds, frames)

   絶対的なタイムコードである "(minutes, seconds, frames)" の三つ組の
   表現を、相当する CD のフレームナンバーに変換します。

cd.open([device[, mode]])

   CD-ROM デバイスを開きます。不透明なプレーヤーオブジェクトを返します
   ； プレーヤーオブジェクトのメソッドは下に記載されています。デバイス
   *device* は SCSI デバイスファイルの名前で、例えば
   "'/dev/scsi/sc0d4l0'" あるいは "None" です。もし省略したり、 "None"
   なら、ハードウエアが検索されて CD-ROM デバイスを割り当てます。
   *mode* は、省略しないなら "'r'" にすべきです。

このモジュールでは以下の変数を定義しています:

exception cd.error

   様々なエラーについて発生する例外です。

cd.DATASIZE

   オーディオデータの 1 フレームのサイズです。これは "audio" タイプの
   コールバックへ渡されるオーディオデータのサイズです。

cd.BLOCKSIZE

   オーディオデータが読み取られていないフレーム 1 つのサイズです。

以下の変数は "getstatus()" で返されるステータス情報です:

cd.READY

   オーディオ CD がロードされて、ドライブが操作可能であることを示しま
   す。

cd.NODISC

   ドライブに CD がロードされていないことを示します。

cd.CDROM

   ドライブに CD-ROM がロードされていることを示します。続いて play あ
   るいは read の操作をすると、I/O エラーを返します。

cd.ERROR

   ディスクや目次を読み込もうとしているときに起こるエラー。

cd.PLAYING

   ドライブがオーディオ CD を CD プレーヤーモードでオーディオ端子から
   再生していることを示します。

cd.PAUSED

   ドライブが CD プレーヤーモードで、再生を一時停止していることを示し
   ます。

cd.STILL

   "PAUSED" と同じですが、古いモデル (non 3301) である Toshiba CD-ROM
   ドライブのものです。このドライブはもう SGI から出荷されていません。

cd.audio
cd.pnum
cd.index
cd.ptime
cd.atime
cd.catalog
cd.ident
cd.control

   これらは整数の定数で、パーザのいろいろなタイプのコールバックを示し
   ています。コールバックは CD パーザオブジェクトの "addcallback()" で
   設定できます (下記参照)。


39.3.1. Player オブジェクト
===========================

プレーヤーオブジェクト ("open()" で返されます)  には以下のメソッドがあ
ります:

CD player.allowremoval()

   CD-ROM ドライブのイジェクトボタンのロックを解除して、ユーザが CD キ
   ャディを排出するのを許可します。

CD player.bestreadsize()

   メソッド "readda()" のパラメータ *num_frames* として最適の値を返し
   ます。最適値は CD-ROM ドライブからの連続したデータフローが許可され
   る値が定義されます。

CD player.close()

   プレーヤーオブジェクトと関連付けられたリソースを解放します。
   "close()" を呼び出したあとでは、そのオブジェクトに対するメソッドは
   使用できません。

CD player.eject()

   CD-ROM ドライブからキャディを排出します。

CD player.getstatus()

   CD-ROMドライブの現在の状態に関する情報を返します。返される情報は以
   下の値からなるタプルです： *state* 、 *track* 、 *rtime* 、 *atime*
   、 *ttime* 、 *first* 、 *last* 、 *scsi_audio* 、 *cur_block* 。
   *rtime* は現在のトラックの初めからの相対的な時間； *atime* はディス
   クの初めからの相対的な時間； *ttime* はディスクの全時間です。それぞ
   れの値の詳細については、マニュアルページ *CDgetstatus(3dm)* を参照
   してください。 *state* の値は以下のうちのどれか一つです： "ERROR"
   、 "NODISC" 、 "READY" 、 "PLAYING" 、 "PAUSED" 、 "STILL" 、
   "CDROM" 。

CD player.gettrackinfo(track)

   特定のトラックについての情報を返します。返される情報は、トラックの
   開始時刻とトラックの時間の長さの二つの要素からなるタプルです。

CD player.msftoblock(min, sec, frame)

   分、秒、フレームの 3 つからなる絶対的なタイムコードを、与えられた
   CD-ROM ドライブの相当する論理ブロック番号に変換します。時刻を比較す
   るには "msftoblock()" よりも "msftoframe()" を使うべきです。論理ブ
   ロック番号は、CD-ROM ドライブによって必要とされるオフセット値が違う
   ため、フレームナンバーと異なります。

CD player.play(start, play)

   CD-ROM ドライブのオーディオ CD の特定のトラックから再生を開始します
   。 CD-ROM ドライブのヘッドフォン端子と (備えているなら) オーディオ
   端子から出力されます。ディスクの最後で再生は停止します。 *start* は
   再生を開始する CD のトラックナンバーです； *play* が0なら、CD は最
   初の一時停止状態になります。その状態からメソッド "togglepause()" で
   再生を開始できます。

CD player.playabs(minutes, seconds, frames, play)

   "play()" と似ていますが、開始位置をトラックナンバーの代わりに分、秒
   、フレームで与えます。

CD player.playtrack(start, play)

   "play()" と似ていますが、トラックの終わりで再生を停止します。

CD player.playtrackabs(track, minutes, seconds, frames, play)

   "play()" と似ていますが、指定した絶対的な時刻から再生を開始して、指
   定したトラックで終了します。

CD player.preventremoval()

   CD-ROM ドライブのイジェクトボタンをロックして、ユーザが CD キャディ
   を排出できないようにします。

CD player.readda(num_frames)

   CD-ROM ドライブにマウントされたオーディオ CD から、指定したフレーム
   数を読み込みます。オーディオフレームのデータを示す文字列を返します
   。この文字列はそのままパーザオブジェクトのメソッド "parseframe()"
   へ渡すことができます。

CD player.seek(minutes, seconds, frames)

   CD-ROM から次にデジタルオーディオデータを読み込む開始位置のポインタ
   を設定します。ポインタは *minutes* 、 *seconds* 、 *frames* で指定
   した絶対的なタイムコードの位置に設定されます。返される値はポインタ
   が設定された論理ブロック番号です。

CD player.seekblock(block)

   CD-ROM から次にデジタルオーディオデータを読み込む開始位置のポインタ
   を設定します。ポインタは指定した論理ブロック番号に設定されます。返
   される値はポインタが設定された論理ブロック番号です。

CD player.seektrack(track)

   CD-ROM から次にデジタルオーディオデータを読み込む開始位置のポインタ
   を設定します。ポインタは指定したトラックに設定されます。返される値
   はポインタが設定された論理ブロック番号です。

CD player.stop()

   現在実行中の再生を停止します。

CD player.togglepause()

   再生中なら CD を一時停止し、一時停止中なら再生します。


39.3.2. Parser オブジェクト
===========================

パーザオブジェクト ("createparser()" で返されます) には以下のメソッド
があります:

CD parser.addcallback(type, func, arg)

   パーザにコールバックを加えます。デジタルオーディオストリームの 8 つ
   の異なるデータタイプのためのコールバックをパーザは持っています。こ
   れらのタイプのための定数は "cd" モジュールのレベルで定義されていま
   す (上記参照)。コールバックは以下のように呼び出されます：
   "func(arg, type, data)" 、ここで *arg* はユーザが与えた引数、
   *type* はコールバックの特定のタイプ、 *data* はこの *type* のコール
   バックに渡されるデータです。データのタイプは以下のようにコールバッ
   クのタイプによって決まります:

   +---------------+-----------------------------------------------+
   | 型            | "値"                                          |
   +===============+===============================================+
   | "audio"       | "al.writesamps()" へそのまま渡すことのできる  |
   |               | 文字列。                                      |
   +---------------+-----------------------------------------------+
   | "pnum"        | プログラム (トラック) ナンバーを示す整数。    |
   +---------------+-----------------------------------------------+
   | "index"       | インデックスナンバーを示す整数。              |
   +---------------+-----------------------------------------------+
   | "ptime"       | プログラムの時間を示す分、秒、フレームからな  |
   |               | るタプル。                                    |
   +---------------+-----------------------------------------------+
   | "atime"       | 絶対的な時刻を示す分、秒、フレームからなるタ  |
   |               | プル。                                        |
   +---------------+-----------------------------------------------+
   | "catalog"     | CD のカタログナンバーを示す 13 文字の文字列。 |
   +---------------+-----------------------------------------------+
   | "ident"       | 録音の ISRC 識別番号を示す 12 文字の文字列。  |
   |               | 文字列は 2 文字の国別コ ード、3 文字の所有者  |
   |               | コード、2 文字の年、5 文字のシリアルナンバー  |
   |               | か らなります。                               |
   +---------------+-----------------------------------------------+
   | "control"     | CD のサブコードデータのコントロールビットを示 |
   |               | す整数。                                      |
   +---------------+-----------------------------------------------+

CD parser.deleteparser()

   パーザを消去して、使用していたメモリを解放します。この呼び出しのあ
   と、オブジェクトは使用できません。オブジェクトへの最後の参照が削除
   されると、自動的にこのメソッドが呼び出されます。

CD parser.parseframe(frame)

   "readda()" などから返されたデジタルオーディオ CD のデータの 1 つあ
   るいはそれ以上のフレームをパースします。データ内にどういうサブコー
   ドがあるかを決定します。その前のフレームからサブコードが変化してい
   たら、 "parseframe()" は対応するタイプのコールバックを起動して、フ
   レーム内のサブコードデータをコールバックに渡します。 C の関数とは違
   って、1 つ以上のデジタルオーディオデータのフレームをこのメソッドに
   渡すことができます。

CD parser.removecallback(type)

   指定した *type* のコールバックを削除します。

CD parser.resetparser()

   サブコードを追跡しているパーザのフィールドをリセットして、初期状態
   にします。ディスクを交換したあと、 "resetparser()" を呼び出さなけれ
   ばなりません。
