2007年06月17日

DirectSound で悪戦苦闘

今日は、ISO9660ファイルシステムの話を休憩して、この前の音楽再生プログラミングの状況を書きます。

続きを読む。
posted by 七癖 at 10:44| Comment(0) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする

2007年06月15日

ISO9660 その13 パステーブル

パステーブルには、ボリュームが持つ全てのディレクトリの階層情報とディレクトリの場所が記されています。 つまりディレクトリを親から順に辿らなくともショートカットできるわけですが、 それにはパステーブルを全て読み込む必要があります。

パステーブルは、単純に言うと パステーブルレコードというディレクトリの情報を記した構造体をつなげて並べたものです。

一つのパステーブルレコードは一つのディレクトリに対応し、 順番に番号が割り振られます。 ルートディレクトリが 1 です。 子ディレクトリのパステーブルレコードは、親ディレクトリのパステーブルレコードの番号を持っています。

パステーブルレコードは以下の規則に従って並べられます。
1. ディレクトリ階層順。ルートから順に、親が前、子が後。
2. 同じ階層では、親ディレクトリの番号が若い方から先。
3. 親が同じならば、名前(文字コード)順。

パステーブルは、L型とM型をそれぞれ用意します。 L型では パステーブルレコードの Location of Extent と Parent Directory Number をリトルエンディアンで、 M型ではビッグエンディアンで記述します。

また、もう一つづつ予備のパステーブルを用意することも出来ます。

個々のパステーブルレコードの構造は、次のとおりです。

位置大きさ名称内容
01unsigned charLength of Directory Identifier (LEN_DI) ディレクトリ識別子の長さ
11unsigned charExtended Attribute Record Length 拡張属性レコードの長さ
2〜54unsigned long (L/M)Location of Extent ディレクトリの先頭位置 [LBN]
6〜72unsigned short (L/M)Parent Directory Number 親ディレクトリの番号
8〜(8+LEN_DI-1)LEN_FIchar[LEN_FI]File Identifier ディレクトリ識別子
8+LEN_DI1unsigned charPadding Field =0 全体を偶数にするため


Extended Attribute Record Length は、無ければ 0x00 です。

ディレクトリ識別子は、ディレクトリレコードと同様に、 ルートディレクトリでは1バイトの 0x00、 それ以外の一般的なディレクトリにはd/d1文字を使用します。

ディレクトリ識別子の長さが奇数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが偶数ならば、必要ありません。

posted by 七癖 at 10:07| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月11日

ISO9660 その12 ディレクトリとディレクトリレコード

ディレクトリは、単純に書くとそのディレクトリが持っている ファイルやディレクトリの情報を記した構造体(ディレクトリレコード)をつなげて並べたものです。
ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。

ディレクトリレコードは、次のようになっています。

位置大きさ名称内容
01unsigned charLength of Directory Record (LEN_DR) このディレクトリレコードの長さ [BYTE]
11unsigned charExtended Attribute Record Length 拡張属性レコードの長さ(無ければ0)
2〜54unsigned longLocation of Extent ディレクトリまたはファイル本体の先頭位置 [LBN]
6〜94unsigned long (M)Location of Extent 上に同じ
10〜134unsigned longData Length ディレクトリまたはファイル本体の大きさ [BYTE]
14〜174unsigned long (M)Data Length 上に同じ
18〜247struct datetime_sRecording Date and Time 記録日時
251unsigned charFile Flags ファイルフラグ
261unsigned charFile Unit Size ファイルユニットの大きさ
271unsigned charInterleave Gap Size インタリーブ間隙の大きさ
28〜292unsigned shortVolume Sequence Number ボリューム順序番号
30〜312unsigned short (M)Volume Sequence Number 上に同じ
321unsigned charLength of File Identifier (LEN_FI) ファイル識別子の長さ(LEN_FI)
33〜(33+LEN_FI-1)LEN_FIchar[LEN_FI]File Identifier ファイル/ディレクトリ識別子
33+LEN_FI1unsigned charPadding Field =0 全体を偶数にするため
(LEN_DR-LEN_SU)〜(LEN_DR-1)LEN_SUchar[LEN_SU]System Use システム用

ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です
また、Data Length に拡張属性の大きさは含みません。


表中の記録日時の構造(datetime_s)は次のとおりです。

