1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken@libsdl.org 21 */ 22 23 /** 24 * @file SDL_cdrom.h 25 * This is the CD-audio control API for Simple DirectMedia Layer 26 */ 27 28 #ifndef _SDL_cdrom_h 29 #define _SDL_cdrom_h 30 31 #include "SDL_stdinc.h" 32 #include "SDL_error.h" 33 34 #include "begin_code.h" 35 /* Set up for C function definitions, even when using C++ */ 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 /** 41 * @file SDL_cdrom.h 42 * In order to use these functions, SDL_Init() must have been called 43 * with the SDL_INIT_CDROM flag. This causes SDL to scan the system 44 * for CD-ROM drives, and load appropriate drivers. 45 */ 46 47 /** The maximum number of CD-ROM tracks on a disk */ 48 #define SDL_MAX_TRACKS 99 49 50 /** @name Track Types 51 * The types of CD-ROM track possible 52 */ 53 /*@{*/ 54 #define SDL_AUDIO_TRACK 0x00 55 #define SDL_DATA_TRACK 0x04 56 /*@}*/ 57 58 /** The possible states which a CD-ROM drive can be in. */ 59 typedef enum { 60 CD_TRAYEMPTY, 61 CD_STOPPED, 62 CD_PLAYING, 63 CD_PAUSED, 64 CD_ERROR = -1 65 } CDstatus; 66 67 /** Given a status, returns true if there's a disk in the drive */ 68 #define CD_INDRIVE(status) ((int)(status) > 0) 69 70 typedef struct SDL_CDtrack { 71 Uint8 id; /**< Track number */ 72 Uint8 type; /**< Data or audio track */ 73 Uint16 unused; 74 Uint32 length; /**< Length, in frames, of this track */ 75 Uint32 offset; /**< Offset, in frames, from start of disk */ 76 } SDL_CDtrack; 77 78 /** This structure is only current as of the last call to SDL_CDStatus() */ 79 typedef struct SDL_CD { 80 int id; /**< Private drive identifier */ 81 CDstatus status; /**< Current drive status */ 82 83 /** The rest of this structure is only valid if there's a CD in drive */ 84 /*@{*/ 85 int numtracks; /**< Number of tracks on disk */ 86 int cur_track; /**< Current track position */ 87 int cur_frame; /**< Current frame offset within current track */ 88 SDL_CDtrack track[SDL_MAX_TRACKS+1]; 89 /*@}*/ 90 } SDL_CD; 91 92 /** @name Frames / MSF Conversion Functions 93 * Conversion functions from frames to Minute/Second/Frames and vice versa 94 */ 95 /*@{*/ 96 #define CD_FPS 75 97 #define FRAMES_TO_MSF(f, M,S,F) { \ 98 int value = f; \ 99 *(F) = value%CD_FPS; \ 100 value /= CD_FPS; \ 101 *(S) = value%60; \ 102 value /= 60; \ 103 *(M) = value; \ 104 } 105 #define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F)) 106 /*@}*/ 107 108 /* CD-audio API functions: */ 109 110 /** 111 * Returns the number of CD-ROM drives on the system, or -1 if 112 * SDL_Init() has not been called with the SDL_INIT_CDROM flag. 113 */ 114 extern DECLSPEC int SDLCALL SDL_CDNumDrives(void); 115 116 /** 117 * Returns a human-readable, system-dependent identifier for the CD-ROM. 118 * Example: 119 * - "/dev/cdrom" 120 * - "E:" 121 * - "/dev/disk/ide/1/master" 122 */ 123 extern DECLSPEC const char * SDLCALL SDL_CDName(int drive); 124 125 /** 126 * Opens a CD-ROM drive for access. It returns a drive handle on success, 127 * or NULL if the drive was invalid or busy. This newly opened CD-ROM 128 * becomes the default CD used when other CD functions are passed a NULL 129 * CD-ROM handle. 130 * Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. 131 */ 132 extern DECLSPEC SDL_CD * SDLCALL SDL_CDOpen(int drive); 133 134 /** 135 * This function returns the current status of the given drive. 136 * If the drive has a CD in it, the table of contents of the CD and current 137 * play position of the CD will be stored in the SDL_CD structure. 138 */ 139 extern DECLSPEC CDstatus SDLCALL SDL_CDStatus(SDL_CD *cdrom); 140 141 /** 142 * Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks' 143 * tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play 144 * until the end of the CD. This function will skip data tracks. 145 * This function should only be called after calling SDL_CDStatus() to 146 * get track information about the CD. 147 * For example: 148 * @code 149 * // Play entire CD: 150 * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) 151 * SDL_CDPlayTracks(cdrom, 0, 0, 0, 0); 152 * // Play last track: 153 * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { 154 * SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0); 155 * } 156 * // Play first and second track and 10 seconds of third track: 157 * if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) 158 * SDL_CDPlayTracks(cdrom, 0, 0, 2, 10); 159 * @endcode 160 * 161 * @return This function returns 0, or -1 if there was an error. 162 */ 163 extern DECLSPEC int SDLCALL SDL_CDPlayTracks(SDL_CD *cdrom, 164 int start_track, int start_frame, int ntracks, int nframes); 165 166 /** 167 * Play the given CD starting at 'start' frame for 'length' frames. 168 * @return It returns 0, or -1 if there was an error. 169 */ 170 extern DECLSPEC int SDLCALL SDL_CDPlay(SDL_CD *cdrom, int start, int length); 171 172 /** Pause play 173 * @return returns 0, or -1 on error 174 */ 175 extern DECLSPEC int SDLCALL SDL_CDPause(SDL_CD *cdrom); 176 177 /** Resume play 178 * @return returns 0, or -1 on error 179 */ 180 extern DECLSPEC int SDLCALL SDL_CDResume(SDL_CD *cdrom); 181 182 /** Stop play 183 * @return returns 0, or -1 on error 184 */ 185 extern DECLSPEC int SDLCALL SDL_CDStop(SDL_CD *cdrom); 186 187 /** Eject CD-ROM 188 * @return returns 0, or -1 on error 189 */ 190 extern DECLSPEC int SDLCALL SDL_CDEject(SDL_CD *cdrom); 191 192 /** Closes the handle for the CD-ROM drive */ 193 extern DECLSPEC void SDLCALL SDL_CDClose(SDL_CD *cdrom); 194 195 196 /* Ends C function definitions when using C++ */ 197 #ifdef __cplusplus 198 } 199 #endif 200 #include "close_code.h" 201 202 #endif /* _SDL_video_h */ 203