0

我正在使用没有内置声音解码器的 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++ 库。它的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

我已经有一些代码可以将 PCM 数据发送到声卡,并且对 CDIO API(文档记录很少)有一些见解(我知道该readSectors()方法用于从 CD 扇区一个扇区地读取声音数据),但不是关于如何正确地将数据从 CD-DA 输入传递到 ALSA 输出例程的真正线索。

请注意,这mplayer对我来说是禁止的,因为此例程将成为更大解决方案的一部分。

任何帮助将不胜感激。

更新:音频 CD(2,352 字节)和声音输出(910 字节,至少在我的特定情况下)的不同块大小是否重要?

4

1 回答 1

1

CD 音频数据只是两个 44.1 kHz 的 little-endian 16 位样本通道。

如果您将数据输出到标准输出,您可以将其通过管道传输到您的声音播放程序中,或者aplay

./my-read-cdda | ./play 44100 2 99999
./my-read-cdda | aplay --file-type raw --format cd

如果您想在单个程序中完成所有操作,请将read(0, ...). readSectors()(缓冲区大小不需要与 ALSA 的周期大小或缓冲区大小有任何关系。)

于 2019-11-21T07:05:57.343 回答