如何将 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 驱动的声音输出设备?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统没有声音,该怎么驱动?

如何给ubuntu装alsa驱动

解决Ubuntu SMPlayer播放视频无声音问题

在 Linux 中驱动声卡

使用 ALSA 从 Line IN 录制声音

Ubuntu下声卡驱动解决方法alsa