CDACCESSライブラリリファレンス



§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 ファンクション詳細




◆CD-ROMドライブ数の取得

CDACCESSライブラリにより操作可能なCD-ROMドライブの数を取得します。

【形式】

INT     CdGetDriveNum(VOID);

【パラメータ】

指定するパラメータはありません。

【リターン値】

操作可能なCD-ROMドライブの数を返します。



◆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
ホストアダプタ番号を取得するバッファのアドレスを指定します。
取得する必要がない場合にはNULLを指定します。
piTarget
ターゲットのSCSI IDを取得するバッファのアドレスを指定します。
取得する必要がない場合にはNULLを指定します。
piLun
論理ユニット番号を取得するバッファのアドレスを指定します。
取得する必要がない場合にはNULLを指定します。
pszVendor
ベンダIDを取得するバッファのアドレスを指定します。 バッファのサイズは最低でも9Byteのサイズが必要で、9Byte目に'\0'が設定されます。
取得する必要がない場合にはNULLを指定します。
pszProduct
プロダクトIDを取得するバッファのアドレスを指定します。 バッファのサイズは最低でも17Byteのサイズが必要で、17Byte目に'\0'が設定されます。
取得する必要がない場合にはNULLを指定します。
pszRevision
プロダクト版数を取得するバッファのアドレスを指定します。 バッファのサイズは最低でも5Byteのサイズが必要で、5Byte目に'\0'が設定されます。
取得する必要がない場合にはNULLを指定します。

【リターン値】

CD-ROMドライブ情報が正常に取得できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。



◆CD-ROMドライブ状態のチェック

指定されたCD-ROMドライブにCD-ROMが挿入されていて読み取り可能な状態であるかチェックします。

【形式】

BOOL    CdCheckDriveStat(
        INT             iDriveNo);      // ドライブ番号

【パラメータ】

iDriveNo
ドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)

【リターン値】

CD-ROMドライブが読み取り可能な状態であればTRUEを、 読み取り可能な状態でなければFALSEを返します。



◆TOCの読み込み

指定されたCD-ROMドライブに挿入されているCD-ROMのTOCを読み込みます。

【形式】

INT     CdReadToc(
        INT             iDriveNo,       // ドライブ番号
        INT             iNumBuff,       // TOC取得バッファ数
        LPTOCENTRY      lptoc);         // TOC

【パラメータ】

iDriveNo
ドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)
iNumBuff
lptocのバッファ数を指定します。
lptoc
TOCを読み込むバッファのアドレスを指定します。 このパラメータの形式については、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の回転速度の設定

指定された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ドライブ・キャパビリティの取得

指定されたCD-ROMドライブのキャパビリティを取得します。

【形式】

BOOL    CdGetCapabilities(
        INT             iDriveNo,        // ドライブ番号
        INT             iGetType,        // 取得タイプ
        LPDWORD         lpdwCapaFlags,   // キャパビリティフラグ
        PINT            piMaxReadSpeed,  // 最大読み取りスピード
        PINT            piMaxWriteSpeed);// 最大書き込みスピード

【パラメータ】

iDriveNo
ドライブの番号を0~nの範囲で指定します。(n=CdGetDriveNum()-1)
iGetType
取得するCD-ROMドライブ・キャパビリティのタイプを次の値で指定します。
意味
GetCapaCURRENT カレント
GetCapaCHANGED 変更可能パラメータ
GetCapaDEFAULT デフォルトパラメータ
GetCapaSAVEPARA セーブパラメータ
lpdwCapaFlags
CD-ROMドライブ・キャパビリティを取得するバッファのアドレスを指定します。キャパビリティは次のフラグ値でサポートの有無が返されます。
意味
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コマンドによりメディアのロックが可
piMaxReadSpeed
最大読み取りスピードを取得するバッファのアドレスを指定します。 返される値は、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)
pbUpcEanCode
CD-ROMのメディアカタログ番号を取得するバッファのアドレスを指定します。 バッファのサイズは最低でも15Byteのサイズが必要です。