位置大きさ名称内容
01unsigned charNumber of years since 1900 西暦年 - 1900
11unsigned charMonth of the year from 1 to 12
21unsigned charDay of the month from 1 to 31
31unsigned charHour of the day from 0 to 23
41unsigned charMinute of the hour from 0 to 59
51unsigned charSecond of the minute from 0 to 59
61charOffset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) グリニッジ標準時からの偏差(15分単位)

こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。

ファイルフラグは次のとおりです。

ビット名称内容
0Existence0=可視ファイル / 1=不可視ファイル
1Directory0=ファイル / 1=ディレクトリ
2Associated File0=主ファイル / 1=関連ファイル
3Record0=ファイルがレコード形式を持たない / 1=レコード形式を持つ
4Protection0=許可条件無効 / 1=許可条件有効
5Reserved予約(=0)
6Reserved予約(=0)
7Multi-Extent0=ファイルの最終ディレクトリレコードである / 1=ファイルの最終ディレクトリレコードでない

隠しファイルのとき、ビット0を設定します。
ビット1でファイルかディレクトリかを判別します。
他は…大抵 0 です。

File Unit Size と Interleave Gap Size は、ファイルが分割されている時に使います。 ファイルが分割されていなければ 0 です。

Volume Sequence Number は、普通一つのボリューム内に全て記入するので、その場合 1 です。


ファイル/ディレクトリ識別子は、いわゆるファイル/ディレクトリ名です。

PVD から辿る場合、ファイル識別子は、次のようになっています。
ファイル名+0x2E+拡張子+0x3B+バージョン
0x2E = '.'
0x3B = ';'
拡張子は無い場合もあります。
バージョンは、1〜32767の数値を文字で記述します。 windows では 1 です。
各文字はd文字を使用します。
よって、
FILENAME.EXT;1
のように書かれています。
(文字数の制限は後まわし。)

EVD から辿る場合、文字はd1文字を使用します。
拡張子、版数などはありません。(当事者間の合意によります。)

ディレクトリでは、最初に自身のディレクトリレコードを、 次に親のディレクトリレコードを記録します。 自分自身のディレクトリ識別子には、1バイトの 0x00 を、 親ディレクトリのディレクトリ識別子には、1バイトの 0x01 を使います。 文字に Unicode のような2バイト文字を使う場合でも、 ファイル識別子の長さ(LEN_FI)を 1 と置き、 単一バイトの 0x00 と 0x01 を使用します。
なお、ルートディレクトリの識別子にも1バイトの 0x00 を使います。 ルートディレクトリ内の親ディレクトリ(0x01)もルートディレクトリ自身を示します。 (無いこともあります。)
それ以外の一般的なディレクトリの識別子にはd/d1文字を使用します。


ファイル識別子の長さが偶数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが奇数ならば、必要ありません。

System Use は、ファイル名の長さにかかわらず ディレクトリレコードの長さを同じにしたい場合(たまにある)など、 ディレクトリレコード間に隙間を空ける時に使います。
なお、ディレクトリレコードが論理ブロックを跨がないように、 論理ブロックの終わりのほうを 0x00 で埋める必要があります。
 
posted by 七癖 at 09:20| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月09日

Ogg Vorbis と Wave 再生プログラミングで悪戦苦闘

今日は、ISO9660ファイルシステムの話は休憩して、最近手を付けた .ogg ファイルを再生するプログラムの状況を書きます。
(発表予定はなし。)

続きを読む。
posted by 七癖 at 09:53| Comment(0) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする

2007年06月07日

ISO9660 その11 VDT

Volume Descriptor Set Terminator (VDT)(ボリューム記述子集合終端子)は、 ボリューム記述子群の終端を示すもので、ISO9660及びその派生、拡張形式には 必ず一つは存在します。その構造は、次のとおりです。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=255
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
7〜20472041unsigned char[2041](Reserved for future standardization)=0

最初のバイトが 255 ならば、ボリューム記述子群はここまで、ということです。

posted by 七癖 at 11:01| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月05日

ISO9660 その10 Boot Record

Boot Record (BR)(ブートレコード)は使ったことがないので、 表のみ書いておきます。

位置大きさ名称内容
01charVolume Descriptor Type=0
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
7〜3832char[32]Boot System Identifier起動システム識別子 (a文字)
39〜7032char[32]Boot Identifier起動識別子 (a文字)
71〜20471977unsigned char[1977]Boot System Use起動システム用

