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