【リターン値】

CD-ROMのメディアカタログ番号が正常に取得できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。



◆CD-ROM読み取り環境のオープン

指定された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読み取り環境のクローズ

指定されたハンドルのCD-ROM読み取り環境をクローズします。

【形式】

BOOL    CdReadClose(
        HANDLE          hCdRead);       // CD読み取りハンドル

【パラメータ】

hCdRead
CdReadOpen関数により取得したCD読み取りハンドルを指定します。

【リターン値】

CD-ROMの読み取り環境が正常にクローズされた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。



◆CD-ROM読み取り位置セクタの設定

指定されたハンドルのCD-ROM読み取り位置を設定します。

【形式】

DWORD   CdSetReadPointer(
        HANDLE          hCdRead,        // CD読み取りハンドル
        LONG            lDistanceToMove,// 読み取り位置移動量
        DWORD           dwMoveMethod);  // 移動開始点

【パラメータ】

hCdRead
CdReadOpen関数により取得したCD読み取りハンドルを指定します。
lDistanceToMove
読み取り位置移動量を指定します。 指定単位はセクタです。
dwMoveMethod
読み取り位置の移動開始点を次のいづれかの値で指定します。
意味
FILE_BEGIN 読み取り開始セクタを開始点にします。
FILE_CURRENT 現在の読み取りセクタを開始点にします。
FILE_END 読み取り終了セクタを開始点にします。

【リターン値】

設定されたCD-ROM読み取り位置のセクタ番号を返します。 ここで返されるセクタ番号は、CdReadOpen関数で指定した読み取り開始位置からの オフセット位置です。



◆セクタの読み取り

指定されたハンドルのCD-ROM読み取り位置からセクタを読み取ります。

【形式】

PVOID   CdReadSector(
        HANDLE          hCdRead,        // CD読み取りハンドル
        PVOID           pvBuffer);      // セクタ読み取りバッファ

【パラメータ】

hCdRead
CdReadOpen関数により取得した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:全セクタ

【パラメータ】

hCdRead
CdReadOpen関数により取得したCD読み取りハンドルを指定します。
pvBuffer
CdReadSector関数により取得したセクタ読み取りバッファのアドレスを指定します。 pvBufferにNULLを指定した場合、現在ロックされている全セクタバッファのロックを解除します。

【リターン値】

指定されたセクタ読み取りバッファのロックを正常に解除できた場合TRUEを、 何らかのエラーが発生した場合にはFALSEを返します。

§4 形式

◆TOCENTRY

TOCENTRY構造体は、CdReadToc関数 からTOCを読み取るバッファに使用します。また、CdGetTrackType関数CdReadOpen関数でトラックを指定する際にも使用します。

【形式】

typedef struct {
        BYTE            bTrackNo;       // トラック番号
        BYTE            bAdr;           // ADRとコントロール
        DWORD           nBegin;        // 開始セクタ
        DWORD           nNumSector;    // セクタ数
} TOCENTRY, *LPTOCENTRY;

【メンバー】

bTrackNo
トラック番号
bAdr
上位4ビットは、ADR(TOCデータを読み出したセクタのサブチャネルQに含まれる情報)
意味
0x0 モード情報なし
0x1 カレントポジションデータ
0x2 メディアカタログ番号
0x3 トラック国際標準録音コード(ISRC)
0x4~0xf 予約
下位4ビットは、次に示す各ビットがトラックの属性情報を示します。
ビット 0 1
ビット0 プリエンファシスなし プリエンファシスあり
ビット1 デジタルコピー禁止 デジタルコピー許可
ビット2 オーディオ・トラック データ・トラック
ビット3 2チャンネルオーディオ 4チャンネルオーディオ
nBegin
開始セクタ番号
nNumSector
セクタ数

§5 変更履歴

2000/07/20 初版