posted by 七癖 at 09:44| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月03日

ISO9660 その9 VPD

Volume Partition Descriptor (VPD)(ボリューム区画記述子)は使ったことがないので、 表のみ書いておきます。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=3
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
71unsigned charUnused Field=0
8〜3932char[32]System identifierシステム識別子 (a文字)
40〜7132char[32]Volume Partition Identifierボリューム区画識別子 (d文字)
72〜754unsigned longVolume Partition Locationボリューム区画の先頭位置 [LBN]
76〜794unsigned long (M)Volume Partition Location上に同じ
80〜834unsigned longVolume Partition Sizeボリューム区画の大きさ [Blocks]
84〜874unsigned long (M)Volume Partition Size上に同じ
88〜20471960unsigned char[1960]System Useシステム用

posted by 七癖 at 10:09| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年06月01日

ISO9660 その8 SVD/EVD

Supplementary Volume Descriptor (SVD)(副ボリューム記述子) と Enhanced Volume Descriptor (EVD)(拡張ボリューム記述子)の構造は PVD と同じですが、入れる値が異なります。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=2
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version=1(SVD), =2(EVD)
71unsigned charVolume Flagsビット0 : 0=ISO2375登録のエスケープシーケンスのみ / 1=ISO2375登録外のエスケープシーケンスが含まれる
8〜3932char[32]System identifierシステム識別子 (a1文字)
40〜7132char[32]Volume Identifierボリュームラベル (d1文字)
72〜798char[8]Unused Field=0
80〜834unsigned longVolume Space Sizeボリュームの大きさ [Blocks]
84〜874unsigned long (M)Volume Space Size上に同じ
88〜11932char[32]Escape Sequencesエスケープシーケンス
120〜1212unsigned shortVolume Set Sizeボリューム集合の大きさ
122〜1232unsigned short (M)Volume Set Size上に同じ
124〜1252unsigned shortVolume Sequence Numberボリューム順序番号
126〜1272unsigned short (M)Volume Sequence Number上に同じ
128〜1292unsigned shortLogical Block Size論理ブロックの大きさ [BYTE] 大抵2048
130〜1312unsigned short (M)Logical Block Size上に同じ
132〜1354unsigned longPath Table Sizeパステーブルの大きさ [BYTE]
136〜1394unsigned long (M)Path Table Size上に同じ
140〜1434unsigned longLocation of Occurrence of Type L Path TableL形パステーブルの先頭位置 [LBN]
144〜1474unsigned longLocation of Optional Occurrence of Type L Path Table任意L形パステーブルの先頭位置 [LBN]
148〜1514unsigned long (M)Location of Occurrence of Type M Path TableM形パステーブルの先頭位置 [LBN]
152〜1554unsigned long (M)Location of Optional Occurrence of Type M Path Table任意M形パステーブルの先頭位置 [LBN]
156〜18934struct directory_recordDirectory Record for Root Directoryルートディレクトリのディレクトリレコード
190〜317128char[128]Volume Set Identifierボリューム集合識別子 (d1文字)
318〜445128char[128]Publisher Identifier出版者識別子 (a1文字)
446〜573128char[128]Data Preparer Identifierデータ編集者識別子 (a1文字)
504〜701128char[128]Application Identifier応用システム識別子 (a1文字)
702〜73837char[37]Copyright File Identifier著作権ファイル識別子 (d1文字)
739〜77537char[37]Abstract File Identifier抄録ファイル識別子 (d1文字)
776〜81237char[37]Bibliographic File Identifier書誌ファイル識別子 (d1文字)
813〜82917struct datetime_lVolume Creation Date and Timeボリューム作成日時
830〜84617struct datetime_lVolume Modification Date and Timeボリューム更新日時
847〜86317struct datetime_lVolume Expiration Date and Timeボリューム失効日時
864〜88017struct datetime_lVolume Effective Date and Timeボリューム発効日時
8811unsigned charFile Structure Versionファイル構造版数 =1
8821unsigned charReserved=0
883〜1394512unsigned char[512]Application Use=0
1395〜2047653unsigned char[653]Reserved=0

