📄 playcd.c
字号:
/* * playcd.c * Example of simple audio CD player. * */#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/cdrom.h>/* display command usage and exit */void usage(void){ fprintf(stderr, "usage: playcd <options>\n" "valid options:\n" " play <first-track> <last-track>\n" " stop\n" " pause\n" " resume\n" " volume <left-vol> <right-vol>\n" " toc\n"); exit(1);}/* * Utility routine to print error message and exit if given * non-zero status */void status_check(int status, const char *ioctl){ char buf[255]; if (status != 0) { sprintf(buf, "%s ioctl failed", ioctl); perror(buf); exit(1); }}int main(int argc, char *argv[]){ const char *device = "/dev/cdrom"; /* CD-ROM device file name */ int fd; /* CD-ROM file descriptor */ int status; /* hold status of system calls */ struct cdrom_ti ti; /* track/index info */ struct cdrom_tochdr tochdr; /* TOC header */ struct cdrom_tocentry tocentry; /* TOC entry */ struct cdrom_volctrl volctrl; /* volume settings */ /* there should be at least one command line argument */ if (argc < 2) usage(); /* open device */ status = fd = open(device, O_RDONLY); if (status < 0) { perror("open failed"); exit(1); } if (!strcmp(argv[1], "play")) { if (argc != 4) usage(); ti.cdti_trk0 = strtol(argv[2], 0, 10); ti.cdti_ind0 = 0; ti.cdti_trk1 = strtol(argv[3], 0, 10); ti.cdti_ind1 = 0; status = ioctl(fd, CDROMPLAYTRKIND, &ti); status_check(status, "CDROMPLAYTRKIND"); } else if (!strcmp(argv[1], "stop")) { status = ioctl(fd, CDROMSTOP); status_check(status, "CDROMSTOP"); } else if (!strcmp(argv[1], "pause")) { status = ioctl(fd, CDROMPAUSE); status_check(status, "CDROMPAUSE"); } else if (!strcmp(argv[1], "resume")) { status = ioctl(fd, CDROMRESUME); status_check(status, "CDROMRESUME"); } else if (!strcmp(argv[1], "volume")) { if (argc != 4) usage(); volctrl.channel0 = strtol(argv[2], 0, 0); volctrl.channel1 = strtol(argv[3], 0, 0); volctrl.channel2 = 0; volctrl.channel3 = 0; status = ioctl(fd, CDROMVOLCTRL, &volctrl); status_check(status, "CDROMVOLCTRL"); } else if (!strcmp(argv[1], "toc")) { int track; status = ioctl(fd, CDROMREADTOCHDR, &tochdr); status_check(status, "CDROMREADTOCHDR"); printf("Track mn/sc/frm Track mn/sc/frm Track mn/sc/frm Track mn/sc/frm\n"); for (track = 1 ; track <= tochdr.cdth_trk1 ; track++) { tocentry.cdte_track = track; tocentry.cdte_format = CDROM_MSF; /* want info in MSF format */ status = ioctl(fd, CDROMREADTOCENTRY, &tocentry); status_check(status, "CDROMREADTOCENTRY"); printf("%5d %02d:%02d.%03d %c ", tocentry.cdte_track, tocentry.cdte_addr.msf.minute, tocentry.cdte_addr.msf.second, tocentry.cdte_addr.msf.frame, (tocentry.cdte_ctrl & CDROM_DATA_TRACK) ? 'D' : 'A'); if ((track % 4) == 0 || (track == tochdr.cdth_trk1)) printf("\n"); } /* now print info for end of last track */ tocentry.cdte_track = CDROM_LEADOUT; status = ioctl(fd, CDROMREADTOCENTRY, &tocentry); status_check(status, "CDROMREADTOCENTRY"); printf("(end) %02d:%02d.%03d\n", tocentry.cdte_addr.msf.minute, tocentry.cdte_addr.msf.second, tocentry.cdte_addr.msf.frame); } else { usage(); } /* close device */ status = close(fd); if (status != 0) { perror("close failed"); exit(1); } exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -