如何将 CD 音轨输入 ALSA 驱动的声音输出设备?
Posted
技术标签:
【中文标题】如何将 CD 音轨输入 ALSA 驱动的声音输出设备?【英文标题】:How do I feed CD audio tracks into an ALSA-driven sound output device? 【发布时间】:2020-03-16 17:30:39 【问题描述】:我正在使用没有内置声音解码器的 USB CD/DVD 驱动器,并通过 ALSA 控制它,它已经可以工作了。主机是带有当前 Raspbian 的 Raspberry Pi 3B。下面是对应的配置文件:
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 和一些关于(记录相当差的)CDIO API 的见解(我知道readSectors()
方法用于从 CD 扇区一个扇区地读取声音数据),但并不是真正的关于如何正确地将数据从 CD-DA 输入传递到 ALSA 输出例程的线索。
请注意 mplayer
对我来说是禁区,因为此例程将成为更大解决方案的一部分。
任何帮助将不胜感激。
更新:音频 CD(2,352 字节)和声音输出(910 字节,至少在我的特定情况下)的不同块大小是否重要?
【问题讨论】:
【参考方案1】: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的周期大小或缓冲区大小有任何关系。)
【讨论】:
好的,谢谢。我现在有另一个问题,您可以在我的原始帖子中找到。以上是关于如何将 CD 音轨输入 ALSA 驱动的声音输出设备?的主要内容,如果未能解决你的问题,请参考以下文章