2006年11月21日

GET PERFORMANCE その1

久しぶりの MMC です。
とはいえ、この "GET PERFORMANCE" はあまり使ったことがなく、ミニプログラムを作成して確認していたら「せんべえ焼き」での使い方が間違っているのがわかって冷や汗ものなのですが。

それでは、説明に入ります。

ドライブに挿入されているメディアの書き込み可能な速度などを取得するには、 GET PERFORMANCE コマンドを使います。
GET PERFORMANCE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xAC
1予約Data Type
2
(MSB)
 
Starting LBA
 
(LSB)
3
4
5
6予約
7予約
8
(MSB)
Maximum Number of Descriptors
(LSB)
9
10Type
11Control


Data Type、Starting LBA、Maximum Number of Descriptors は、 Type によって意味が変わったり、使われなかったりします。

その Type を変更することで、以下のような情報を入手できます。

Type意味
0x00Performance data
0x01Unusable Area data
0x02Defect Status data
0x03Write Speed Descriptor
0x04DBI
0x05DBI Cache Zone
0x06〜0xFF予約


ここでは、使ったことのある Performance data と Write Speed Descriptor を説明してゆく予定です。

posted by 七癖 at 11:04| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月29日

CLV と CAV

音楽CDでは、データの読み出し速度を一定にしなければなりません。
でないと、音質が変化するか、曲の速度が変わってしまいます。
このためには、記録密度が半径によって変わらない場合、
ヘッドがディスクをなぞる速度を一定にしてやります。
これを、CLV (Constant Linear Velocity:線速度一定) といいます。
単純に考えると、速度=角速度×半径 ですから、
中心から離れるに従って回転数を落としてやります。





CLVでは、半径位置によって回転速度を変えねばならないため、機構的に大変です。
一度メモリなどに取り込んでから使用するデータでは、
なにも等速でデータを取得する必要はありませんし、
回転数を一定に保つ方が簡単です。
これを、CAV (Constant Angular Velocity:角速度一定) といいます。






CD の基本は CLV ですが、この方式だと、
内側では回転数が大いため、振動が大きくなり、
高速の書き込みが不安定になるので、
いろいろな工夫がされているようです。
その一つが、ZCLV (Zone Constant Linear Velocity) で、
速度を段階的に上げてゆく方式です。



実際には、メーカーやドライブによって、
かなりの差があります。

ZCLV の場合、ドライブの性能表に書いてある○○倍速というのは、
たいていの場合、平均ではなく最大速度での値です。
メディアを端から端まで記録する場合、CLVの倍速値よりも時間がかかります。

このあたり、CD-R実験室に膨大な計測データがあります。

なお、各グラフは正確ではありません。感覚的にはこれで合っているかと思います。
posted by 七癖 at 11:38| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月27日

CD,DVD の速度などの判っていない話

今日は、判ってないという話をします。

CD の読み取り、書き込み速度は、音楽CDが基準となっています。
CDの1セクタは2352バイトで、1秒間は75フレーム(セクタ)ですから、
2352 × 75 = 176,400 Byte/sec となります。
データCDでは、Mode1の場合1セクタあたりの実データは2048バイトですから、
2048 × 75 = 153,600 Byte/sec に見えます。
実際には、位置情報やエラー訂正情報、サブチャネルの情報なども
同時に読み書きしているので、メディアとドライブとの間では、
より多くのデータの授受がおこなわれています。
MMC の速度に関するコマンドでは、音楽CD の基準で設定するはずです。

続きを読む
posted by 七癖 at 08:27| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月21日

CD/DVD Capabilities and Mechanical Status のテスト

前に相当いい加減な事を書いた、 MODE SENSE コマンドで取得する CD/DVD Capabilities and Mechanical Status Page ですが、 少し前のMMCの仕様書には「SET CD SPEED で指定する速度はこれで取得しろ」と書いてあり、 またどこかの英語の掲示板に、READ DISC INFORMATION で上手くいかなかった人に対して こっちを使えという回答があったような覚えがあるので、 MODE SENSE コマンドで CD/DVD Capabilities and Mechanical Status Page を取得する サンプルプログラムを作ってみました。

discinfo.cpp

DOSプロンプト上で動きます。
例によって ASPI 専用です。

これで、ドライブのバッファ容量と、書き込み速度を表示します。

実行してみると、
書き込めないドライブ(HL-DT-ST GSA-4081B)では書き込み速度は出ません。
記録可能なドライブ(JLMS XV-HD165H)では、 ドライブに何も入っていないときにはCDの書き込み速度の一覧が出るようです。

