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

📄 实例13-15.c

📁 linuxc编程书里的每章节课后全部的源代码 需要的人下载
💻 C
字号:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>

/* CD驱动器对应的设备文件 */
#define DEVICE "/dev/cdrom"

/* 返回CD当前状态的字符串 */
char* audiostatus(int status) 
{
  switch(status) {
  case CDROM_AUDIO_INVALID:  return "Invalid";
  case CDROM_AUDIO_PLAY:      return "Playing";
  case CDROM_AUDIO_PAUSED:    return "Paused";
  case CDROM_AUDIO_COMPLETED: return "Completed";
  case CDROM_AUDIO_ERROR:     return "Error";
  case CDROM_AUDIO_NO_STATUS: return "Stopped";
  defautl:                    return "Unknown";
  }
} 
int main() 
{
  int fd;
  int status;
  struct cdrom_subchnl channel;

  /* 打开设备 */
  fd = open(DEVICE, O_RDONLY);
  if (fd < 0) {
    perror("unable to open " DEVICE);
    exit(1);
  }
  while(1) {
    /* 读取子通道数据 */
    channel.cdsc_format = CDROM_MSF; /* 采用MSF格式地址 */
    status = ioctl(fd, CDROMSUBCHNL, &channel);
    if (status != 0) {
      perror("CDROMSUBCHNL ioctl failed");
      exit(1);
    }
    /* 输出CD的当前状态 */
    printf("Status: %s \n", audiostatus(channel.cdsc_audiostatus));
    printf("Track: %d \n", channel.cdsc_trk);
    printf("Postion: %02d:%02d:%02d(%02d:%02d:%02d) \n\n",
           channel.cdsc_reladdr.msf.minute,
           channel.cdsc_reladdr.msf.second,
           channel.cdsc_reladdr.msf.frame,
           channel.cdsc_absaddr.msf.minute,
           channel.cdsc_absaddr.msf.second,
           channel.cdsc_absaddr.msf.frame);
    fflush(stdout);
    usleep(100000);
  }
  /* 关闭设备 */
  status = close(fd);
  if (status != 0) {
    perror("unable to close " DEVICE);
    exit(1);
  }
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -