如何将 CD 音轨输入 ALSA 驱动的声音输出设备?
How do I feed CD audio tracks into an ALSA-driven sound output device?
我正在使用没有内置声音解码器的 USB CD/DVD 驱动器并通过 ALSA 控制它,这已经可以工作了。宿主是一个Raspberry Pi3B,当前Raspbian。这是相应的配置文件:
pi@autoradio:/etc $ cat asound.conf
pcm.dmixer {
type dmix
ipc_key 1024
ipc_perm 0666
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 192000
format S32_LE
channels 2
}
bindings {
0 0
1 1
}
}
pcm.dsnooper {
type dsnoop
ipc_key 2048
ipc_perm 0666
slave
{
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 192000
format S32_LE
channels 2
}
bindings {
0 0
1 1
}
}
pcm.duplex {
type asym
playback.pcm "dmixer"
capture.pcm "dsnooper"
}
pcm.!default {
type plug
slave.pcm "duplex"
}
ctl.!default {
type hw
card 0
}
要从 CD-DA 读取音乐,我将使用 CDIO++ library。它的 cd-info
实用程序可以识别驱动器和音频 CD:
pi@autoradio:/etc $ cd-info
cd-info version 2.1.0 armv7l-unknown-linux-gnueabihf
CD location : /dev/cdrom
CD driver name: GNU/Linux
access mode: IOCTL
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
__________________________________
Disc mode is listed as: CD-DA
我已经知道 some code to send the PCM data to the sound card and some insight regarding the (rather poorly documented) CDIO API (I know that the readSectors()
方法用于从 CD 一个扇区一个扇区地读取声音数据),但对于如何将数据从 CD-DA 输入移交给ALSA输出例程正确。
请注意 mplayer
对我来说是禁区,因为这个例程将成为更大解决方案的一部分。
如有任何帮助,我们将不胜感激。
更新:音频 CD(2,352 字节)和声音输出(910 字节,至少在我的特定情况下)的不同块大小是否重要?
CD 音频数据只是 44.1 kHz 的两个小端 16 位样本通道。
如果您将数据输出到标准输出,您可以将其通过管道传输到您的声音播放程序中,或者aplay
:
./my-read-cdda | ./play 44100 2 99999
./my-read-cdda | aplay --file-type raw --format cd
如果您想在一个程序中执行所有操作,请将 read(0, ...)
替换为 readSectors()
。 (缓冲区大小不需要与ALSA的周期大小或缓冲区大小有任何关系。)
我正在使用没有内置声音解码器的 USB CD/DVD 驱动器并通过 ALSA 控制它,这已经可以工作了。宿主是一个Raspberry Pi3B,当前Raspbian。这是相应的配置文件:
pi@autoradio:/etc $ cat asound.conf
pcm.dmixer {
type dmix
ipc_key 1024
ipc_perm 0666
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 192000
format S32_LE
channels 2
}
bindings {
0 0
1 1
}
}
pcm.dsnooper {
type dsnoop
ipc_key 2048
ipc_perm 0666
slave
{
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 192000
format S32_LE
channels 2
}
bindings {
0 0
1 1
}
}
pcm.duplex {
type asym
playback.pcm "dmixer"
capture.pcm "dsnooper"
}
pcm.!default {
type plug
slave.pcm "duplex"
}
ctl.!default {
type hw
card 0
}
要从 CD-DA 读取音乐,我将使用 CDIO++ library。它的 cd-info
实用程序可以识别驱动器和音频 CD:
pi@autoradio:/etc $ cd-info
cd-info version 2.1.0 armv7l-unknown-linux-gnueabihf
CD location : /dev/cdrom
CD driver name: GNU/Linux
access mode: IOCTL
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
__________________________________
Disc mode is listed as: CD-DA
我已经知道 some code to send the PCM data to the sound card and some insight regarding the (rather poorly documented) CDIO API (I know that the readSectors()
方法用于从 CD 一个扇区一个扇区地读取声音数据),但对于如何将数据从 CD-DA 输入移交给ALSA输出例程正确。
请注意 mplayer
对我来说是禁区,因为这个例程将成为更大解决方案的一部分。
如有任何帮助,我们将不胜感激。
更新:音频 CD(2,352 字节)和声音输出(910 字节,至少在我的特定情况下)的不同块大小是否重要?
CD 音频数据只是 44.1 kHz 的两个小端 16 位样本通道。
如果您将数据输出到标准输出,您可以将其通过管道传输到您的声音播放程序中,或者aplay
:
./my-read-cdda | ./play 44100 2 99999
./my-read-cdda | aplay --file-type raw --format cd
如果您想在一个程序中执行所有操作,请将 read(0, ...)
替换为 readSectors()
。 (缓冲区大小不需要与ALSA的周期大小或缓冲区大小有任何关系。)