ディスクが入っていると、一応そのディスクに対応した速度の一覧が出ます。
書き込んであっても一覧が出ます。

いやはや、やってみるものです…ってやべえ。「せんべえ焼き」を直さないと。
手元にある環境で試した結果を見る
posted by 七癖 at 09:22| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月17日

READ DISC INFORMATION のテスト

READ DISC INFORMATION コマンドの動作確認用のサンプルプログラムです。

discinfo.cpp

DOSプロンプト上で動きます。
例によって ASPI 専用です。

これで、ドライブに入っているメディアが、
空(Empty)か、書き込まれている(Complete)か、
消去可能(Erasable)か、
リードインとリードアウトの開始位置、
などを表示します。

リードインとリードアウトの開始位置は、空の CD-R/W でないと正確に表示されません。

実は、READ DISC INFORMATION コマンドにある Opc Table Entries が取得できれば、そのデバイスとディスクの組み合わせがサポートしている書き込み速度がわかるのではと思ったのですが、何も出てこない…。取得できたデータ長が32バイトしかない。う〜ん。
posted by 七癖 at 09:40| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月15日

READ DISC INFORMATION その2

READ DISC INFORMATION コマンドで入手されるデータの構造は、次のとおりです

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
Disc Information Length
(LSB)
1
2予約ErasableState of last SessionDisc Status
3Number of First Track on Disc
4Number of Sessions (Least Significant Byte)
5First Track Number in Last Session (Least Significant Byte)
6Last Track Number in Last Session (Least Significant Byte)
7DID_VDBC_VURU予約DBitBG Format Status
8Disc Type
9Number of Sessions (Most Significant Byte)
10First Track Number in Last Session (Most Significant Byte)
11Last Track Number in Last Session (Most Significant Byte)
12
(MSB)
Disc
Identification
(LSB)
13
14
15
16
(MSB)
Last Session Lead-in Start Time
HMSF
(LSB)
17
18
19
20
(MSB)
Last Possible Start Time for Start of Lead-out
HMSF
(LSB)
21
22
23
24
(MSB)
Disc Bar Code
(LSB)
31
32予約
33Number of OPC Table Entries (=n)
34〜34+8*nOPC Table Entries

よくわかっていないパラメータも多いので、 適当に飛ばします。

Disc Information Length はこのデータの全記述に必要なバイト数です。 ただし、それ自体のバイト数 (2バイト) が除かれています。 OPC Table Entries の数によって変わるので、必要によっては この値を入手した後でメモリを確保し直し、もう一度コマンドを送ってください。

Disc Status では、メディアが空かどうかが判ります。

Disc Status意味
00B空のディスク
01B追記可能なディスク(上書き可能も含まれるかも)
10Bデータが書かれたディスク(ROM と焼かれた R/W)
11Bその他


State of last Session は、追記する際の最後のセッションの状態を返します。

Status意味
00B空のセッション
01B追記可能なセッション
10B予約 もしくは DVD-R/W では壊れたセッション
10B完全なセッション


Erasable が 1 ならば消去可能なメディア、つまり RW か RAM などです。 0 であれば、消去不可、つまり ROM か 焼かれた ±R メディアです。

Number of First Track は、空の CD-R/W では 0 で、それ以外は 1 です。

Number of Sessions は、セッション数、
First Track Number in Last Session は、最後のセッションにおける最初のトラック番号、
Last Track Number in Last Session は、最後のセッションにおける最後のトラック番号、
です。(直訳ですみません。)

DID_V (Disc ID Valid) が 1 ならば、Disc Identification が有効です。
DBC_V (Disc Bar Code Valid) が 1 ならば、Disc Bar Code field が有効です。

Disc Type は次のとおりです。

Disc Type意味
0x00CD-DA または CD-ROM
0x10CD-I
0x20CD-ROM XA
0xFF決まっていない
予約


Last Session Lead-in Start Time は、書き込みのスタート位置です。
Last Possible Start Time for Start of Lead-out は、データを書き込める最後の位置です。
この2つは CD-R/W で有効です。 ROM や 終了した -R/W では FF:FF:FF:FF (=70016880 lba) という値が返ってきます。 空の DVD±R/W などでは 0 です。 DVD などでは、READ DISC STRUCTURE コマンドを使ってください。


Number of OPC Table Entries は、OPC Table Entries の数です。

OPC Table Entries は、1ブロックが8バイトで、その構造は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
Speed (kBytes per second)
(LSB)
1
2
(MSB)

 
 
OPC
Values
 
 

(LSB)
3
4
5
6
7

OPC Values はメーカー毎に異なります。

