• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. */
quit(int rc)12 static void quit(int rc)
13 {
14 	SDL_Quit();
15 	exit(rc);
16 }
17 
PrintStatus(int driveindex,SDL_CD * cdrom)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 
ListTracks(SDL_CD * cdrom)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 
PrintUsage(char * argv0)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 
main(int argc,char * argv[])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 }
210