我有一个 USB 2.0 CD/DVD 驱动器,它(以及其他用例)用于播放音乐 CD。但是:驱动器似乎忽略 CDROMPLAYMSF 命令。
主机是 Raspberry Pi 3B,当前版本为 Raspbian。我用于libcdaudio
音频 CD 播放,它依次发出必要的ioctl
命令,包括 CDROMPLAYMSF。
更新:cd-drive
根据要求,我可以向您提供我的驱动器的规格,如以下实用程序所示cdio
:
CD-ROM drive supports MMC 3
Drive: /dev/cdrom
Vendor : MATSHITA
Model : CD-RW CW-8124
Revision : DA0D
Hardware : CD-ROM or DVD
Can eject : Yes
Can close tray : Yes
Can disable manual eject : Yes
Can select juke-box disc : No
Can set drive speed : No
Can read multiple sessions (e.g. PhotoCD) : Yes
Can hard reset device : Yes
Reading....
Can read Mode 2 Form 1 : Yes
Can read Mode 2 Form 2 : Yes
Can read (S)VCD (i.e. Mode 2 Form 1/2) : Yes
Can read C2 Errors : Yes
Can read IRSC : Yes
Can read Media Channel Number (or UPC) : Yes
Can play audio : Yes
Can read CD-DA : Yes
Can read CD-R : Yes
Can read CD-RW : Yes
Can read DVD-ROM : Yes
Writing....
Can write CD-RW : Yes
Can write DVD-R : No
Can write DVD-RAM : No
Can write DVD-RW : No
Can write DVD+RW : No
答案1
最初,CD ROM 驱动器(在 IDE 时代)具有与主板的模拟音频连接。然后,SCSI 命令PLAY
、STOP
、SCAN
及其变体将在此模拟输出上播放音频 CD,就像独立的 CD 播放器一样。
ioctlCDROMPLAYMSF
发出这些 SCSI 命令之一,即PLAY AUDIO MSF
. MSF 定义 CD 上的位置(以分钟、秒、帧为单位)。
内部 CD ROM 早已失去了此功能,外部 USB CD ROM 也是如此(主板上没有模拟音频连接)。所以你的 CD 播放器理所当然地忽略了这个命令。
IIRClibcdaudio
库还具有从CD读取数字数据的功能。您需要使用它们,然后将数据传递给 Pulseaudio 等来播放 CD。
您还可以使用类似的现成命令行工具mplayer cdda://
。
答案2
从Linux内核源代码:
CDROMPLAYMSF Play Audio MSF (struct cdrom_msf)
usage:
struct cdrom_msf msf;
ioctl(fd, CDROMPLAYMSF, &msf);
inputs:
cdrom_msf structure, describing a segment of music to play
outputs: none
error return:
ENOSYS cd drive not audio-capable.
notes:
MSF stands for minutes-seconds-frames
LBA stands for logical block address
Segment is described as start and end times, where each time
is described as minutes:seconds:frames. A frame is 1/75 of
a second.
另外,我的回答可能对你有用:从内核源代码中获取所有 ioctl 定义。
我用同样的方式找到了你问题的答案,只是grep
稍微改变了命令:
grep -r 'CDROMPLAYMSF' * | vim -
编辑
从Compact_Disc_Digital_Audio#数据结构:
音频 CD 中的音频数据流是连续的,但由三个部分组成。主要部分是节目区,进一步分为可播放的音轨。该部分之前是导入轨道,之后是导出轨道。导入和导出轨道仅编码无声音频,但所有三个部分都包含子码数据流。
导入区的子代码包含光盘目录 (TOC) 的重复副本,它提供了程序区和导入区中轨道的起始位置的索引。轨道位置由绝对时间码引用,相对于节目区域的开头,采用 MSF 格式:分钟、秒和称为帧的小数秒。每个时间码帧是七十五秒,对应于 98 个通道数据帧的块,最终是 588 对左右音频样本的块。包含在子通道数据中的时间码允许读取设备定位与TOC中的时间码对应的盘的区域。光盘上的目录类似于硬盘驱动器上的分区表。
另外,从Compact_Disc_Digital_Audio#Frames_and_timecode_frames:
在红皮书音频 CD 上,数据是使用无国界医生组织方案,时间码以分钟、秒和另一种类型的帧 (mm:ss:ff) 表示,其中一帧对应音频的 1/75 秒:588 对左右样本。该时间码帧与上述33字节通道数据帧不同,用于时间显示和定位读取激光器。当编辑和提取 CD 音频时,该时间码帧是音频 CD 的最小可寻址时间间隔;因此,轨道边界仅出现在这些帧边界上。每个结构都包含 98 个通道数据帧,总共 98 × 24 = 2,352 字节的音乐。 CD 的播放速度为每秒 75 帧(或扇区),即每秒 44,100 个样本或 176,400 字节。
在 20 世纪 90 年代,CD-ROM 和相关的数字音频提取 (DAE) 技术引入了术语“扇区”来指代每个时间码帧,每个扇区由从零开始的连续整数来标识,并且轨道在扇区边界上对齐。音频 CD 扇区对应于 2,352 字节的解码数据。红皮书不提及扇区,也不区分光盘数据流的相应部分,除了 MSF 寻址方案中的“帧”之外。