音频
音频是信息获取和传达的重要手段,XNIUPI-R系列开发板提供了音频输出输入接口。
查看声卡设备
查看播放设备
root@xniupi:/# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rockchipes8388 [rockchip-es8388], device 0: dailink-multicodecs ES8323.7-0011-0 [dailink-multicodecs ES8323.7-0011-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: rockchiphdmi0 [rockchip-hdmi0], device 0: rockchip-hdmi0 i2s-hifi-0 [rockchip-hdmi0 i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0 :ES8388音频解码芯片,支持音频输出
card 1 :HDMI音频输出设备
查看录音设备
root@xniupi:/# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: rockchipes8388 [rockchip-es8388], device 0: dailink-multicodecs ES8323.7-0011-0 [dailink-multicodecs ES8323.7-0011-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0 :ES8388音频解码芯片,支持音频输入
声卡驱动目录
root@xniupi:/# ls /dev/snd/
by-path controlC0 controlC1 pcmC0D0c pcmC0D0p pcmC1D0p seq timer
/dev/snd/by-path/ :音频设备路径
/dev/snd/controlC0 :用于声卡控制,C0 表示声卡0,对应上文的ES8388音频解码芯片
/dev/snd/controlC1 :用于声卡控制,C1 表示声卡1,对应上文的HDMI音频输出设备
/dev/snd/pcmC0D0c :用于录音的 pcm 设备,最后面的“c”是 capture 的缩写,表示 capture 录音
/dev/snd/pcmC0D0p :用于播放的 pcm 设备,最后面的“p”是 playback 的缩写,表示 playback 播放
/dev/snd/pcmC1D0p :用于录音的 pcm 设备,C1 表示声卡1,对应上文的HDMI音频输出设备
/dev/snd/seq :音频序列设备
/dev/snd/timer :音频定时器设备
root@xniupi:/# ls -l /dev/snd/by-path/
total 0
lrwxrwxrwx 1 root root 12 Mar 27 2023 platform-es8388-sound -> ../controlC0
lrwxrwxrwx 1 root root 12 Dec 10 17:27 platform-hdmi0-sound -> ../controlC1
可以看到每个control之间都有一个对应关系,而这些对应关系正好对应上文的 card 0 , card 1
配置声卡
amixer
amixer 是一个用于配置音频设备的命令行工具,它可以用来调整音频设备的音量、静音、声道等参数。
使用amixer前需要知道你需要的配置的声卡的设备号(card x, 如card 0),可以使用aplay -l
或者arecord -l
查看。
以下以配置 card 0 为例(ES8388):
alsamixer
alsamixer 是一个命令行下图形化的音频配置工具,可以方便直观的用于声卡配置。
列出可以控制 card 0 的控制器
root@xniupi:/# amixer controls -c 0
numid=36,iface=CARD,name='Headphone Jack'
numid=37,iface=CARD,name='Headset Mic Jack'
numid=38,iface=MIXER,name='Headphone Switch'
numid=31,iface=MIXER,name='PCM Volume'
numid=45,iface=MIXER,name='Mono Mux'
numid=25,iface=MIXER,name='Capture Digital Volume'
numid=26,iface=MIXER,name='Capture Mute'
numid=30,iface=MIXER,name='Capture Polarity'
numid=29,iface=MIXER,name='Playback De-emphasis'
numid=9,iface=MIXER,name='I2STDM Digital Loopback Mode'
numid=12,iface=MIXER,name='3D Mode'
numid=20,iface=MIXER,name='ALC Capture Attack Time'
numid=19,iface=MIXER,name='ALC Capture Decay Time'
numid=16,iface=MIXER,name='ALC Capture Function'
numid=18,iface=MIXER,name='ALC Capture Hold Time'
numid=14,iface=MIXER,name='ALC Capture Max PGA'
numid=15,iface=MIXER,name='ALC Capture Min PGA'
numid=23,iface=MIXER,name='ALC Capture NG Switch'
numid=21,iface=MIXER,name='ALC Capture NG Threshold'
numid=22,iface=MIXER,name='ALC Capture NG Type'
numid=13,iface=MIXER,name='ALC Capture Target Volume'
numid=17,iface=MIXER,name='ALC Capture ZC Switch'
numid=44,iface=MIXER,name='Differential Mux'
numid=41,iface=MIXER,name='Headset Mic Switch'
numid=27,iface=MIXER,name='Left Channel Capture Volume'
numid=46,iface=MIXER,name='Left Line Mux'
numid=49,iface=MIXER,name='Left Mixer Left Bypass Switch'
numid=32,iface=MIXER,name='Left Mixer Left Bypass Volume'
numid=48,iface=MIXER,name='Left Mixer Left Playback Switch'
numid=42,iface=MIXER,name='Left PGA Mux'
numid=40,iface=MIXER,name='Main Mic Switch'
numid=34,iface=MIXER,name='Output 1 Playback Volume'
numid=35,iface=MIXER,name='Output 2 Playback Volume'
numid=4,iface=MIXER,name='Receive PATH0 Source Select'
numid=3,iface=MIXER,name='Receive PATH1 Source Select'
numid=2,iface=MIXER,name='Receive PATH2 Source Select'
numid=1,iface=MIXER,name='Receive PATH3 Source Select'
numid=28,iface=MIXER,name='Right Channel Capture Volume'
numid=47,iface=MIXER,name='Right Line Mux'
numid=51,iface=MIXER,name='Right Mixer Right Bypass Switch'
numid=33,iface=MIXER,name='Right Mixer Right Bypass Volume'
numid=50,iface=MIXER,name='Right Mixer Right Playback Switch'
numid=43,iface=MIXER,name='Right PGA Mux'
numid=39,iface=MIXER,name='Speaker Switch'
numid=8,iface=MIXER,name='Transmit SDO0 Source Select'
numid=7,iface=MIXER,name='Transmit SDO1 Source Select'
numid=6,iface=MIXER,name='Transmit SDO2 Source Select'
numid=5,iface=MIXER,name='Transmit SDO3 Source Select'
numid=24,iface=MIXER,name='ZC Timeout Switch'
numid=10,iface=PCM,name='PCM Read Wait Time MS'
numid=11,iface=PCM,name='PCM Write Wait Time MS'
列出 card 0 控制器能配置的值
root@xniupi:/# amixer contents -c 0
numid=36,iface=CARD,name='Headphone Jack'
; type=BOOLEAN,access=r-------,values=1
: values=off
numid=37,iface=CARD,name='Headset Mic Jack'
; type=BOOLEAN,access=r-------,values=1
: values=off
numid=38,iface=MIXER,name='Headphone Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=31,iface=MIXER,name='PCM Volume'
; type=INTEGER,access=rw---R--,values=2,min=0,max=192,step=0
: values=173,173
| dBscale-min=-96.00dB,step=0.50dB,mute=1
numid=45,iface=MIXER,name='Mono Mux'
; type=ENUMERATED,access=rw------,values=1,items=3
; Item #0 'Stereo'
; Item #1 'Mono (Left)'
; Item #2 'Mono (Right)'
: values=0
numid=25,iface=MIXER,name='Capture Digital Volume'
; type=INTEGER,access=rw---R--,values=2,min=0,max=192,step=0
: values=192,192
| dBscale-min=-96.00dB,step=0.50dB,mute=1
numid=26,iface=MIXER,name='Capture Mute'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=30,iface=MIXER,name='Capture Polarity'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Normal'
; Item #1 'L Invert'
; Item #2 'R Invert'
; Item #3 'L + R Invert'
: values=0
numid=29,iface=MIXER,name='Playback De-emphasis'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'None'
; Item #1 '32Khz'
; Item #2 '44.1Khz'
; Item #3 '48Khz'
: values=0
numid=9,iface=MIXER,name='I2STDM Digital Loopback Mode'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Disabled'
; Item #1 'Mode1'
; Item #2 'Mode2'
; Item #3 'Mode2 Swap'
: values=0
numid=12,iface=MIXER,name='3D Mode'
; type=ENUMERATED,access=rw------,values=1,items=8
; Item #0 'No 3D '
; Item #1 'Level 1'
; Item #2 'Level 2'
; Item #3 'Level 3'
; Item #4 'Level 4'
; Item #5 'Level 5'
; Item #6 'Level 6'
; Item #7 'Level 7'
: values=1
numid=20,iface=MIXER,name='ALC Capture Attack Time'
; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
: values=5
numid=19,iface=MIXER,name='ALC Capture Decay Time'
; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
: values=0
numid=16,iface=MIXER,name='ALC Capture Function'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Off'
; Item #1 'Right'
; Item #2 'Left'
; Item #3 'Stereo'
: values=3
numid=18,iface=MIXER,name='ALC Capture Hold Time'
; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
: values=0
numid=14,iface=MIXER,name='ALC Capture Max PGA'
; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0
: values=5
numid=15,iface=MIXER,name='ALC Capture Min PGA'
; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0
: values=2
numid=23,iface=MIXER,name='ALC Capture NG Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=21,iface=MIXER,name='ALC Capture NG Threshold'
; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0
: values=10
numid=22,iface=MIXER,name='ALC Capture NG Type'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Constant PGA Gain'
; Item #1 'Mute ADC Output'
: values=1
numid=13,iface=MIXER,name='ALC Capture Target Volume'
; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0
: values=12
numid=17,iface=MIXER,name='ALC Capture ZC Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=44,iface=MIXER,name='Differential Mux'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Line 1'
; Item #1 'Line 2'
: values=0
numid=41,iface=MIXER,name='Headset Mic Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=27,iface=MIXER,name='Left Channel Capture Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=8,step=0
: values=0
| dBscale-min=0.00dB,step=3.00dB,mute=0
numid=46,iface=MIXER,name='Left Line Mux'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Line 1L'
; Item #1 'Line 2L'
; Item #2 'NC'
; Item #3 'MicL'
: values=0
numid=49,iface=MIXER,name='Left Mixer Left Bypass Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=32,iface=MIXER,name='Left Mixer Left Bypass Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
: values=0
| dBscale-min=-0.15dB,step=3.00dB,mute=0
numid=48,iface=MIXER,name='Left Mixer Left Playback Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=42,iface=MIXER,name='Left PGA Mux'
; type=ENUMERATED,access=rw------,values=1,items=3
; Item #0 'Line 1L'
; Item #1 'Line 2L'
; Item #2 'DifferentialL'
: values=0
numid=40,iface=MIXER,name='Main Mic Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=34,iface=MIXER,name='Output 1 Playback Volume'
; type=INTEGER,access=rw---R--,values=2,min=0,max=33,step=0
: values=30,30
| dBscale-min=-45.00dB,step=1.50dB,mute=0
numid=35,iface=MIXER,name='Output 2 Playback Volume'
; type=INTEGER,access=rw---R--,values=2,min=0,max=33,step=0
: values=30,30
| dBscale-min=-45.00dB,step=1.50dB,mute=0
numid=4,iface=MIXER,name='Receive PATH0 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From SDI0'
; Item #1 'From SDI1'
; Item #2 'From SDI2'
; Item #3 'From SDI3'
: values=0
numid=3,iface=MIXER,name='Receive PATH1 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From SDI0'
; Item #1 'From SDI1'
; Item #2 'From SDI2'
; Item #3 'From SDI3'
: values=1
numid=2,iface=MIXER,name='Receive PATH2 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From SDI0'
; Item #1 'From SDI1'
; Item #2 'From SDI2'
; Item #3 'From SDI3'
: values=2
numid=1,iface=MIXER,name='Receive PATH3 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From SDI0'
; Item #1 'From SDI1'
; Item #2 'From SDI2'
; Item #3 'From SDI3'
: values=3
numid=28,iface=MIXER,name='Right Channel Capture Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=8,step=0
: values=0
| dBscale-min=0.00dB,step=3.00dB,mute=0
numid=47,iface=MIXER,name='Right Line Mux'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'Line 1R'
; Item #1 'Line 2R'
; Item #2 'NC'
; Item #3 'MicR'
: values=0
numid=51,iface=MIXER,name='Right Mixer Right Bypass Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=33,iface=MIXER,name='Right Mixer Right Bypass Volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=7,step=0
: values=0
| dBscale-min=-0.15dB,step=3.00dB,mute=0
numid=50,iface=MIXER,name='Right Mixer Right Playback Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=43,iface=MIXER,name='Right PGA Mux'
; type=ENUMERATED,access=rw------,values=1,items=3
; Item #0 'Line 1R'
; Item #1 'Line 2R'
; Item #2 'DifferentialR'
: values=0
numid=39,iface=MIXER,name='Speaker Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=8,iface=MIXER,name='Transmit SDO0 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From PATH0'
; Item #1 'From PATH1'
; Item #2 'From PATH2'
; Item #3 'From PATH3'
: values=0
numid=7,iface=MIXER,name='Transmit SDO1 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From PATH0'
; Item #1 'From PATH1'
; Item #2 'From PATH2'
; Item #3 'From PATH3'
: values=1
numid=6,iface=MIXER,name='Transmit SDO2 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From PATH0'
; Item #1 'From PATH1'
; Item #2 'From PATH2'
; Item #3 'From PATH3'
: values=2
numid=5,iface=MIXER,name='Transmit SDO3 Source Select'
; type=ENUMERATED,access=rw------,values=1,items=4
; Item #0 'From PATH0'
; Item #1 'From PATH1'
; Item #2 'From PATH2'
; Item #3 'From PATH3'
: values=3
numid=24,iface=MIXER,name='ZC Timeout Switch'
; type=BOOLEAN,access=rw------,values=1
: values=off
numid=10,iface=PCM,name='PCM Read Wait Time MS'
; type=INTEGER,access=rw------,values=1,min=0,max=10000,step=1
: values=0
numid=11,iface=PCM,name='PCM Write Wait Time MS'
; type=INTEGER,access=rw------,values=1,min=0,max=10000,step=1
: values=0