test/testcdrom.c
author Patrice Mandin <patmandin@gmail.com>
Thu, 19 Jan 2006 21:28:52 +0000
changeset 1257 448a9a64537b
parent 1154 d93862a3d821
child 1484 b2b476a4a73c
permissions -rw-r--r--
[PATCH] SDL_GetVideoMode() does not find best mode, part 2

Following commit 1.51, I come accross a problem when SDL must choose between
several video modes that could suit the one asked.

If I ask 320x240 with this list:
768x480 768x240 640x400 640x200 384x480 384x240 320x400 320x200

The smallest selectables modes are 384x240 and 320x400. And SDL choose the later
in this list, but 384x240 is more suitable. So I added a check to compare
the pixel count (surface) of modes, and select the one which has the smallest
pixel count.

In my example, 384x240 has 92160 pixels, and 320x400 has 128000 pixels. So now
SDL will choose 384x240 for the asked 320x240 mode.
     1 
     2 /* Test the SDL CD-ROM audio functions */
     3 
     4 #include <stdlib.h>
     5 #include <ctype.h>
     6 #include <stdlib.h>
     7 #include <string.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 }