我有一个 USB 2.0 CD/DVD 驱动器,它(在其他用例中)用于播放音乐 CD。但是:驱动器似乎忽略了 CDROMPLAYMSF 命令。
主机是带有当前版本 Raspbian 的 Raspberry Pi 3B。我正在使用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
最初的 CD ROM 驱动器(在 IDE 时代)通过模拟音频连接到主板。然后,SCSI 命令
PLAY
、及其变体将音频 CD 播放到此模拟输出,就像独立的 CD 播放器一样。STOP
SCAN
CDROMPLAYMSF
ioctl 发出这些 SCSI 命令之一,即PLAY AUDIO MSF
. MSF 定义 CD 上的位置(以分钟、秒、帧为单位)。内部 CD ROM 早已失去此功能,外部 USB CD ROM 也是如此(没有模拟音频连接到主板)。所以你的 CD 播放器理所当然地忽略了这个命令。
IIRC
libcdaudio
库还具有从 CD 读取数字数据的功能。您需要使用这些,然后将数据传递给 Pulseaudio 等以播放 CD。你也可以使用现成的命令行工具
mplayer cdda://
。来自 Linux内核源代码:
此外,我的回答可能对您有用:从内核源代码获取所有 ioctl 定义。
我以同样的方式找到了您问题的答案,只是
grep
稍微更改了命令:编辑
来自Compact_Disc_Digital_Audio#Data_structure:
此外,来自Compact_Disc_Digital_Audio#Frames_and_timecode_frames: