高通Linux 音频指南(八)

PAL配置

音频使用案例可以在 PAL 级别使用 mixer_paths、resourcemanager 和 usecasekvmanager XML 文件进行配置。

mixer_paths XML

混音器控制是从 ALSA 混音器暴露给用户空间的控制变量。它允许用户空间访问设置和获取功能,并将参数传递给 ALSA 混音器。
例如,以下是 mixer_path.xml 中启用单声道扬声器设备的条目。每当播放被触发且选择的设备是扬声器时,将通过音频路由助手类触发以下混音器控制。

<path name="speaker">
     <ctl name="SpkrLeft PA Volume" value="20" />
     <ctl name="WSA RX0 MUX" value="AIF1_PB" />
     <ctl name="WSA_RX0 INP0" value="RX0" />
     <ctl name="WSA_COMP1 Switch" value="1" />
     <ctl name="SpkrLeft WSA MODE" value="1" />
     <ctl name="SpkrLeft COMP Switch" value="1" />
     <ctl name="SpkrLeft BOOST Switch" value="1" />
     <ctl name="SpkrLeft DAC Switch" value="1" />
     <ctl name="SpkrLeft VISENSE Switch" value="1" />
     <ctl name="SpkrRight PA Volume" value="20" />
     <ctl name="WSA RX1 MUX" value="AIF1_PB" />
     <ctl name="WSA_RX1 INP0" value="RX1" />
     <ctl name="WSA_COMP2 Switch" value="1" />
     <ctl name="SpkrRight WSA MODE" value="1" />
     <ctl name="SpkrRight COMP Switch" value="1" />
     <ctl name="SpkrRight BOOST Switch" value="1" />
     <ctl name="SpkrRight DAC Switch" value="1" />
     <ctl name="SpkrRight VISENSE Switch" value="1" />
</path>

平台使用的混音路径的名称通常为 mixer_paths_.xml,可以在目标设备的 /etc/ 目录中找到。
例如,如果平台上的声卡名称是 qcm6490-rb3-snd-card,那么混音路径文件名将为 mixer_paths_qcm6490_rb3.xml。

Resourcemanager XML

此 XML 文件包含所有可能的设备、使用案例和组合。它还包括各种配置、模块参数和全局参数。
以下是资源管理器 XML 文件中扬声器设备条目的示例。它将包含扬声器设备的所有配置,例如后端名称、通道、采样率、位宽等。

<out-device>
     <id>PAL_DEVICE_OUT_SPEAKER</id>
     <back_end_name>CODEC_DMA-LPAIF_WSA-RX-0</back_end_name>
     <max_channels>2</max_channels>
     <channels>2</channels>
     <samplerate>48000</samplerate>
     <bit_width>16</bit_width>
     <snd_device_name>speaker</snd_device_name>
</out-device>

Usecasekvmanager XML

此 XML 文件包含每个使用案例的 GKV 详细信息。PAL 使用此 XML 文件来检索每个使用案例的 KV 配置,并随后利用该配置从 ACDB 文件中检索图形信息。该文件位于设备的 /etc 路径。

以下是一个流和设备图形键向量配置的示例。
Stream KV

<stream type="PAL_STREAM_LOW_LATENCY">
     <keys_and_values Direction="RX" Instance="1">
     <!-- STREAMRX - PCM_LL_PLAYBACK -->
     <graph_kv key="0xA1000000" value="0xA100000E"/>
     <!-- INSTANCE - INSTANCE_1 -->
     <graph_kv key="0xAB000000" value="0x1"/>
</keys_and_values>

Device KV

<!-- Speaker Device -->
<device id="PAL_DEVICE_OUT_SPEAKER">
     <keys_and_values>
     <!-- DEVICERX - SPEAKER -->
     <graph_kv key="0xA2000000" value="0xA2000001"/>
     </keys_and_values>
</device>

DevicePP KV

<!-- OUT Speaker DevicePPs -->
<devicepp id="PAL_DEVICE_OUT_SPEAKER">
<keys_and_values StreamType="PAL_STREAM_COMPRESSED,PAL_STREAM_LOW_LATENCY">
     <!-- DEVICERX - SPEAKER -->
     <graph_kv key="0xA2000000" value="0xA2000001"/>
     <!-- DEVICEPP_RX - DEVICEPP_RX_AUDIO_MBDRC -->
     <graph_kv key="0xAC000000" value="0xAC000002"/>
</keys_and_values>

调试

本节提供关于音频特定日志记录和调试的信息。

抓取log

