Video | Events | OpenGL | Audio | CD-ROM | Threads | Time
# CD-ROM Function Reference
Introduction | Function List | Function Reference | Examples
### Function definitions: `extern int SDL_CDNumDrives(void);` Returns the number of CD-ROM drives on the system `extern const char *SDL_CDName(int drive);` Returns a human-readable, system-dependent identifier for the CD-ROM. Examples: "/dev/cdrom" "E:" "/dev/disk/ide/1/master" `extern SDL_CD *SDL_CDOpen(int drive);` Opens a CD-ROM drive for access. It returns a drive handle on success, or `NULL` if the drive was invalid or busy. This newly opened CD-ROM becomes the default CD used when other CD functions are passed a `NULL` CD-ROM handle. Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. `extern CDstatus SDL_CDStatus(SDL_CD *cdrom);` This function returns the current status of the given drive. If the drive has a CD in it, the table of contents of the CD and current play position of the CD will be stored in the SDL_CD structure. `extern int SDL_CDPlayTracks(SDL_CD *cdrom, int start_track, int start_frame, int ntracks, int nframes);` Play the given CD starting at '`start_track`' and '`start_frame`' for '`ntracks`' tracks and '`nframes`' frames. If both '`ntrack`' and '`nframe`' are `0`, play until the end of the CD. This function will skip data tracks. This function should only be called after calling `SDL_CDStatus()` to get track information about the CD. For example:
            // Play entire CD:
            if ( CD_INDRIVE(SDL_CDStatus(cdrom)) )
                    SDL_CDPlayTracks(cdrom, 0, 0, 0, 0);
            // Play last track:
            if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) {
                    SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0);
            }
            // Play first and second track and 10 seconds of third track:
            if ( CD_INDRIVE(SDL_CDStatus(cdrom)) )
                    SDL_CDPlayTracks(cdrom, 0, 0, 2, 10);
This function returns `0`, or `-1` if there was an error. `extern int SDL_CDPlay(SDL_CD *cdrom, int start, int length);` Play the given CD starting at '`start`' frame for '`length`' frames. It returns `0`, or `-1` if there was an error. `int SDL_CDPause(SDL_CD *cdrom);` Pause play -- returns `0`, or `-1` on error `int SDL_CDResume(SDL_CD *cdrom);` Resume play -- returns `0`, or `-1` on error `int SDL_CDStop(SDL_CD *cdrom);` Stop play -- returns `0`, or `-1` on error `int SDL_CDEject(SDL_CD *cdrom);` Eject CD-ROM -- returns `0`, or `-1` on error `void SDL_CDClose(SDL_CD *cdrom);` Closes the handle for the CD-ROM drive ### Structure definitions:
    /* The possible states which a CD-ROM drive can be in. */
    typedef enum {
            CD_TRAYEMPTY,
            CD_STOPPED,
            CD_PLAYING,
            CD_PAUSED,
            CD_ERROR = -1
    } CDstatus;

    /* The structure identifying a track on the CD */
    typedef struct {
            Uint8 id;               /* Track number */
            Uint8 type;             /* Data or audio track */
            Uint16 length;          /* Length, in frames, of this track */
            Uint32 offset;          /* Offset, in frames, from start of disk */
    } SDL_CDtrack;

    /* This structure is only current as of the last call to SDL_CDStatus() */
    typedef struct SDL_CD {
            int id;                 /* Private drive identifier */
            CDstatus status;        /* Current drive status */

            /* The rest of this structure is only valid if there's a CD in drive */
            int numtracks;          /* Number of tracks on disk */
            int cur_track;          /* Current track position */
            int cur_frame;          /* Current frame offset within current track */
            SDL_CDtrack track[SDL_MAX_TRACKS+1];
    } SDL_CD;
### Useful Macros
    /* Given a status, returns true if there's a disk in the drive */
    #define CD_INDRIVE(status)      ((int)status > 0)

    /* Conversion functions from frames to Minute/Second/Frames and vice versa */
    #define CD_FPS  75
    #define FRAMES_TO_MSF(f, M,S,F) {                                       \
            int value = f;                                                  \
            *(F) = value%CD_FPS;                                            \
            value /= CD_FPS;                                                \
            *(S) = value%60;                                                \
            value /= 60;                                                    \
            *(M) = value;                                                   \
    }
    #define MSF_TO_FRAMES(M, S, F)  ((M)*60*CD_FPS+(S)*CD_FPS+(F))