posted by 七癖 at 08:21| Comment(0) | TrackBack(1) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月13日

READ DISC INFORMATION その1

ドライブに挿入されているメディアの情報を入手するには、 READ DISC INFORMATION コマンドを使います。 このコマンドでは、メディアが空か、消去可能か、 CD-R/W ではどこからどこまで書き込めるか、 などがわかります。

READ DISC STRUCTURE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x51
1予約
2予約
3予約
4予約
5予約
6予約
7
(MSB)
Allocation Length
(LSB)
8
9Control


Allocation Length には受け取るバッファのバイト数を入れます。
posted by 七癖 at 10:28| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月11日

SET CD SPEED のテスト

SET CD SPEED の動作確認がしたくて、DOSプロンプト上で動くこんなプログラムを作ってみました。

cdspeed.cpp

今回はソースコードのみ。
例によって ASPI 専用です。

動作の内容は、書き込み速度を CD の?倍速で入力し、それを KBytes/sec に直して CLV でコマンドを送ってみて、エラーかどうか確かめる、というものです。読み取り速度は 0xFFFF KBytes/sec にしてあります。

で、やってみた結果、
メディアが入っていないと、エラーが出ます。
メディアを入れた直後でもえらーになります。
それ以外は…何でもOK?

っていうか、書き込み能力の無いドライブでも、
メディアに CD-ROM を入れてもエラーが出ない…。

よく考えたら、このコマンドは読み取り速度と書き込み速度を同時に指定するものだから、書き込みが出来ないからといってエラーを出していたら困りますよね。

また、速度に無茶な値を入れても大丈夫のようです。200倍速とか、コードを変えて、1 KBytes/sec とかでもエラーが出ませんでした。おそらく、可能な速度に修正されるのでしょうが。

ついでに、ソースを変えて読み取り速度を変更するようにしたところ、遅い速度(1倍速とか2倍速)ではプログラム終了後の読み取り動作が確かに遅くなりました。ファイルマネージャーでファイルの一覧を読み取るところから遅くなって、ファイルをハードディスクへコピーするのにも時間がかかるようになりました。なお、ディスクを取り出せば元に戻ります。
posted by 七癖 at 09:29| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年10月09日

SET CD SPEED

CD の読み取り、書き込み速度を指定するには、SET CD SPEED コマンドを使います。

SET CD SPEED コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xBB
1予約Rotational Control
2
(MSB)
Logical Unit Read Speed (Kbytes/sec)
(LSB)
3
4
(MSB)
Logical Unit Write Speed (Kbytes/sec)
(LSB)
5
6予約
7予約
8予約
9予約
10予約
11Control


Rotational Control は書き込みに適用されます。

Rotational ControlControl
00BCLV and non-pure CAV
01BPure CAV
10B予約
11B予約

CLV は Constant Linear Velocity、線速度一定、
CAV は Constant Angular Velocity、角速度一定(回転数一定)のことです。
CAV の場合、79:59:74 MSF の位置での速度と仮定されるようです (CAVは使ったことが無い)。 古いバージョンだと non-pure CAV と Pure CAV の区別は無いようです。

Logical Unit Read Speed には読み取り速度を、
Logical Unit Write Speed には読み取り速度を、
Kbytes/sec 単位で指定します。
サポートしていない速度の場合は、 それより遅いが可能な最速値に設定されます。 設定が遅すぎるときは可能な最小の速さに、 速すぎるときは可能な最大の速さに設定されます。 0xffff に設定すれば最大速度になります。

このコマンドで指定した設定はメディアが取り出されるまで有効です。
posted by 七癖 at 16:05| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月29日

SEND OPC INFORMATION

OPC は Optimum Power Calibration の略です。R/Wメディアには 書き込む前にレーザー出力を調整する場所(Power Calibration Area, (PCA))があり、 そこを使ってその日そのメディアでのレーザー出力を最適化するために SEND OPC INFORMATION を使います。

SEND OPC INFORMATION コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x54
1予約DoOpc
2予約Exclude 1Exclude 0
3予約
4予約
5予約
6予約
7
(MSB)
Parameter List Length
(LSB)
8
9Control

DoOpc を 1 にすると、現在の速度におけるレーザー出力の最適化を行います。 その際、Parameter List Length は 0 にしてください。 その後の書き込みでは、最適化された出力値が使われます。

DoOpc を 0 にする場合、こちらからパラメーターのリストを送って 出力を手動で設定するようですが、使ったことがありません。

Exclude 1 と Exclude 0 は、2層メディア用です。 0 にすれば、そのレイヤーを調整するようです。 古いバージョンでは対応していません。

