📄 subchannel.c
字号:
/* * 代码清单8: subchannel.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 + -