如何在Raspberry Pi上使用C++/libao/alsa通过USB声卡播放音频?

问题描述:

我从aplay -l, lsusb如下:如何在Raspberry Pi上使用C++/libao/alsa通过USB声卡播放音频?

[email protected]:~ $ aplay -l 
**** List of PLAYBACK Hardware Devices **** 
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA] 
    Subdevices: 8/8 
    Subdevice #0: subdevice #0 
    Subdevice #1: subdevice #1 
    Subdevice #2: subdevice #2 
    Subdevice #3: subdevice #3 
    Subdevice #4: subdevice #4 
    Subdevice #5: subdevice #5 
    Subdevice #6: subdevice #6 
    Subdevice #7: subdevice #7 
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] 
    Subdevices: 1/1 
    Subdevice #0: subdevice #0 
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio] 
    Subdevices: 1/1 
    Subdevice #0: subdevice #0 
card 2: Device_1 [USB PnP Sound Device], device 0: USB Audio [USB Audio] 
    Subdevices: 1/1 
    Subdevice #0: subdevice #0 
[email protected]:~ $ lsusb 
Bus 001 Device 005: ID 046d:c31c Logitech, Inc. Keyboard K120 for Business 
Bus 001 Device 008: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller 
Bus 001 Device 007: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller 
Bus 001 Device 006: ID 05e3:0606 Genesys Logic, Inc. USB 2.0 Hub/D-Link DUB-H4 USB 2.0 Hub 
Bus 001 Device 004: ID 1bcf:0005 Sunplus Innovation Technology Inc. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter 
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 

我想通过CM108音效控制器与礼包玩我的MP3。我试过这些:

ao_initialize(); 
ao_option aoption; 
ao_option *poption; 
poption = &aoption; 
poption->key = (char*)"dev"; 
poption->value = (char*)"hw:0"; 
dev = ao_open_live(driver, &format, poption); 
    while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK) 
     ao_play(dev, (char *)buffer, done); 

所以声音通过Pi成功播放。我明白hw:0是Pi的声卡。如果我想通过第一个或第二个CM108音频控制器播放,应该使用什么来代替hw:0?我已经尝试了hw:1和hw:2,但它不起作用。

+0

你可以通过aplay播放波形文件...尝试使用此命令aplay -D'hw:1'file.wav – Varun

请尝试按照以下步骤启用录音和音频录制,并首先使用alsa从rpi的usb-sound适配器播放。有了这个,你可以测试你的USB声卡是否可以正常工作,作为输入和输出模块。我还没有在上面提到的C++代码的库中进行测试,我们很快就会试用它。稍后在C++代码中引用“hw:1”,如果它工作正常,请尝试。

步骤: 1.1)创建/编辑文件.asoundrc

$vim .asoundrc 

如果文件不存在,创建它;

$ touch .asoundrc 

$vim .asoundrc 
pcm.!default { 
     type asym 
     playback.pcm "hw:1,0" 
     capture.pcm "hw:1,0" 
} 

ctl.!default { 
     type hw 
     card 1 
} 

1.2)编辑文件alsa.conf中的下面一行;

$sudo vim /usr/share/alsa/alsa.conf 
defaults.ctl.card 0 
defaults.pcm.card 0 

$sudo vim /usr/share/alsa/alsa.conf 
defaults.ctl.card 1 
defaults.pcm.card 1 

1.3)更改音频电平/使用命令alsamixer实用

$alsamixer 

1.4)设置命令录制音频

$arecord -D plughw:1 -f S16_LE -r 48000 -d 5 ./testSound.wav 

1.5)命令打录制的音频

$aplay --device=plughw:1,0 ./testSound.wav