
私は USB 2.0 CD/DVD ドライブを持っています。これは (他の用途の中でも) 音楽 CD の再生に使用されます。しかし、ドライブは CDROMPLAYMSF コマンドを無視するようです。
ホストは、Raspbian の最新バージョンを搭載した Raspberry Pi 3B です。libcdaudio
オーディオ CD の再生に使用しており、CDROMPLAYMSF などの必要なioctl
コマンドを発行します。
アップデート: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 コマンドの 1 つ、つまり を発行しますPLAY AUDIO MSF
。MSF は、CD 上の位置 (分、秒、フレーム単位) を定義します。
内蔵 CD ROM は、外付け USB CD ROM と同様に、この機能を長い間失っています (マザーボードへのアナログ オーディオ接続はありません)。そのため、CD プレーヤーは当然このコマンドを無視します。
確か、libcdaudio
ライブラリには CD からデジタル データを読み取る関数もあります。CD を再生するには、それらを使用して、データを Pulseaudio などに渡す必要があります。
そのために、既製のコマンドライン ツールを使用することもできます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 -
編集
オーディオ CD のオーディオ データ ストリームは連続していますが、3 つの部分に分かれています。メイン部分はプログラム領域で、再生可能なオーディオ トラックにさらに分割されています。このセクションの前にはリードイン トラックがあり、リードアウト トラックが続きます。リードイン トラックとリードアウト トラックは無音のオーディオのみをエンコードしますが、3 つのセクションすべてにサブコード データ ストリームが含まれています。
リードインのサブコードには、ディスクの目次 (TOC) の繰り返しコピーが含まれており、プログラム領域とリードアウト内のトラックの開始位置のインデックスを提供します。トラックの位置は、プログラム領域の開始を基準とした絶対タイムコードによって参照され、MSF 形式 (分、秒、およびフレームと呼ばれる秒の小数部) で表されます。各タイムコード フレームは 1/75 秒で、98 個のチャネル データ フレームのブロックに対応します。最終的には、588 組の左と右のオーディオ サンプルのブロックになります。サブチャネル データに含まれるタイムコードにより、読み取りデバイスは TOC 内のタイムコードに対応するディスクの領域を見つけることができます。ディスク上の TOC は、ハード ドライブのパーティション テーブルに似ています。
また、Compact_Disc_Digital_Audio#フレームとタイムコードフレーム:
レッドブックオーディオCDでは、データは国境なき医師団タイムコードは分、秒、および別の種類のフレーム (mm:ss:ff) で表されます。1 フレームはオーディオの 1/75 秒 (左と右のサンプルのペア 588 個) に相当します。このタイムコード フレームは、上記の 33 バイトのチャネル データ フレームとは異なり、時間の表示と読み取りレーザーの位置決めに使用されます。CD オーディオを編集および抽出する場合、このタイムコード フレームはオーディオ CD のアドレス指定可能な最小の時間間隔です。したがって、トラック境界はこれらのフレーム境界でのみ発生します。これらの構造にはそれぞれ 98 個のチャネル データ フレームが含まれており、合計 98 × 24 = 2,352 バイトの音楽になります。CD は 1 秒あたり 75 フレーム (またはセクター) の速度で再生されるため、1 秒あたり 44,100 サンプル、つまり 176,400 バイトになります。
1990 年代に、CD-ROM および関連するデジタル オーディオ抽出 (DAE) テクノロジでは、各タイムコード フレームを指すためにセクターという用語が導入されました。各セクターは 0 から始まる連続した整数で識別され、トラックはセクター境界に揃えられています。オーディオ CD セクターは、2,352 バイトのデコードされたデータに相当します。レッド ブックではセクターについて言及しておらず、MSF アドレス指定スキームの「フレーム」以外では、ディスクのデータ ストリームの対応するセクションを区別していません。