とりあえず自動的に最適化したい場合には、 書き込む直前に DoOpc のみを 1 にして 送っておきましょう。 感覚的には、CD-R/W より DVD±R/W の方が時間がかかるようです。


CD Manipulator では、"レーザー出力の最適化を行う(Power Calibration)" でこの機能を使うか選択できます。

posted by 七癖 at 08:27| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月27日

SYNCHRONIZE CACHE

SYNCHRONIZE CACHE コマンドは、メディアへの書き込みを終える時に使用します。 メディアへ書き込む時、送ったデータはいったんドライブのバッファメモリに蓄えられ、 ドライブ側がタイミングを計りつつ書き込んでゆくのですが、 SYNCHRONIZE CACHE コマンドを送信すると、バッファ内のデータが無くなるまで 書き込みを行います。また、リードアウトのデータをこちらから送らない場合には、 リードアウトを自動的に作成して書き込んでくれます。 ですから、このコマンドは結構時間がかかることがあります。

SYNCHRONIZE CACHE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x35
1予約IMMED廃止
2
(MSB)

論理ブロックアドレス
(LSB)
3
4
5
6予約
7
(MSB)
ブロック数
(LSB)
8
9Control

IMMED (Immediate) を 0 に設定すると、このコマンドが完了するまで 帰ってきません。1 に設定すると取り合えず処理が手元に戻るので、 コマンドの終了は CDB の値を確認しつつ行うのですが、 使ったことがありません。

"論理ブロックアドレス" と "ブロック数" は無視されます。

書き込みの最後には、必ずこの SYNCHRONIZE CACHE コマンドを送信するようにしましょう。


書き込みの途中にエラーで終了する場合にも、すぐ終わるのではなくこのコマンドを通しておけば、 ディスクを一応閉じてくれます。でないと、書き込んであるのに書き込んでいない、 あるいはその逆と誤認されるディスクが出来ます。 (RWメディアでそうなった場合には、強制的にフォーマットする アプリケーションを使いましょう。)

posted by 七癖 at 16:34| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月23日

WRITE (10)

CD/DVD-R/W の所定の位置にデータを書き込むには WRITE (10) コマンドを使用します。

WRITE (10) コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x2A
1予約FUA予約TSR予約
2
(MSB)
書き込む位置の

論理ブロックアドレス
(LSB)
3
4
5
6予約
7
(MSB)
データの大きさ [ブロック数]
(LSB)
8
9Control

FUA (force unit access) と TSR (Timely Safe Recording)は とりあえず 0 でいいでしょう。TSRは古いバージョンでは対応していません。 (例によって使ったことがありません。)

"論理ブロックアドレス"はCD-R/Wの場合、前に示した変換式を使って計算してください。

"データの大きさ" の "ブロック数" とは、書き込むセクタの数(フレームの数)です。 1ブロックの大きさ(バイト数)は、CDの場合、 http://senbee.seesaa.net/article/23386916.html (track at once または packet または raw mode) か、SEND CUE SHEET (session at once) で決めます。


ストリーミング書き込み?をするときは、WRITE (12) コマンド (Operation Code = 0xAA) を使いますが、 やはり試したことはありません。
posted by 七癖 at 06:51| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月21日

SEND CUE SHEET その3

これを書いていて気付いたのですが、Q Sub-Channel ADR=2,3 に間違いがありましたので、修正しました。


それでは、SEND CUE SHEET の続きです。


メディアカタログ番号 (MCN) は13文字で表されるので、 8バイトのブロックを2つ使用します。 (ここを、その1で最初にアップした例が間違っていました。)

BYTE\bit 7 6 5 4 3 2 1 0
0CTL/ADR = 0x02
1N01
2N02
3N03
4N04
5N05
6N06
7N07
BYTE\bit 7 6 5 4 3 2 1 0
0 (8)CTRL/ADR = 0x02
1 (9)N08
2 (10)N09
3 (11)N10
4 (12)N11
5 (13)N12
6 (14)N13
7 (15)0x00

CTRL は 0 です。
N01 〜 N13 には、MCN の ASCII 文字がそのまま入ります。 (1文字を4ビットで表していた Q Sub-Channel と文字表現が異なるので注意。)


国際標準レコーディングコード (ISRC) は12文字で表されるので、 やはり8バイトのブロックを2つ使用します。 (ここも、その1で 最初にアップした例が間違っていました。)

BYTE\bit 7 6 5 4 3 2 1 0
0CTRLADR = 0x03
1TNO
2I01
3I02
4I03
5I04
6I05
7I06
BYTE\bit 7 6 5 4 3 2 1 0
0 (8)CTRLADR = 0x03
1 (9)TNO
2 (10)I07
3 (11)I08
4 (12)I09
5 (13)I10
6 (14)I11
7 (15)I12

