/* Test the SDL CD-ROM audio functions */ #include #include #include #include #include "SDL.h" /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ static void quit (int rc) { SDL_Quit (); exit (rc); } static void PrintStatus (int driveindex, SDL_CD * cdrom) { CDstatus status; char *status_str; status = SDL_CDStatus (cdrom); switch (status) { case CD_TRAYEMPTY: status_str = "tray empty"; break; case CD_STOPPED: status_str = "stopped"; break; case CD_PLAYING: status_str = "playing"; break; case CD_PAUSED: status_str = "paused"; break; case CD_ERROR: status_str = "error state"; break; } printf ("Drive %d status: %s\n", driveindex, status_str); if (status >= CD_PLAYING) { int m, s, f; FRAMES_TO_MSF (cdrom->cur_frame, &m, &s, &f); printf ("Currently playing track %d, %d:%2.2d\n", cdrom->track[cdrom->cur_track].id, m, s); } } static void ListTracks (SDL_CD * cdrom) { int i; int m, s, f; char *trtype; SDL_CDStatus (cdrom); printf ("Drive tracks: %d\n", cdrom->numtracks); for (i = 0; i < cdrom->numtracks; ++i) { FRAMES_TO_MSF (cdrom->track[i].length, &m, &s, &f); if (f > 0) ++s; switch (cdrom->track[i].type) { case SDL_AUDIO_TRACK: trtype = "audio"; break; case SDL_DATA_TRACK: trtype = "data"; break; default: trtype = "unknown"; break; } printf ("\tTrack (index %d) %d: %d:%2.2d / %d [%s track]\n", i, cdrom->track[i].id, m, s, cdrom->track[i].length, trtype); } } static void PrintUsage (char *argv0) { fprintf (stderr, "Usage: %s [drive#] [command] [command] ...\n", argv0); fprintf (stderr, "Where 'command' is one of:\n"); fprintf (stderr, " -status\n"); fprintf (stderr, " -list\n"); fprintf (stderr, " -play [first_track] [first_frame] [num_tracks] [num_frames]\n"); fprintf (stderr, " -pause\n"); fprintf (stderr, " -resume\n"); fprintf (stderr, " -stop\n"); fprintf (stderr, " -eject\n"); fprintf (stderr, " -sleep \n"); } int main (int argc, char *argv[]) { int drive; int i; SDL_CD *cdrom; /* Initialize SDL first */ if (SDL_Init (SDL_INIT_CDROM) < 0) { fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ()); return (1); } /* Find out how many CD-ROM drives are connected to the system */ if (SDL_CDNumDrives () == 0) { printf ("No CD-ROM devices detected\n"); quit (0); } printf ("Drives available: %d\n", SDL_CDNumDrives ()); for (i = 0; i < SDL_CDNumDrives (); ++i) { printf ("Drive %d: \"%s\"\n", i, SDL_CDName (i)); } /* Open the CD-ROM */ drive = 0; i = 1; if (argv[i] && isdigit (argv[i][0])) { drive = atoi (argv[i++]); } cdrom = SDL_CDOpen (drive); if (cdrom == NULL) { fprintf (stderr, "Couldn't open drive %d: %s\n", drive, SDL_GetError ()); quit (2); } #ifdef TEST_NULLCD cdrom = NULL; #endif /* Find out which function to perform */ for (; argv[i]; ++i) { if (strcmp (argv[i], "-status") == 0) { /* PrintStatus(drive, cdrom); */ } else if (strcmp (argv[i], "-list") == 0) { ListTracks (cdrom); } else if (strcmp (argv[i], "-play") == 0) { int strack, sframe; int ntrack, nframe; strack = 0; if (argv[i + 1] && isdigit (argv[i + 1][0])) { strack = atoi (argv[++i]); } sframe = 0; if (argv[i + 1] && isdigit (argv[i + 1][0])) { sframe = atoi (argv[++i]); } ntrack = 0; if (argv[i + 1] && isdigit (argv[i + 1][0])) { ntrack = atoi (argv[++i]); } nframe = 0; if (argv[i + 1] && isdigit (argv[i + 1][0])) { nframe = atoi (argv[++i]); } if (CD_INDRIVE (SDL_CDStatus (cdrom))) { if (SDL_CDPlayTracks (cdrom, strack, sframe, ntrack, nframe) < 0) { fprintf (stderr, "Couldn't play tracks %d/%d for %d/%d: %s\n", strack, sframe, ntrack, nframe, SDL_GetError ()); } } else { fprintf (stderr, "No CD in drive!\n"); } } else if (strcmp (argv[i], "-pause") == 0) { if (SDL_CDPause (cdrom) < 0) { fprintf (stderr, "Couldn't pause CD: %s\n", SDL_GetError ()); } } else if (strcmp (argv[i], "-resume") == 0) { if (SDL_CDResume (cdrom) < 0) { fprintf (stderr, "Couldn't resume CD: %s\n", SDL_GetError ()); } } else if (strcmp (argv[i], "-stop") == 0) { if (SDL_CDStop (cdrom) < 0) { fprintf (stderr, "Couldn't eject CD: %s\n", SDL_GetError ()); } } else if (strcmp (argv[i], "-eject") == 0) { if (SDL_CDEject (cdrom) < 0) { fprintf (stderr, "Couldn't eject CD: %s\n", SDL_GetError ()); } } else if ((strcmp (argv[i], "-sleep") == 0) && (argv[i + 1] && isdigit (argv[i + 1][0]))) { SDL_Delay (atoi (argv[++i])); printf ("Delayed %d milliseconds\n", atoi (argv[i])); } else { PrintUsage (argv[0]); SDL_CDClose (cdrom); quit (1); } } PrintStatus (drive, cdrom); SDL_CDClose (cdrom); SDL_Quit (); return (0); }