SDL-1.2.14
[sdl_omap.git] / test / testcdrom.c
1
2 /* Test the SDL CD-ROM audio functions */
3
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <ctype.h>
8
9 #include "SDL.h"
10
11 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
12 static void quit(int rc)
13 {
14         SDL_Quit();
15         exit(rc);
16 }
17
18 static void PrintStatus(int driveindex, SDL_CD *cdrom)
19 {
20         CDstatus status;
21         char *status_str;
22
23         status = SDL_CDStatus(cdrom);
24         switch (status) {
25                 case CD_TRAYEMPTY:
26                         status_str = "tray empty";
27                         break;
28                 case CD_STOPPED:
29                         status_str = "stopped";
30                         break;
31                 case CD_PLAYING:
32                         status_str = "playing";
33                         break;
34                 case CD_PAUSED:
35                         status_str = "paused";
36                         break;
37                 case CD_ERROR:
38                         status_str = "error state";
39                         break;
40         }
41         printf("Drive %d status: %s\n", driveindex, status_str);
42         if ( status >= CD_PLAYING ) {
43                 int m, s, f;
44                 FRAMES_TO_MSF(cdrom->cur_frame, &m, &s, &f);
45                 printf("Currently playing track %d, %d:%2.2d\n",
46                         cdrom->track[cdrom->cur_track].id, m, s);
47         }
48 }
49
50 static void ListTracks(SDL_CD *cdrom)
51 {
52         int i;
53         int m, s, f;
54         char* trtype;
55
56         SDL_CDStatus(cdrom);
57         printf("Drive tracks: %d\n", cdrom->numtracks);
58         for ( i=0; i<cdrom->numtracks; ++i ) {
59                 FRAMES_TO_MSF(cdrom->track[i].length, &m, &s, &f);
60                 if ( f > 0 )
61                         ++s;
62                 switch(cdrom->track[i].type)
63                 {
64                     case SDL_AUDIO_TRACK:
65                         trtype="audio";
66                         break;
67                     case SDL_DATA_TRACK:
68                         trtype="data";
69                         break;
70                     default:
71                         trtype="unknown";
72                         break;
73                 }
74                 printf("\tTrack (index %d) %d: %d:%2.2d / %d [%s track]\n", i,
75                                         cdrom->track[i].id, m, s, cdrom->track[i].length, trtype);
76         }
77 }
78
79 static void PrintUsage(char *argv0)
80 {
81         fprintf(stderr, "Usage: %s [drive#] [command] [command] ...\n", argv0);
82         fprintf(stderr, "Where 'command' is one of:\n");
83         fprintf(stderr, "       -status\n");
84         fprintf(stderr, "       -list\n");
85         fprintf(stderr, "       -play [first_track] [first_frame] [num_tracks] [num_frames]\n");
86         fprintf(stderr, "       -pause\n");
87         fprintf(stderr, "       -resume\n");
88         fprintf(stderr, "       -stop\n");
89         fprintf(stderr, "       -eject\n");
90         fprintf(stderr, "       -sleep <milliseconds>\n");
91 }
92
93 int main(int argc, char *argv[])
94 {
95         int drive;
96         int i;
97         SDL_CD *cdrom;
98
99         /* Initialize SDL first */
100         if ( SDL_Init(SDL_INIT_CDROM) < 0 ) {
101                 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
102                 return(1);
103         }
104
105         /* Find out how many CD-ROM drives are connected to the system */
106         if ( SDL_CDNumDrives() == 0 ) {
107                 printf("No CD-ROM devices detected\n");
108                 quit(0);
109         }
110         printf("Drives available: %d\n", SDL_CDNumDrives());
111         for ( i=0; i<SDL_CDNumDrives(); ++i ) {
112                 printf("Drive %d:  \"%s\"\n", i, SDL_CDName(i));
113         }
114
115         /* Open the CD-ROM */
116         drive = 0;
117         i=1;
118         if ( argv[i] && isdigit(argv[i][0]) ) {
119                 drive = atoi(argv[i++]);
120         }
121         cdrom = SDL_CDOpen(drive);
122         if ( cdrom == NULL ) {
123                 fprintf(stderr, "Couldn't open drive %d: %s\n", drive,
124                                                         SDL_GetError());
125                 quit(2);
126         }
127 #ifdef TEST_NULLCD
128         cdrom = NULL;
129 #endif
130         
131         /* Find out which function to perform */
132         for ( ; argv[i]; ++i ) {
133                 if ( strcmp(argv[i], "-status") == 0 ) {
134                         /* PrintStatus(drive, cdrom); */
135                 } else
136                 if ( strcmp(argv[i], "-list") == 0 ) {
137                         ListTracks(cdrom);
138                 } else
139                 if ( strcmp(argv[i], "-play") == 0 ) {
140                         int strack, sframe;
141                         int ntrack, nframe;
142
143                         strack = 0;
144                         if ( argv[i+1] && isdigit(argv[i+1][0]) ) {
145                                 strack = atoi(argv[++i]);
146                         }
147                         sframe = 0;
148                         if ( argv[i+1] && isdigit(argv[i+1][0]) ) {
149                                 sframe = atoi(argv[++i]);
150                         }
151                         ntrack = 0;
152                         if ( argv[i+1] && isdigit(argv[i+1][0]) ) {
153                                 ntrack = atoi(argv[++i]);
154                         }
155                         nframe = 0;
156                         if ( argv[i+1] && isdigit(argv[i+1][0]) ) {
157                                 nframe = atoi(argv[++i]);
158                         }
159                         if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) {
160                                 if ( SDL_CDPlayTracks(cdrom, strack, sframe,
161                                                         ntrack, nframe) < 0 ) {
162                                         fprintf(stderr,
163                         "Couldn't play tracks %d/%d for %d/%d: %s\n",
164                                 strack, sframe, ntrack, nframe, SDL_GetError());
165                                 }
166                         } else {
167                                 fprintf(stderr, "No CD in drive!\n");
168                         }
169                 } else
170                 if ( strcmp(argv[i], "-pause") == 0 ) {
171                         if ( SDL_CDPause(cdrom) < 0 ) {
172                                 fprintf(stderr, "Couldn't pause CD: %s\n",
173                                                                 SDL_GetError());
174                         }
175                 } else
176                 if ( strcmp(argv[i], "-resume") == 0 ) {
177                         if ( SDL_CDResume(cdrom) < 0 ) {
178                                 fprintf(stderr, "Couldn't resume CD: %s\n",
179                                                                 SDL_GetError());
180                         }
181                 } else
182                 if ( strcmp(argv[i], "-stop") == 0 ) {
183                         if ( SDL_CDStop(cdrom) < 0 ) {
184                                 fprintf(stderr, "Couldn't eject CD: %s\n",
185                                                                 SDL_GetError());
186                         }
187                 } else
188                 if ( strcmp(argv[i], "-eject") == 0 ) {
189                         if ( SDL_CDEject(cdrom) < 0 ) {
190                                 fprintf(stderr, "Couldn't eject CD: %s\n",
191                                                                 SDL_GetError());
192                         }
193                 } else
194                 if ( (strcmp(argv[i], "-sleep") == 0) &&
195                                 (argv[i+1] && isdigit(argv[i+1][0])) ) {
196                         SDL_Delay(atoi(argv[++i]));
197                         printf("Delayed %d milliseconds\n", atoi(argv[i]));
198                 } else {
199                         PrintUsage(argv[0]);
200                         SDL_CDClose(cdrom);
201                         quit(1);
202                 }
203         }
204         PrintStatus(drive, cdrom);
205         SDL_CDClose(cdrom);
206         SDL_Quit();
207
208         return(0);
209 }