/* commands a scsi cdrom device to play audio. Probably NetBSD specific. * -- * usage: cdplay [-s startingtrack] [-e endtrack] [-d device] [-i] * Defaults to playing the entire disc in cd0. Plays a single track if just * the starting track specified, otherwise plays all tracks in range s to e. * "-i" reports the number of tracks on the disc. * -- * [$Id] * Chris Baird,, Released to the public domain. */ #include #include #include #include #include #include extern int errno; extern const char *const sys_errlist[]; extern char *optarg; extern int optind; main(int argc, char* argv[]) { struct ioc_play_track cmd; struct ioc_toc_header tocheader; struct ioc_vol volume[4]; char cddev[32] = "/dev/cd0a"; int s=0, e=0, v=255, i=0, c; FILE* d; while ((c = getopt(argc, argv, "iv:s:e:d:")) != -1) switch(c) { case 'i': i = 1; break; case 'v': v = atoi(optarg); break; case 's': s = atoi(optarg); break; case 'e': e = atoi(optarg); break; case 'd': strncpy (cddev+5, optarg, 26); break; } if ((d = fopen(cddev, "r")) == NULL) err(1, NULL); if ((ioctl (d->_file, CDIOREADTOCHEADER, &tocheader)) == -1) err(1, NULL); if (i != 0) { fprintf (stderr, "start_track=%d, end_track=%d, len=%d\n", tocheader.starting_track, tocheader.ending_track, tocheader.len); exit(0); } cmd.start_index = 1; cmd.end_index = 1; cmd.start_track = tocheader.starting_track; cmd.end_track = tocheader.ending_track; if (s != 0) if ((s < tocheader.starting_track) || (s > tocheader.ending_track)) errx (1, "bad starting track %d", s); else { cmd.start_track = s; cmd.end_track = s; } if (e != 0) if ((e < tocheader.starting_track) || (e > tocheader.ending_track) || (e < s)) errx (1, "bad ending track %d", e); else cmd.end_track = e; if ((v >= 0) && (v <= 255)) { volume->vol[0] = volume->vol[1] = volume->vol[2] = volume->vol[3] = v; ioctl (d->_file, CDIOCSETVOL, &volume); } if ((ioctl (d->_file, CDIOCPLAYTRACKS, &cmd)) == -1) err (1, NULL); fclose (d); }