CTRL と TNO には、その2で説明したそのトラックの CTRL と TNO (トラック番号) を入れます。
I01 〜 I12 には、ISRC の ASCII 文字がそのまま入ります。
(ここも、I01〜I05を6ビットで、I06〜I12を4ビットで表していた Q Sub-Channel と文字表現が異なるので注意。)

posted by 七癖 at 10:48| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月19日

SEND CUE SHEET その2

前回は、お見苦しいところをお見せしました。
ご指摘のあった点以外にも間違いがありましたので、 さきほど直しました。
それから、2006/07/31 の Sub Q Channel の説明にも間違いがありましたので、直しました。


気を取り直して、(間違いを恐れずに)SEND CUE SHEET の説明の続きをします。


リードイン、リードアウト、および各トラックとそのインデックスの 開始位置を記述するブロックのフォーマットは次の通りです。

BYTE\bit 7 6 5 4 3 2 1 0
0CTRLADR
1TNO
2INDEX
3DATA FORM
Sub-channelMain Data
4SCMS
5開始時間 (分)
6開始時間 (秒)
7開始時間 (フレーム =1/75秒)


ADR はそのブロックの内容を表します。

ADR内容
1トラックとインデックスの開始位置
2MCN
3ISRC

ADR が異なると 1〜7 バイトの意味が全く変わります。


Ctrl (コントロール/制御フィールド) は、ビット毎に意味があります。

bitCtrl
70=2チャンネルオーディオ 1=4チャンネルオーディオ
60=音楽トラック 1=データトラック
5コピー 0=禁止 1=許可
4プリエンファシス 0=なし 1=50/15

Ctrl = 0100b で、データトラックになります。


TNO はトラックの番号です。
リードインは TNO = 0x00
リードアウトは TNO = 0xAA
に、それぞれ設定してください。


INDEX は各トラックのインデックス番号です。
リードインでは INDEX = 0x00
リードアウトでは INDEX = 0x01
に、それぞれ設定してください。


DATA FORM では各トラックのモードと、 書き込む際に送るデータの大きさを指定します。
Main Data (下位6ビット) に設定できる値の一覧を次に示します。

DATA FORM形式送るバイト数注釈
0x00CD-DA2352オーディオデータ
0x01CD-DA0 
0x10mode 12048データ本体のみ
0x11mode 12352ヘッダや訂正コードを含める
但し、送ったヘッダや訂正コードは無視され、書き込み位置や送ったデータ本体から作成される
0x12mode 12048送ったデータは全て無視される
0x13mode 12352送ったデータは全て無視される
0x14mode 10 
0x20mode 2 form 1,22336サブヘッダ+データ本体+訂正コード
但し、送った訂正コードは無視され、送ったデータ本体から作成される
0x21mode 2 form 1,22352ヘッダ、サブヘッダ、訂正コードなどを含める
但し、送ったヘッダや訂正コードは無視され、書き込み位置や送ったデータ本体から作成される
0x22mode 2 form 1,22336サブヘッダ (0〜7バイト目) 以外は無視される
0x23mode 2 form 1,22352サブヘッダ (16〜23バイト目) 以外は無視される
0x24mode 2 form 20 
0x30mode 22336データ本体のみ
0x31mode 22352ヘッダを含める
但し、送ったヘッダは無視され、書き込み位置から作成される
0x32mode 22336送ったデータは全て無視される
0x33mode 22352送ったデータは全て無視される
0x34mode 20 


"送るバイト数"が 0 になっている部分では、 そのインデックスでは空のデータが自動的に書き込まれると思われます。
"mode 2 form 1,2" となっている部分では、送られたサブヘッダから形式が判断されます。 なお、DATA FORM = 0x24 の form 1 はありません。
リードインとリードアウトでは 0x01 に設定してください。

続いて Sub-channnel (上位2ビット) に設定できる値を次に示します。

DATA FORM送るバイト数注釈
00サブチャネルは自動的に作成される
196RAW 形式のデータを送る
396PACK DATA

DATA FORM = 0x00 しか使ったことがありません。
リードインでは 0 か 1 に、 リードアウトでは 0 に設定してください。


SCMS は Selial Copy Management System のことです。 最上位ビット(bit 7)で ON/OFF を設定します。


