§1 はじめに |
CDACCESSライブラリは、Adaptec ASPIを介してCD-ROMからデータを読み込むための簡単な機能を提供するライブラリです。 このライブラリは、PSX Multi ConverterのPSRプラグイン用に作成したライブラリですが、 他アプリケーションにも流用できるようライブラリ化しました。 流用できると思われる場合には、誰でも許可なくこのライブラリを使用することができますが、 現在、不足していると思われる機能は順次作成しライブラリに追加して行きますので、 予告なくインターフェースが変更されることがありますのでご了承下さい。
なお、本ドキュメントの転載・配付はご自由に行って下さい。
§2 ファンクション一覧 |
次に、CDACCESSライブラリのファンクション一覧を示します。
関数名 | 機能名 |
CdGetDriveNum | CD-ROMドライブ数の取得 |
CdGetDriveInfo | CD-ROMドライブ情報の取得 |
CdCheckDriveStat | CD-ROMドライブ状態のチェック |
CdReadToc | TOCの読み込み |
CdGetTrackType | トラックタイプの取得 |
CdSetSpinSpeed | CD-ROMの回転速度の設定 |
CdGetCapabilities | CD-ROMドライブ・キャパビリティの取得 |
CdGetUpcEanCode | メディアカタログ番号の取得 |
CdReadOpen | CD-ROM読み取り環境のオープン |
CdReadClose | CD-ROM読み取り環境のクローズ |
CdSetReadPointer | CD-ROM読み取り位置セクタの設定 |
CdReadSector | セクタの読み取り |
CdUnlockReadBuffer | セクタ読み取りバッファの解放 |
§3 ファンクション詳細 |
CDACCESSライブラリにより操作可能なCD-ROMドライブの数を取得します。
INT CdGetDriveNum(VOID);
指定するパラメータはありません。
操作可能なCD-ROMドライブの数を返します。
指定されたCD-ROMドライブの基本的な情報を取得します。
BOOL CdGetDriveInfo( INT iDriveNo, // ドライブ番号 PINT piHost, // ホストアダプタ番号 PINT piTarget, // ターゲットのSCSI ID PINT piLun, // 論理ユニット番号 PSZ pszVendor, // ベンダID PSZ pszProduct, // プロダクトID PSZ pszRevision); // プロダクト版数
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)piHostホストアダプタ番号を取得するバッファのアドレスを指定します。piTarget
取得する必要がない場合にはNULLを指定します。ターゲットのSCSI IDを取得するバッファのアドレスを指定します。piLun
取得する必要がない場合にはNULLを指定します。論理ユニット番号を取得するバッファのアドレスを指定します。pszVendor
取得する必要がない場合にはNULLを指定します。ベンダIDを取得するバッファのアドレスを指定します。 バッファのサイズは最低でも9Byteのサイズが必要で、9Byte目に'\0'が設定されます。pszProduct
取得する必要がない場合にはNULLを指定します。プロダクトIDを取得するバッファのアドレスを指定します。 バッファのサイズは最低でも17Byteのサイズが必要で、17Byte目に'\0'が設定されます。pszRevision
取得する必要がない場合にはNULLを指定します。プロダクト版数を取得するバッファのアドレスを指定します。 バッファのサイズは最低でも5Byteのサイズが必要で、5Byte目に'\0'が設定されます。
取得する必要がない場合にはNULLを指定します。
CD-ROMドライブ情報が正常に取得できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
指定されたCD-ROMドライブにCD-ROMが挿入されていて読み取り可能な状態であるかチェックします。
BOOL CdCheckDriveStat( INT iDriveNo); // ドライブ番号
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)
CD-ROMドライブが読み取り可能な状態であればTRUEを、 読み取り可能な状態でなければFALSEを返します。
指定されたCD-ROMドライブに挿入されているCD-ROMのTOCを読み込みます。
INT CdReadToc( INT iDriveNo, // ドライブ番号 INT iNumBuff, // TOC取得バッファ数 LPTOCENTRY lptoc); // TOC
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)iNumBufflptocのバッファ数を指定します。lptocTOCを読み込むバッファのアドレスを指定します。 このパラメータの形式については、TOCENTRY形式を参照して下さい。 100個のバッファを用意すれば安全にすべてのTOCエントリを読み取ることができます。
TOCエントリの数(トラックの数)を返します。
指定されたCD-ROMドライブに挿入されているCD-ROMの指定トラックのタイプを取得します。
INT CdGetTrackType( INT iDriveNo, // ドライブ番号 LPTOCENTRY lptoc); // TOCエントリ
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)lptocトラックタイプを取得するトラックのTOCエントリを指定します。 このパラメータの形式については、TOCENTRY形式を参照して下さい。 TOCエントリは、CdReadToc関数により読み取ります。
指定トラックのタイプを次の値で返します。
値 意味 TrackUNKNOW エラーまたはタイプが不明 TrackCDDA CD-DA TrackMODE1 CD-ROM Mode-1 TrackMODE2 CD-ROM Mode-2
指定されたCD-ROMドライブの読み取り速度を設定します。
BOOL CdSetSpinSpeed( INT iDriveNo, // ドライブ番号 INT iSpinSpeed); // 読み取り速度
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)iSpinSpeed読み取り速度を倍数で指定します。例えば4倍速で読み取りを行う場合は 4 を指定します。 等速は、176,400byte/secで計算されます。
なお、iSpinSpeedに0以下の値を指定した場合、そのCD-ROMドライブの最大読み取りスピードに設定されます。
CD-ROMドライブの読み取り速度を正常に設定できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
指定されたCD-ROMドライブのキャパビリティを取得します。
BOOL CdGetCapabilities( INT iDriveNo, // ドライブ番号 INT iGetType, // 取得タイプ LPDWORD lpdwCapaFlags, // キャパビリティフラグ PINT piMaxReadSpeed, // 最大読み取りスピード PINT piMaxWriteSpeed);// 最大書き込みスピード
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)iGetType取得するCD-ROMドライブ・キャパビリティのタイプを次の値で指定します。lpdwCapaFlags
値 意味 GetCapaCURRENT カレント GetCapaCHANGED 変更可能パラメータ GetCapaDEFAULT デフォルトパラメータ GetCapaSAVEPARA セーブパラメータ CD-ROMドライブ・キャパビリティを取得するバッファのアドレスを指定します。キャパビリティは次のフラグ値でサポートの有無が返されます。piMaxReadSpeed
値 意味 CapaMETHOD2 Method2アドレッシングのパケットライトされたディスクの読み込み CapaCDRW_READ CD-RWメディアの読み込み CapaCDR_READ CD-Rメディアの読み込み CapaTESTWRITE Test Writeをサポート (CD-R/RW) CapaCDRW_WRITE CD-RWメディア書き込み CapaCDR_WRITE CD-Rメディア書き込み CapaMULTISESSION マルチセッションの読み込み CapaMODE2_FORM1 CD-ROM XA Mode2 Form1の読み込み CapaMODE2_FORM2 CD-ROM XA Mode2 Form2の読み込み CapaDIGITALPORT2 デジタル出力のポート2をサポート CapaDIGITALPORT1 デジタル出力のポート1をサポート CapaCOMPOSITE オーディオとビデオデータストリームの混合配送が可能 CapaAUDIOPLAY オーディオ再生と再生中のサブチャネル情報読み込みが可能 CapaREAD_BARCODE ReadBAR CODE識別コードの読み出し CapaUPC UPC識別コードの読み出し CapaISRC ISRC識別コードの読み出し CapaC2_POINTERS C2エラーポインタをサポートし、READ CDコマンドでCDエラーポインタとCDブロックエラーの転送をサポート CapaRW_DE_INTERLEAVED R-Wサブチャネルのインターリーブが分れ、エラー訂正されて戻す CapaRW_SUPPORTED R-Wサブチャネルのひとまとまりのサブチャネルデータを転送するコマンドをサポート CapaDA_ACCURATE 拡張機能として連続したREAD CDコマンドを発行しても位置を見失うことなくオーディオ位置を返すことができる CapaDA_COMMANDS READ CDコマンドを使用してオーディオデータの読み出しが可能 CapaEJECT EJECTコマンドをサポートする CapaPREVENT_JUMPER PREVENT/ALLOWジャンパの状態 CapaLOCK_STATE ロック状態 CapaLOCK PREVENT/ALLOWコマンドによりメディアのロックが可 最大読み取りスピードを取得するバッファのアドレスを指定します。 返される値は、KB/secです。 取得する必要がない場合にはNULLを指定します。piMaxWriteSpeed最大書き込みスピードを取得するバッファのアドレスを指定します。 返される値は、KB/secです。 取得する必要がない場合にはNULLを指定します。
CD-ROMドライブのキャパビリティが正常に取得できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
指定されたCD-ROMドライブに挿入されているCD-ROMのメディアカタログ番号を取得します。
BOOL CdGetUpcEanCode( INT iDriveNo, // ドライブ番号 PBYTE pbUpcEanCode); // メディアカタログ番号
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)pbUpcEanCodeCD-ROMのメディアカタログ番号を取得するバッファのアドレスを指定します。 バッファのサイズは最低でも15Byteのサイズが必要です。
CD-ROMのメディアカタログ番号が正常に取得できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
指定されたCD-ROMドライブの読み取り環境を作成してハンドルを返します。
HANDLE CdReadOpen( INT iDriveNo, // ドライブ番号 LPTOCENTRY lptoc, // TOCエントリ DWORD nBegin, // 読み取り開始セクタ番号 DWORD nNumSector, // 読み取りセクタ数 INT iSpinSpeed); // 読み取り速度
iDriveNoドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)lptoc読み取るトラックのTOCエントリを指定します。 このパラメータの形式については、TOCENTRY形式を参照して下さい。 TOCエントリは、CdReadToc関数により読み取ります。 lptocにNULLを指定した場合、CdReadOpen関数は内部でCdReadToc関数を呼び出して 挿入されているCD-ROMからTOCを読み取ります。nBegin読み取りを開始するセクタの番号を指定します。nNumSector読み取るセクタの数を指定します。iSpinSpeed読み取り速度を指定します。 この値の指定方法については、CdSetSpinSpeed関数を参照して下さい。
CD-ROMの読み取り環境が正常に作成された場合にはCD読み取りハンドルを返します。 何らかのエラーが発生した場合にはNULLを返します。
指定されたハンドルのCD-ROM読み取り環境をクローズします。
BOOL CdReadClose( HANDLE hCdRead); // CD読み取りハンドル
hCdReadCdReadOpen関数により取得したCD読み取りハンドルを指定します。
CD-ROMの読み取り環境が正常にクローズされた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
指定されたハンドルのCD-ROM読み取り位置を設定します。
DWORD CdSetReadPointer( HANDLE hCdRead, // CD読み取りハンドル LONG lDistanceToMove,// 読み取り位置移動量 DWORD dwMoveMethod); // 移動開始点
hCdReadCdReadOpen関数により取得したCD読み取りハンドルを指定します。lDistanceToMove読み取り位置移動量を指定します。 指定単位はセクタです。dwMoveMethod読み取り位置の移動開始点を次のいづれかの値で指定します。
値 意味 FILE_BEGIN 読み取り開始セクタを開始点にします。 FILE_CURRENT 現在の読み取りセクタを開始点にします。 FILE_END 読み取り終了セクタを開始点にします。
設定されたCD-ROM読み取り位置のセクタ番号を返します。 ここで返されるセクタ番号は、CdReadOpen関数で指定した読み取り開始位置からの オフセット位置です。
指定されたハンドルのCD-ROM読み取り位置からセクタを読み取ります。
PVOID CdReadSector( HANDLE hCdRead, // CD読み取りハンドル PVOID pvBuffer); // セクタ読み取りバッファ
hCdReadCdReadOpen関数により取得したCD読み取りハンドルを指定します。pvBufferセクタの内容を読み取るバッファのアドレスを指定します。 このバッファは、最低でもSizeSECTORFULLのサイズが必要です。 なお、pvBufferにNULLを指定した場合、CdReadSector関数のリターン値に ライブラリ内で確保したバッファのアドレスが返されます。
エラーまたは、読み取り位置が終端に達している場合はNULLを返します。 セクタの内容を正常に読み込めた場合、pvBufferで指定されたアドレスを返します。 ただし、pvBufferにNULLが指定されていた場合には、ライブラリ内で確保したバッファのアドレスを返します。
ライブラリ内で確保したバッファのアドレスを返した場合、CdReadSector関数はそのバッファをロックします。 ロックされている間、そのバッファには次のセクタ内容が読み込まれないようにロックされます。 この方法は、バッファのコピー処理を省くことができますが、あまり多くのセクタがロックされている状態になって いるとCdReadSector関数は、ロックされていない読み取りバッファを発見できずにデットロック状態に陥ります。 同時期にロックできるセクタ数は23セクタまでを保障しますが、ロックされているセクタの分布状況により最大23×16セクタ までロックすることができます。
セクタバッファのロックを解除し、再利用可能な状態にします。
BOOL CdUnlockReadBuffer( HANDLE hCdRead, // (I) CD読み取りハンドル PVOID pvBuffer); // (I) セクタ読み取りバッファ NULL:全セクタ
hCdReadCdReadOpen関数により取得したCD読み取りハンドルを指定します。pvBufferCdReadSector関数により取得したセクタ読み取りバッファのアドレスを指定します。 pvBufferにNULLを指定した場合、現在ロックされている全セクタバッファのロックを解除します。
指定されたセクタ読み取りバッファのロックを正常に解除できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。
§4 形式 |
typedef struct { BYTE bTrackNo; // トラック番号 BYTE bAdr; // ADRとコントロール DWORD nBegin; // 開始セクタ DWORD nNumSector; // セクタ数 } TOCENTRY, *LPTOCENTRY;
bTrackNoトラック番号bAdr上位4ビットは、ADR(TOCデータを読み出したセクタのサブチャネルQに含まれる情報)nBegin下位4ビットは、次に示す各ビットがトラックの属性情報を示します。
値 意味 0x0 モード情報なし 0x1 カレントポジションデータ 0x2 メディアカタログ番号 0x3 トラック国際標準録音コード(ISRC) 0x4~0xf 予約
ビット 0 1 ビット0 プリエンファシスなし プリエンファシスあり ビット1 デジタルコピー禁止 デジタルコピー許可 ビット2 オーディオ・トラック データ・トラック ビット3 2チャンネルオーディオ 4チャンネルオーディオ 開始セクタ番号nNumSectorセクタ数
§5 変更履歴 |
2000/07/20 | 初版 |