用户空间和内核音频驱动日志可用于识别问题。

  1. 用户空间日志, 要捕获用户空间日志:

    ssh root@ip-addr
    mount -o remount,rw /
    cat /var/log/user.log
    

    请参见用户空间日志以获取详细说明。

  2. 内核音频驱动日志, 要捕获内核日志:

    ssh root@ip-addr dmesg
    

    要在特定文件中禁用内核日志:

    echo -n “file <filename> -p” > /sys/kernel/debug/dynamic_debug/control
    
  3. 态内核日志:
    动态日志默认情况下是禁用的。要启用它,请添加 CONFIG_DYNAMIC_DEBUG 内核配置, 重新编译并重新闪存设备。
    要启用音频动态内核日志:

    ssh root@ip-addr
    mount -o rw,remount -t debugfs none /sys/kernel/debug
    echo -n “file <filename> +p” > /sys/kernel/debug/dynamic_debug/control
    

    请参见启用动态调试以获取详细说明。

分析收集的log

审查用户空间和内核音频驱动日志以获取播放和录音使用案例的信息。

播放

以下日志片段描述了为播放使用案例收集的信息。

//Open Low latency Playback stream. Details of each stream type can be found at sources/audio/opensource/arpal-lx/inc/PalDefs.h
2022-04-28T18:02:08.748280+00:00 qcm6490 pulseaudio: pal_stream_open: 224: Enter, stream type:1
 
//Verify the backend device, sample rate, bitwidth, channels etc
2022-04-28T18:02:08.748627+00:00 qcm6490 pulseaudio: setDeviceMediaConfig: 1056: CODEC_DMA-LPAIF_WSA-RX-0 rate ch fmt data_fmt 48000 2 2 1
 
//Start playback stream
2022-04-28T18:02:08.751947+00:00 qcm6490 pulseaudio: pal_stream_start: 338: Enter. Stream handle 0xffff94001040K
 
//Map the metadata with kvh2xml.h file for playback usecase details.
2022-04-28T18:02:08.853157+00:00 qcm6490 pulseaudio: metadata_print: 82 key:0xa1000000, value:0xa100000e//PCM_LL_PLAYBACK 
2022-04-28T18:02:08.853395+00:00 qcm6490 pulseaudio: metadata_print: 82 key:0xab000000, value:0x1 
2022-04-28T18:02:08.853660+00:00 qcm6490 pulseaudio: metadata_print: 82 key:0xa2000000, value:0xa2000001//Speaker
2022-04-28T18:02:08.853881+00:00 qcm6490 pulseaudio: metadata_print: 82 key:0xac000000, value:0xac000002//DEVICEPP_RX_AUDIO_MBDRC

//Verify the graph opened for playback usecase
2022-04-28T18:02:08.856934+00:00 qcm6490 pulseaudio: print_graph_alias: 2334 GKV Alias 142 | StreamRX_PCM_LL_Playback_DeviceRX_Speaker_Instance_Instance_1_DevicePP_Rx_Audio_MBDRC 
//graph_open called
2022-04-28T18:02:08.859509+00:00 qcm6490 pulseaudio: graph_open: 709 graph_handle 0x47534c

//Configure hardware endpoint module
2022-04-28T18:02:08.864386+00:00 qcm6490 pulseaudio: configure_hw_ep_media_config: 636 entry mod tag c0000004 miid 43b1 mid 7001023
2022-04-28T18:02:08.864495+00:00 qcm6490 pulseaudio: configure_hw_ep_media_config: 664 rate 48000 bw 16 ch 2, data_fmt 1
2022-04-28T18:02:08.864603+00:00 qcm6490 pulseaudio: configure_hw_ep_media_config: 676 exit, ret 0
 
//graph_start entry
2022-04-28T18:02:08.867234+00:00 qcm6490 pulseaudio: graph_start: 899 entry graph_handle 0x47534c
//Stream started
2022-04-28T18:02:08.867864+00:00 qcm6490 pulseaudio: pal_stream_start: 387: Exit. status 0

//graph_stop entry
2022-04-28T18:02:25.037338+00:00 qcm6490 pulseaudio: graph_stop: 928 entry graph_handle 0x47534c
//Stop the PAL stream once playback completes
2022-04-28T18:02:25.039923+00:00 qcm6490 pulseaudio: pal_stream_stop: 441: Exit. status 0
 
//graph_close entry
2022-04-28T18:02:25.050944+00:00 qcm6490 pulseaudio: graph_close: 762 entry handle 0x47534c
//Close the PAL stream
2022-04-28T18:02:25.054510+00:00 qcm6490 pulseaudio: pal_stream_close: 322: Exit. status 0
录音

以下日志片段描述了为录音使用案例收集的信息。

//Open Recording stream for PAL_STREAM_RAW. Details of stream type can be found at sources/audio/opensource/arpal-lx/inc/PalDefs.h
Apr 29 09:23:11 qcm6490 pulseaudio[862]: pal_stream_open: 224: Enter, stream type:9

//Verify the backend device, sample rate, bitwidth, channels etc
Apr 29 09:23:11 qcm6490 pulseaudio[862]: setDeviceMediaConfig: 1056: CODEC_DMA-LPAIF_VA-TX-0 rate ch fmt data_fmt 48000 1 2 1
 
