|
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 } |