# 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()` を呼び出さなければなりません。