Escape Sequences には、ISO/IEC 2022 のエスケープシーケンスを入れます。 これがあると、ファイル名などに多種の文字が使用できるようになりますが、 読み取る側がそのエスケープシーケンスに対応していないと無駄です。
全て 0 であれば ISO/IEC 646 となり、a 文字と d 文字しか使えません。

各日時は、PVD と同じです。つまり、年月日時分秒1/100秒にはd文字を使います。

System identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier が a 文字から a1 文字に、 Volume Identifier、Volume Set Identifier、Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が d 文字から d1 文字に、 それぞれ変更されています。

エスケープシーケンスの補足と疑問
posted by 七癖 at 09:57| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月29日

ISO9660 その7 PVD

Primary Volume Descriptor (PVD)(基本ボリューム記述子)の構造は、次のとおりです。

位置大きさ名称内容
01unsigned charVolume Descriptor Type=1
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Version大抵 =1
71unsigned charUnused Field=0
8〜3932char[32]System identifierシステム識別子 (a文字)
40〜7132char[32]Volume Identifierボリュームラベル (d文字)
72〜798char[8]Unused Field=0
80〜834unsigned longVolume Space Sizeボリュームの大きさ [Blocks]
84〜874unsigned long (M)Volume Space Size上に同じ
88〜11932char[32]Escape Sequences=0
120〜1212unsigned shortVolume Set Sizeボリューム集合の大きさ
122〜1232unsigned short (M)Volume Set Size上に同じ
124〜1252unsigned shortVolume Sequence Numberボリューム順序番号
126〜1272unsigned short (M)Volume Sequence Number上に同じ
128〜1292unsigned shortLogical Block Size論理ブロックの大きさ [BYTE] 大抵2048
130〜1312unsigned short (M)Logical Block Size上に同じ
132〜1354unsigned longPath Table Sizeパステーブルの大きさ [BYTE]
136〜1394unsigned long (M)Path Table Size上に同じ
140〜1434unsigned longLocation of Occurrence of Type L Path TableL形パステーブルの先頭位置 [LBN]
144〜1474unsigned longLocation of Optional Occurrence of Type L Path Table任意L形パステーブルの先頭位置 [LBN]
148〜1514unsigned long (M)Location of Occurrence of Type M Path TableM形パステーブルの先頭位置 [LBN]
152〜1554unsigned long (M)Location of Optional Occurrence of Type M Path Table任意M形パステーブルの先頭位置 [LBN]
156〜18934struct directory_recordDirectory Record for Root Directoryルートディレクトリのディレクトリレコード
190〜317128char[128]Volume Set Identifierボリューム集合識別子 (d文字)
318〜445128char[128]Publisher Identifier出版者識別子 (a文字)
446〜573128char[128]Data Preparer Identifierデータ編集者識別子 (a文字)
504〜701128char[128]Application Identifier応用システム識別子 (a文字)
702〜73837char[37]Copyright File Identifier著作権ファイル識別子 (d文字)
739〜77537char[37]Abstract File Identifier抄録ファイル識別子 (d文字)
776〜81237char[37]Bibliographic File Identifier書誌ファイル識別子 (d文字)
813〜82917struct datetime_lVolume Creation Date and Timeボリューム作成日時
830〜84617struct datetime_lVolume Modification Date and Timeボリューム更新日時
847〜86317struct datetime_lVolume Expiration Date and Timeボリューム失効日時
864〜88017struct datetime_lVolume Effective Date and Timeボリューム発効日時
8811unsigned charFile Structure Versionファイル構造版数 =1
8821unsigned charReserved=0
883〜1394512unsigned char[512]Application Use=0
1395〜2047653unsigned char[653]Reserved=0

文字を入れる System identifier、Volume Identifier、 Volume Set Identifier、Publisher Identifier、Data Preparer Identifier、Application Identifier、 Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier は全て先詰で、 余った部分には半角スペース (0x20) を入れます。 使わない場合は全て半角スペース (0x20) です。
ただ、中には最後のバイトが 0 であったり、余った部分が 0 であるディスクもあったような気がします。

Volume Set Size と Volume Sequence Number は、 例えばCD-ROM何枚組の百科辞典があるとき、 辞典のディスク枚数を Volume Set Size に、そのディスク番号を Volume Sequence Number に それぞれ入れます。ただ複数枚組のゲームでも使われているのを見たことは無く、 どちらも大抵 0x01 が入っています。

