| Video | Events | Audio | CD-ROM | Threads |
| Introduction | Function List | Function Reference | Examples |

extern int SDL_CDNumDrives(void);
Returns the number of CD-ROM drives on the system
Returns a human-readable, system-dependent identifier for the CD-ROM.
Opens a CD-ROM drive for access. It returns a drive handle on success,
or
This function returns the current status of the given drive.
Play the given CD starting at '
Play the given CD starting at '
Pause play -- returns
Resume play -- returns
Stop play -- returns
Eject CD-ROM -- returns
Closes the handle for the CD-ROM drive

extern const char *SDL_CDName(int drive);
Examples:

extern SDL_CD *SDL_CDOpen(int drive);
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);
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);
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);
start' frame for
'length' frames.
It returns 0, or -1 if there was an error.

int SDL_CDPause(SDL_CD *cdrom);
0, or -1 on error

int SDL_CDResume(SDL_CD *cdrom);
0, or -1 on error

int SDL_CDStop(SDL_CD *cdrom);
0, or -1 on error

int SDL_CDEject(SDL_CD *cdrom);
0, or -1 on error

void SDL_CDClose(SDL_CD *cdrom);
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))