如何将 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的周期大小或缓冲区大小有任何关系。)