Path Table Size はパステーブルの先端から終端までのバイト数です。 パステーブルでは一つのパステーブルレコードが論理ブロックを跨いでも大丈夫です。

任意パステーブルを使わない場合 Location of Occurrence of Type L/M Path Table に 0 を入れます。

Directory Record for Root Directory には、 ルートディレクトリのディレクトリレコード(後述)が丸ごと入っています。 ディレクトリ識別子は 0x00 で、識別子の長さは 1 バイトです。

Volume Set Identifier には、例えばCD-ROM何枚組の百科辞典があるとき、 その百科辞典名を入れます。 ただ使われているのを見たことはあまり無く、 ボリュームラベルと同じか、半角スペース(0x20)で埋まっています。NOT_SET と書かれるソフトもあったような気がします。

Publisher Identifier、Data Preparer Identifier、Application Identifier が使われる場合で、 最初のバイトがアンダーバー (0x5F '_') のとき、ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。 その場合、ディレクトリレコードのファイル記述子と同じ構造です。他、普通の文字列が入っている場合もあります。

Copyright File Identifier、Abstract File Identifier、Bibliographic File Identifier が使われるとき、 ファイル名が入っており、 そのファイルがルートディレクトリに置かれています。

作成、更新、失効、発行日時の構造(datetime_l)は、次のとおりです。

位置大きさ名称内容
04char[4]Year from 1 to 9999 西暦年 (d文字)
42char[2]Month of the year from 1 to 12 月 (d文字)
62char[2]Day of the month from 1 to 31 日 (d文字)
82char[2]Hour of the day from 0 to 23 時 (d文字)
102char[2]Minute of the hour from 0 to 59 分 (d文字)
122char[2]Second of the minute from 0 to 59 秒 (d文字)
142char[2]Hundredths of a second 1/100 秒 (d文字)
161charOffset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) グリニッジ標準時からの偏差(15分単位)

年月日時分秒1/100秒は、数値ではなくd文字です。1月の場合'0x30''0x31'、12月の場合'0x31''0x32'となります。偏差のみ数値です。 偏差は、日本の場合 0x24=36=9×4 になります。
使われていない場合、年月日時分秒1/100秒にd文字の 0 (0x30) 、偏差に数値の 0x00 がそれぞれ入っています。 たまに全て数値の 0x00 になっているディスクもあります。
なお、西暦1万年問題があります。

Application Use や 最後の Reserved には、プロテクトがかけられたディスクなどで 何かしらの文字などが入っている場合があります。

posted by 七癖 at 09:49| Comment(2) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする

2007年05月27日

ISO9660 その6 ボリューム記述子

ボリューム記述子群は、読み取りのスタート地点であり、 トラックの先頭より16論理セクタ目から始まり、数論理セクタ続きます。
この中に、ボリューム、ファイルシステムの情報が書かれています。
個々のボリューム記述子の大きさは1論理セクタです。

ボリューム記述子には、次の種類があります。
番号名称適当訳備考
0Boot Record起動レコード 
1Primary Volume Descriptor (PVD)基本ボリューム記述子本当は厳密なISO9660用
2Supplementary Volume Descriptor (SVD)
Enhanced Volume Descriptor (EVD)
副ボリューム記述子
拡張ボリューム記述子
文字種、文字数などの制限を緩めたい場合
joliet など
3Volume Partition Descriptorボリューム区画記述子 
255Volume Descriptor Set Terminator (VDT)ボリューム記述子集合終端子ボリューム記述子群の最後を示す


ボリューム記述子群は、最低2論理セクタ続きます。
16 PVD
17 VDT
です。

多くの windows 用 CD-ROM では、
16 PVD
17 SVD
18 VDT
となっています。この場合、PVD用のパステーブルとディレクトリ群とは別に、 SVD用のパステーブルとディレクトリ群があります。ファイル本体は共通です。

拡張ボリューム記述子(EVD)は、ISO9660:1999 から加えられた仕様です。

個々のボリューム記述子は、次のようになっています。

位置大きさ名称内容
01unsigned charVolume Descriptor Typeボリューム記述子の種類
1〜55char[5]Standard Identifier="CD001"
61unsigned charVolume Descriptor Versionバージョン
7〜20472041--ボリューム記述子の種類によって異なる

posted by 七癖 at 09:49| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。