音频

音频是信息获取和传达的重要手段,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

音频测试