[Zurück] Inhaltsverzeichnis [Weiter]

Verwendung der "Simple DirectMedia Layer"-API

Audio-CD-ROMs

  • Ein CD-ROM-Laufwerk öffnen

Die Anzahl der CD-Laufwerke gibt SDL_CDNumDrives() an. Mit SDL_CDOpen() kann man eines davon öffnen.

Das Standardlaufwerk des Systems ist immer Laufwerk Nummer 0. Das Laufwerk kann auch dann geöffnet werden, wenn es keine CD enthält.

Mit SDL_CDStatus() erhält man den Status des Laufwerks. SDL_CDClose() schließt es wieder.

Tip:
Den System-abhängigen Namen eines CD-Laufwerks erfährt man mit SDL_CDName().
Beispiel:
{
    SDL_CD *cdrom;

    if ( SDL_CDNumDrives() > 0 ) {
        cdrom = SDL_CDOpen(0);
        if ( cdrom == NULL ) {
            fprintf(stderr, "Das Standard-CD-Laufwerk konnte nicht geöffnet werden: %s\n" SDL_GetError());
            return;
        }

        ...

        SDL_CDClose(cdrom);
    }
}
  • Eine CD abspielen

CD-Laufwerke geben die Zeit entweder im MSF-Format (Minuten, Sekunden, Frames) oder direkt in Frames an. Ein Frame ist eine Standard-Zeiteinheit von CDs, es entspricht 1/75 Sekunde. SDL verwendet Frames statt des MSF-Formats, aber man kann mit den Macros FRAMES_TO_MSF() und MSF_TO_FRAMES() zwischen den Formaten umwandeln.

SDL aktualisiert die Status-Informationen in der SDL_CD-Struktur nur, wenn man SDL_CDStatus() aufruft. Daher sollte man diese Funktion regelmäßig aufrufen, um zu überprüfen, ob eine CD im Laufwerk ist und welche Tracks zur Verfügung stehen. Die Track-Nummern starten übrigens bei 0.

SDL hat zwei Funktionen, um eine CD abzuspielen. Mit SDL_CDPlayTracks() spielt man ausgewählte Tracks ab, mit SDL_CDPlay() ausgewählte Zeitabschnitte (in Frames).

SDL informiert den Benutzer nicht automatisch über das Einlegen einer CD oder das Ende des Abspielens. Den Status des Laufwerks erhält man nur, wenn man regelmäßig SDL_CDStatus() aufruft. Da diese Funktion das Inhaltsverzeichnis der CD ausliest, sollte sie trotzdem nicht zu häufig aufgerufen werden.

Tip:
Man kann Audiotracks von Datentracks unterscheiden, indem man cdrom->tracks[track].type abfragt und es mit SDL_AUDIO_TRACK und SDL_DATA_TRACK vergleicht.
Beispiel:
void TrackSpielen(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);
    }
}

[Zurück] Inhaltsverzeichnis [Weiter]