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 尋址方案中的「幀」)。

相關內容