[] 目次 []

Simple DirectMedia Layer API を使う

CD-ROM オーディオ

  • CD-ROM ドライブのオープン

SDL_CDNumDrives() 関数を使って CD-ROM ドライブの数を取得し、 SDL_CDOpen() でそのうちの 1 つを選んで使用することができます。

システムデフォルトの CD-ROM は常にドライブ 0 です。 CD-ROM ドライブはメディアがなくてもオープンすることが できるかも知れません。

ドライブの状態を調べるためには SDL_CDStatus() 関数を使う必要があります。 使い終わったら、SDL_CDClose() 関数でクローズして下さい。

Tip:
SDL_CDName() を使ってシステムに依存しない CD-ROM ドライブ名を 取得することができます。
Example:
{
    SDL_CD *cdrom;

    if ( SDL_CDNumDrives() > 0 ) {
        cdrom = SDL_CDOpen(0);
        if ( cdrom == NULL ) {
            fprintf(stderr, "Couldn't open default CD-ROM: %s\n" SDL_GetError());
            return;
        }

        ...

        SDL_CDClose(cdrom);
    }
}
  • CD-ROM の再生

CD-ROM ドライブは MSF フォーマット (分(mins)/秒(secs)/フレーム(frames)) か、直接フレーム番号で 時間を指定します。 フレームは CD 上での標準の時間単位であり、1/75 秒に一致します。 SDL はトラックの長さやオフセット値を指定するとき MSF の代わりにフレーム番号を使いますが、 FRAMES_TO_MSF() や MSF_TO_FRAMES() のマクロを使うことで 変換することができます。

SDL は SDL_CDStatus() が呼ばれるまで SDL_CD 構造体の トラック情報を更新しないので、 CD の再生前にドライブに CD があることを確認し、 どのトラックが再生可能かどうかを調べるために 常に SDL_CDStatus() を使う必要があります。 トラックのインデックスは 0 から始まることに注意して下さい。

SDL には CD-ROM の再生用として 2 種類の関数があります。 SDL_CDPlayTracks() を使って CD 上の特定のトラックを再生したり、 SDL_CDPlay() を使って絶対位置のフレームオフセットを 再生することができます。

SDL には CD の挿入や再生完了を自動的に知らせる機能はありません。 これらの状態を検出するには、SDL_CDStatus() を使って定期的に ドライブの状態を取得する必要があります。 これは CD のデータ一覧を読み込むので、きちきちのループの中で 連続して呼ばれてはいけません。

Tip:
cdrom->tracks[track].type を見て SDL_AUDIO_TRACK や SDL_DATA_TRACK と 比較することで、どのトラックがオーディオトラックで どれがデータトラックかを調べることができます。
サンプルコード:
void PlayTrack(SDL_CD *cdrom, int track)
{
    if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) {
        SDL_CDPlayTracks(cdrom, track, 0, track+1, 0);
    }
    while ( SDL_CDStatus(cdrom) == CD_PLAYING ) {
        SDL_Delay(1000);
    }
}

[] 目次 []