⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playcd.c

📁 在linux下多媒体开发实例linux下多媒体开发
💻 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 + -