開始時間 (分、秒、フレーム) はトラック1のインデックス0からの経過時間を設定します。 よって TNO=1 & INDEX=0 では 0分0秒0フレーム です。 なお、リードイン (TNO=0) でも DATA FORM = 0x41 (8ビットで)以外の場合(=0x01) は、0分0秒0フレーム にしてください。 なお、データCDおよび多くの音楽CDの TNO=1 & INDEX=1 では、0分2秒0フレーム です。 "せんべえ焼き"では、そのように設定しています。

それから、TNO、INDEX、開始時間 (分、秒、フレーム) は、 BCD変換した値ではなく、普通の値を送ります。トラック 99 の場合は TNO=0x63 です。 "せんべえ焼き" 過去のバージョンでは、この間違いのせいで ひどい結果が生じるので、最新版を使うようにお願いします。


ここまで書いてみて、いろいろと矛盾する記述があると思います。 これは、私が一部の機能しか使っておらず、その経験からの思い込みをそのまま書いている部分が多いためです。 SEND CUE SHEET でも リードインや各トラックのサブチャネルを直接書き込む ような使い方も出来るみたいです。 やったことはありませんが。

posted by 七癖 at 10:59| Comment(8) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月17日

SEND CUE SHEET その1

CD-R/W をセッションアットワンス方式で書き込む時には、 データ本体の転送する前に SEND CUE SHEET コマンドで トラックの構造をドライブに送ります。 ユーザーはデータ本体のみを逐次転送すればよく、 リードイン、リードアウト、サブチャネル、 そして設定によってはメインチャネルのヘッダやエラー検出、修正コードなどは SEND CUE SHEET コマンドで設定された内容にしたがって自動的に書き込まれます。

SEND CUE SHEET コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x5D
1予約
2予約
3予約
4予約
5予約
6
(MSB)
Cue Sheet の大きさ [byte]
(LSB)
7
8
9Control



SEND CUE SHEET コマンドで設定するトラックの構造は、 "せんべえ焼き" や "CD Manipularor" で使用する、 あのテキストファイルとして記述されメモ帳などで簡単に閲覧、編集できる 形式ではありません。 ドライブ側が判るように翻訳した形になります。

そのフォーマットは、一つが8バイトのブロックを順にならべたものです。 一つのブロックには、
トラックとインデックスの開始位置
MCN (Media Catalog Number、メディアカタログ番号)
ISRC (International Standard Recording Code、国際標準レコーディングコード)
のいづれかを記述します。

トラックとインデックスは順番に書き込みます。
MCN を書き込む場合には、全ブロックの一番先頭に置きます。 無ければ省略できます。
ISRC を書き込む場合には、そのトラックの先頭に置きます。
無ければ省略できます。

Byte No内容注釈
0〜7MCN 1〜7 
8〜15MCN 8〜13 
16〜23Lead In (Track 0)必須
24〜31Track 1 ISRC 1〜6 
32〜39Track 1 ISRC 7〜12 
40〜47Track 1 Index 0必須
48〜55Track 1 Index 1必須
56〜63Track 2 ISRC 1〜6 
64〜71Track 2 ISRC 7〜12 
72〜79Track 2 Index 0 
80〜87Track 2 Index 1Track 2 があれば必須
・・・・・・・・・
8*(m-1)〜8*m-1Lead Out (Track AA)必須

トラック2以降のインデックス 0 はなければ省略できますが、 トラック1のインデックス 0 と全トラックのインデックス 1 は必要です。

いらないところは詰めてください。 1トラックのデータCDで、MCNが無い場合(データCDではISRCは無い)、 4ブロック32バイトのデータを送れば十分です。


ふと疑問に思ったのですが、 インデックス2以降は設定できるのでしょうか。 ("せんべえ焼き"では .cueファイルの INDEX 2 以降を無視するため不可)


2006/09/18 修正
2006/09/19 修正

posted by 七癖 at 12:57| Comment(2) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月11日

CD/DVD Capabilities and Mechanical Status Page

CD/DVD Capabilities and Mechanical Status Page では、 ドライブデバイスの能力に関する情報を入手できるのですが、 下を見て判るように昨今の規格の乱立によってフラグの立て場所が足りなくなってしまいました。 将来的には消え去る運命にあると思われます。 "せんべえ焼き"ではもっぱらドライブのバッファ容量(Buffer Size Supported)を入手するために使っています。 (READ BUFFER CAPACITY コマンドはディスクが入っていないと使えないため)

CD/DVD Capabilities and Mechanical Status Page のデータフォーマットは次の通りです。