//Start recording stream
Apr 29 09:23:11 qcm6490 pulseaudio[862]: pal_stream_start: 338: Enter. Stream handle 0xffff6c001040K

//graph_open entry
Apr 29 09:23:11 qcm6490 pulseaudio[862]: graph_open: 709 graph_handle 0x47534c
 
//Metadata details to identify the usecase
Apr 29 09:23:11 qcm6490 pulseaudio[862]: metadata_print: 82 key:0xb1000000, value:0xb1000009//RAW_RECORD
Apr 29 09:23:11 qcm6490 pulseaudio[862]: metadata_print: 82 key:0xa3000000, value:0xa3000004//HANDSETMIC

//Verify the graph opened for recording usecase
Apr 29 09:23:11 qcm6490 pulseaudio[862]: print_graph_alias: 2334 GKV Alias 29 | DeviceTX_Handset_Mic_StreamTX_RAW_Record
 
//Configure hardware endpoint module
Apr 29 09:23:11 qcm6490 pulseaudio[862]: configure_hw_ep_media_config: 636 entry mod tag c0000005 miid 43af mid 7001024
Apr 29 09:23:11 qcm6490 pulseaudio[862]: configure_hw_ep_media_config: 664 rate 48000 bw 16 ch 1, data_fmt 1
Apr 29 09:23:11 qcm6490 pulseaudio[862]: configure_hw_ep_media_config: 676 exit, ret 0
 
//graph_start entry
Apr 29 09:23:11 qcm6490 pulseaudio[862]: graph_start: 899 entry graph_handle 0x47534c
//Stream recording started
Apr 29 09:23:11 qcm6490 pulseaudio[862]: pal_stream_start: 387: Exit. status 0
 
 
//graph_stop entry
Apr 29 09:23:26 qcm6490 pulseaudio[862]: graph_stop: 928 entry graph_handle 0x47534c 
//Stop the PAL stream once user stops recording
Apr 29 09:23:26 qcm6490 pulseaudio[862]: D: [regular2] pal-source.c: pal_stream_stop returned 0

//Close the PAL stream
Apr 29 09:23:26 qcm6490 pulseaudio[862]: pal_stream_close: 284: Enter. Stream handle :0xffff6c001040K 
//graph_close entry
Apr 29 09:23:26 qcm6490 pulseaudio[862]: graph_close: 762 entry handle 0x47534c 
//Close the PAL stream
Apr 29 09:23:26 qcm6490 pulseaudio[862]: pal_stream_close: 322: Exit. status 0

Fluence

在 VoIP 系统中,回声和噪声相关的问题相当常见。语音来自远端扬声器并随着时间延迟回声,导致感知问题。减少通话过程中远端扬声器回声的方法是回声消除,而减少麦克风通道噪声的方法是噪声抑制。Fluence 的回声消除和噪声抑制 (ECNS) 算法提供静态和非静态噪声抑制及回声消除。

ECNS 概述

声学回声对于免提和远程会议应用至关重要。由于扬声器和通信设备麦克风之间的声学路径(声学耦合)而产生的回声被称为声学回声。
在这里插入图片描述

  • 回声消除器: 一种简单的自适应滤波器,具有自我调整系数以消除回声。每个回声都有一个回声路径,并由脉冲响应特征化。回声消除器调整其滤波器系数以适应网络回声路径,从而消除回声。
  • 噪声抑制: 随着设备在动态环境中的使用,SMECNS 中的噪声抑制器有助于抑制周围的静态噪声。
录音使用案例

在录音使用案例中,Fluence 通过抑制麦克风捕获的背景噪声来维护录音路径中的语音质量。
在单麦克风录音使用案例中,仅能处理静态噪声抑制——即频率内容随时间不变的噪声,例如路噪或白噪声。
在这里插入图片描述

要在录音路径中启用 SMECNS:

setenforce 0
pactl set-source-port regular0 speaker-mic
parec --rate=48000 --format=s16le --channels=1 --file-format=wav /opt/rec3.wav --device=regular0
VoIP 使用案例

Fluence 用于减少 VoIP 通信中的噪声并消除回声。它可以抑制麦克风信号中的噪声和声学回声。
SDK 提供了对 PulseAudio VoIP 源和接收器的支持,开发人员可以使用它来开发自己的应用程序。
在这里插入图片描述

要在 VoIP 路径上启用 SMECNS:
录音:

setenforce 0
pactl set-source-port voip-tx0 speaker-mic
parec --rate=48000 --format=s16le --channels=1 --file-format=wav /opt/rec3.wav --device=voip-tx0

播放:

setenforce 0
paplay /opt/<FileName>.wav --device=voip-rx0

注意:确保将某个 PCM 文件(.wav)推送到 /opt/ 文件夹中。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值