ioctl CDROMPLAYMSF 命令的具体作用是什么?

ioctl CDROMPLAYMSF 命令的具体作用是什么?

我有一个 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 命令PLAYSTOPSCAN及其变体将在此模拟输出上播放音频 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 寻址方案中的“帧”之外。

相关内容