BYTE\bit 7 6 5 4 3 2 1 0
0PS予約Page Code = 0x2A
1データ長さ
2予約 DVD- RAM ReadDVD-R ReadDVD-ROM ReadMethod 2CD-RW ReadCD-R Read
3予約 DVD- RAM WriteDVD-R Write予約Test WriteCD-R/RW WriteCD-R Write
4BUFMulti SessionMode 2 Form 2Mode 2 Form 1Digital Port (2)Digital Port (1)CompositeAudio Play
5Read Bar CodeUPCISRCC2 Pointers supportedR-W Deinterleaved & correctedR-W SupportedCD-DA Stream is AccurateCD-DA Cmds Supported
6Loading Mechanism Type予約Eject (Individual or Magazine)Prevent JumperLock StateLock
7予約R-W in Lead-InSide Change CapableS/W Slot Selection (SSS)Changer Supports Disc PresentSeparate Channel MuteSeparate volume levels
8
(MSB)
廃止
(LSB)
9
10
(MSB)
Number of Volume Levels Supported
(LSB)
11
12
(MSB)
Buffer Size Supported
(LSB)
13
14
(MSB)
廃止
(LSB)
15
16予約
17予約LengthLSBFRCKBCKF予約
18
(MSB)
廃止
(LSB)
21
22
(MSB)
Copy Management Revision Supported
(LSB)
23
24
 
予約
 
26
27予約Rotation Control Selected
28
(MSB)
Current Write Speed Selected
(LSB)
29
30
(MSB)
Number of Logical Unit Write Speed Performance Descriptor Tables (n)
(LSB)
31
32
(MSB)
Logical Unit Write Speed Performance Descriptor Block #1
(LSB)
35
36
(MSB)
Logical Unit Write Speed Performance Descriptor Block #2
(LSB)
39
4*n+28
(MSB)
Logical Unit Write Speed Performance Descriptor Block #n
(LSB)
4*n+31
 Padding


各パラメータの内 Logical Unit Write Speed Performance Descriptor Block は、以下のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0予約
1予約Rotation Control
2
(MSB)
Write Speed Supported (kbytes/sec)
(LSB)
3


このブログ全体にいえることですが、写し間違いがあったらごめんなさい。というより指摘してください。

2006/10/21修正
2007/01/23修正
posted by 七癖 at 09:41| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月09日

Write Parameters Page つづき

前回説明した Write Parameters Page の内、Data Block Type の説明を忘れていました。

読み込みのときは READ CD (MSF) コマンドで読み取る部分をいちいち指定したのですが、 書き込む際には送るデータブロックの形式を、これで先に指定しておきます。

Data Block Type1セクタあたりに
必要なバイト数
内容
02352メインチャンネルのRAWデータ 2352 バイトのみ
12368メインチャンネルのRAWデータ 2352 バイト +
16 バイトのP-Qサブチャネルデータ
22448メインチャンネルのRAWデータ 2352 バイト +
96 バイトのP-Wサブチャネルデータ (packed)
32448メインチャンネルのRAWデータ 2352 バイト +
96 バイトの生(RAW)のP-Wサブチャネルデータ
82048Mode1 2048 バイトのユーザーデータのみ
92336Mode2 2336 バイトのユーザーデータのみ
102048Mode2 Form1 2048 バイトのユーザーデータのみ
サブヘッダには同時に指定する Sub-header Byte 0〜3 の値を使用します。
112056Mode2 Form1 サブヘッダ 8 バイト + 2048バイトのユーザーデータ
122324Mode2 Form2 2324 バイトのユーザーデータのみ
サブヘッダには同時に指定する Sub-header Byte 0〜3 の値を使用します。
132332Mode2 Form2 サブヘッダ 8 バイト + 2332 バイトのユーザーデータ

Write Type に 0x03 (RAW) を指定した場合は、 Data Block Type に 1 か 3 を選択し、Write (10) コマンドで メインチャネルとサブチャネルのデータを一緒に(つなげて)送ります。

Write Type に 0x02 (Session At Once) を指定した場合は、 Data Block Type に 0 もしくは 8〜13 を選択します。 これは、SEND CUE SHEET コマンドで指定したデータトラックに適用されます。 8〜13 を選択した場合は 同期信号やヘッダ、CRC (EDC) や P parity、Q parity などを自動的に計算して 書き込んでくれます。 音楽トラックでは1セクタあたりの大きさは 2324 で一定なので、 ミックスCDを作ろうという場合にはトラック毎に送るデータ量に注意してください。 音楽トラックばかりの場合や、キューシートの内容が MODE1/2352 のような 場合には、Data Block Type に 0 を選択します。


これを書いていて、RAW+96(Packed) を一度も試したことが無いことに気付いた…。

posted by 七癖 at 00:09| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月07日

Write Parameters Page

MODE SENSE で所得し、MODE SELECT で変更できる Write Parameters Page では、 ±R/Wメディアへの書き込みの設定を扱います。

Write Parameters Page のデータフォーマットは次の通りです。

BYTE\bit 7 6 5 4 3 2 1 0
0PS予約Page Code = 0x05
1データ長さ = 0x32
2予約BUFELS_VTest WriteWrite Type
3Multi-sessionFPCopyTrack Mode
4予約Data Block Type
5Link Size
6予約
7予約Initiator Application Code
8Session Format
9予約
10
(MSB)
Packet Size
 
(LSB)
11
12
13
14
(MSB)
Audio Pause Length
(LSB)
16
17
(MSB)
Media Catalog Number
(LSB)
31
32
(MSB)
International Standard Recording Code
(LSB)
47
48Sub-header Byte 0
49Sub-header Byte 1
50Sub-header Byte 2
51Sub-header Byte 3
52
 
Vendor Specific
 
55


BUFE を1に設定すると、バッファアンダーランを防止します。 (CD Manipulator のソースコードをみる限りではこの表現で正しいと思うのだが、 MMCの英文を眺めているとひょっとして間違っているのではないかと不安になってきた。)

Write Type は以下の通りです

Write Type方法備考
0x00Packet/Incremental使ったことがない…
0x01Track At Once
トラックアットワンス
DVDは不可。
使ったことがない…
0x02Session At Once
セッションアットワンス
リードインからリードアウトまで通して記録する方法。 リードインは最初のデータエリアを書き込むよう指示したときに、 リードアウトは最後のデータエリアを書き込んだ後で直ぐに書き込まれる。 DVD では Disc at Once (ディスクアットワンス)ともいう。
0x03RAWCDでリードインやリードアウト、 サブチャネルまでドライブ(ドライバーもしくはファームウェア)に任せず 自分で(プログラム側で)指定する場合に用いる。 DVDは不可
0x04Layer Jump Recording使ったことがない…


Test Write を1に設定すると、書き込みテストを行います、が、 CD では Track at Once か Session at Once、 DVD では Incremental か Disc-at-once でしか動作しません。

ほかにも多くのパラメータがありますが、 その多くはデータをトラック毎、もしくは追記して書き込むための方法だと思われます。 CDの Session At Once の場合は書き込みを開始する前に別のコマンド(SEND CUE SHEET)で トラック毎に指定します。 また、CDの RAWモードで書き込む場合は、 各セクタを書き込むときに逐一指定する(と同じ)ことになります。 DVD は情報不足ですが、多分ほとんど制御できません。 デフォルトのまま送っておけば大丈夫でしょう。

気になるのは、LS_V (Link Size Valid) と Link Size あたりですが…。
posted by 七癖 at 10:19| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月05日

Read/Write Error Recovery Mode Page

MODE SENSE で所得し、MODE SELECT で変更できる Read/Write Error Recovery Mode Page は、 エラーに対するきめ細かい対処を可能にすると思うのですが、 残念ながら使いこなせていません。

Read/Write Error Recovery Mode Page のデータフォーマットは次の通りです。

BYTE\bit 7 6 5 4 3 2 1 0
0PS予約Page Code = 0x01
1データ長さ = 0x0A
2エラー処理パラメータ
AWREARRETBRC予約PERDTEDCR
3読み込みリトライ回数
4予約
5予約
6予約
7予約
8書き込みリトライ回数
9予約
10
(MSB)
タイムリミット
(LSB)
11


2バイト目の略語の元語を書いておきます

略号元名
AWREAutomatic Write Reallocation Enabled
ARREAutomatic Read Reallocation Enabled
TBTransfer Block
RCRead Continuous
PERPost Error
DTEDisable Transfer on Error
DCRDisable Correction

エラーチェックをする場合はデフォルトのままで、 しない(無視する、スキップする)場合は全て0にすればいいかと…。
いや、予想されたことなのですが、己が何も理解していないことに少し愕然としています。 ソースコードにおいて"CD Manipulator"では結構細かく場合分けしているのですが、 "せんべえ焼き、もしくはコースターメーカー"では異様にすっきりしているのは このためです。
役に立たない説明ですみません。
posted by 七癖 at 07:59| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年09月03日

MODE SELECT

MODE SELECT コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x55
1予約1予約0
2予約
3予約
4予約
5予約
6予約
7
(MSB)
パラメータ長さ
(LSB)
8
9予約
10予約
11予約


MODE SELECT では PC や Page Code がありません。送るデータのヘッダからデータの内容を解釈され、パラメータが設定されます。

posted by 七癖 at 17:13| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする