# 音频功能 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- 本文档提供Quectel Pi M1/L1开发板 **Linux** 音频系统操作的简明指南。系统采用 **ALSA + PulseAudio** 的双层音频架构,从底层驱动到应用层提供完整的音频解决方案。 # 快速开始 Quectel Pi M1/L1开发板的音频硬件包含 2 路输入 和 2 路输出,通过板载的 SH1.0-4P 连接器及板载 MEMS 器件以及板上预留测试点实现。请在操作前确认硬件连接正确。 | **通道类型** | **通道名称** | **硬件对应位置** | **说明** | | --- | --- | --- | --- | | 输入 | 板载 MIC | 主板上的 MEMS 麦克风 | 内置硅麦,默认录音输入源,无需外接。 | | 输入 && 输出 | 耳机 | SH1.0-4P | 外接带麦耳机。 | | 输出 | SPK (扬声器) | 预留测试点 | 驱动大功率外放扬声器(需外接功放,直接接喇叭声音较小)。 | | 输出 | EAR (听筒) | 预留测试点 | 驱动小功率听筒/耳机。 | 系统提供一组标准音频配置与调试命令,用于完成设备检查、录音、播放和音量控制等常见操作。 通过本文档,您无需深入复杂配置,即可快速定位并解决大多数音频相关问题。 ## 喇叭和耳机硬件接口 ```{image} images/image_V4U5bL7mLoajBnxRYE1cVZP0njU.webp :width: 1280px :height: 1000px :align: center ``` ```{image} images/image_KQwJbtSA8o8o8kxpFvhc3vnenie.webp :width: 350px :height: 350px :align: center ``` ```{image} images/image_Tps7bdLUforZhzxNHIncQGfLnod.webp :width: 484px :height: 591px :align: center ``` ## 查看声卡信息 可通过以下命令检查系统声卡与 PCM 设备的加载情况: - 查看声卡列表: ```shell cat /proc/asound/cards ``` ```{image} images/image_E4HBb9QKKootWfxn4XacJ0ownih.webp :width: 675px :height: 86px ``` - 查看已分配的 **pcm** 流列表: ```shell cat /proc/asound/pcm ``` ```{image} images/image_OQ3dbUi8Wo0rJCx9EILcgIkrndd.webp :width: 676px :height: 362px ``` > 说明:若系统未检测到声卡信息或 **PCM 流**,则 **ALSA** 与 **PulseAudio** 均无法正常工作。 # ALSA架构 ## ALSA概述 ALSA是Linux系统的底层音频架构与驱动核心,它直接管理和控制计算机的音频硬件。它一方面为声卡提供原生驱动,实现对物理音频通道(如外置麦克风、耳机、扬声器)的直接读写;另一方面为应用程序提供标准化的API接口,完成最基础的音频采集与播放。ALSA是构建一切高级音频服务(如PulseAudio)的基石。 ## 音频录制 在 **Linux系统** 下,需确认智能主控板音频配置文件 **/etc/backend_conf.xml** 已正确配置(系统默认已完成配置): ```xml ``` 在 **Android系统** 中,上述音频配置已默认生效,无需额外修改。 ### 板载麦克风录制 #### Linux系统下录制 进行录制前,需要先停止 **PulseAudio** 服务: ```shell systemctl stop pulseaudio tinymix "TX DEC0 MUX" "SWR_MIC" tinymix "ADC2 ChMap" "SWRM_TX2_CH1" tinymix "TX SMIC MUX0" "SWR_MIC4" tinymix "TX_AIF1_CAP Mixer DEC0" "1" tinymix "ADC2_MIXER Switch" "1" tinymix "ADC2 MUX" "INP3" tinymix 'TX_AIF1_CAP Mixer DEC2' '1' agmcap /data/testMic3.wav -D 100 -d 101 -c 1 -r 48000 -i "CODEC_DMA-LPAIF_RXTX-TX-3" ``` #### Android系统下录制 ```shell tinymix "TX DEC0 MUX" "SWR_MIC" tinymix "ADC2 ChMap" "SWRM_TX2_CH1" tinymix "TX SMIC MUX0" "SWR_MIC4" tinymix "TX_AIF1_CAP Mixer DEC0" "1" tinymix "ADC2_MIXER Switch" "1" tinymix "ADC2 MUX" "INP3" tinymix 'TX_AIF1_CAP Mixer DEC2' '1' agmcap ./testMic3.wav -D 100 -d 101 -c 1 -r 48000 -i "CODEC_DMA-LPAIF_RXTX-TX-3" ``` #### 结束录制 按下“**Ctrl**” + “**Z**”结束录音: ```{image} images/image_RbTvblZEooeYP2xBSvdccwllnvb.webp :width: 773px :height: 367px ``` ### 耳机麦克风录制 #### Linux系统下录制 ```shell systemctl stop pulseaudio tinymix "TX DEC0 MUX" "SWR_MIC" tinymix "TX SMIC MUX0" "SWR_MIC5" tinymix "DEC0_BCS Switch" "1" tinymix "TX_AIF1_CAP Mixer DEC0" "1" tinymix "ADC2 ChMap" "SWRM_TX2_CH2" tinymix "MBHC ChMap" "SWRM_TX3_CH3" tinymix "ADC2_MIXER Switch" "1" tinymix "ADC2 MUX" "INP2" tinymix "BCS Channel" "CH10" agmcap /data/rec2.wav -D 100 -d 101 -c 1 -r 48000 -i "CODEC_DMA-LPAIF_RXTX-TX-3" ``` #### Android系统下录制 ```shell tinymix "TX DEC0 MUX" "SWR_MIC" tinymix "TX SMIC MUX0" "SWR_MIC5" tinymix "DEC0_BCS Switch" "1" tinymix "TX_AIF1_CAP Mixer DEC0" "1" tinymix "ADC2 ChMap" "SWRM_TX2_CH2" tinymix "MBHC ChMap" "SWRM_TX3_CH3" tinymix "ADC2_MIXER Switch" "1" tinymix "ADC2 MUX" "INP2" tinymix "BCS Channel" "CH10" agmcap ./rec2.wav -D 100 -d 101 –c 1 -r 48000 -i "CODEC_DMA-LPAIF_RXTX-TX-3" ``` 注意:操作时需要确保当前目录有写入权限。 ```{image} images/image_X6rwbCLBHoVfdtxpPA3c6w0Yngd.webp :width: 898px :height: 644px ``` ## 音频播放 板载扬声器未焊接,请使用外接耳机通道播放。 #### 耳机播放 ##### Linux系统下播放(3.5 mm耳机) ```shell systemctl stop pulseaudio tinymix "RX_MACRO RX0 MUX" "AIF1_PB" tinymix "RX_MACRO RX1 MUX" "AIF1_PB" tinymix "RX INT0_1 MIX1 INP0" "RX0" tinymix "RX INT1_1 MIX1 INP0" "RX1" tinymix "RX INT0 DEM MUX" "CLSH_DSM_OUT" tinymix "RX INT1 DEM MUX" "CLSH_DSM_OUT" tinymix "RX_COMP1 Switch" "1" tinymix "RX_COMP2 Switch" "1" tinymix "HPHL Switch" "1" tinymix "HPHR Switch" "1" tinymix "HPHL_RDAC Switch" "1" tinymix "HPHR_RDAC Switch" "1" agmplay /data/vvdn_ring.wav -D 100 -d 100 -i CODEC_DMA-LPAIF_RXTX-RX-0 -dkv 0xA2000002 ``` ##### Android系统下播放(3.5 mm耳机) ```shell adb root adb shell cd /data/local/tmp tinymix "RX_MACRO RX0 MUX" "AIF1_PB" tinymix "RX_MACRO RX1 MUX" "AIF1_PB" tinymix "RX INT0_1 MIX1 INP0" "RX0" tinymix "RX INT1_1 MIX1 INP0" "RX1" tinymix "RX INT0 DEM MUX" "CLSH_DSM_OUT" tinymix "RX INT1 DEM MUX" "CLSH_DSM_OUT" tinymix "RX_COMP1 Switch" "1" tinymix "RX_COMP2 Switch" "1" tinymix "HPHL_RDAC Switch" "1" tinymix "HPHR_RDAC Switch" "1" agmplay ./vvdn_ring.wav -D 100 -d 100 -i CODEC_DMA-LPAIF_RXTX-RX-0 -dkv 0xA2000002 ``` ```{image} images/image_ZVTVbvfQzoJhqkxMA6bcHf3Zn3d.webp :width: 791px :height: 374px ``` # PulseAudio架构 ## PulseAudio概述 PulseAudio是一款跨平台的、支持网络功能的音频服务,它从一个或多个音源源(进程或输入设备)接收声音输入,然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。它与最底层的ALSA交互,并为应用程序提供统一的接口,从而实现多路音频混合、音频转发等高级功能。 ### 设备查看与管理 **1.查看可用输出设备(Sinks)** - 要查看系统当前可用的音频输出设备及其详细信息,可以使用以下命令。 - 此命令会列出所有可用的sink(输出设备)的索引(index)和名称(name)。输出示例: ```bash sh-5.2# pactl list short sinks ``` - 若要获取更详细的设备信息,请使用: ```bash sh-5.2# pactl list sinks ``` **2.查看输入设备(Sources)** - 类似地,你可以用以下命令查看音频输入设备(如麦克风): ```bash sh-5.2# pactl list short sources ``` - 若要获取更详细的设备信息,请使用: ```bash sh-5.2# pactl list sources ``` ### 录音 **1.板载MIC录音** ```bash pactl set-source-port 4 speaker-mic pactl -d 4 --file-format=wav output.wav ``` **2.耳机录音** ```bash pactl set-source-port 4 headset-mic parec -d 4 --file-format=wav output1.wav ``` ### 播放 **1.喇叭播放** ```bash pactl set-sink-port 1 speaker paplay output.wav ``` **2.耳机播放** ```bash pactl set-sink-port 1 headset paplay output1.wav ``` ## 进阶功能 ### Sink讲解 ```bash root@qcm6490-idp:~# pactl list sinks short 0 low-latency0 module-pal-card.c s16le 2ch 48000Hz SUSPENDED 1 deep-buffer0 module-pal-card.c s16le 2ch 32000Hz SUSPENDED 2 offload0 module-pal-card.c s16le 2ch 48000Hz SUSPENDED 3 voip-rx0 module-pal-card.c s16le 2ch 48000Hz SUSPENDED root@qcm6490-idp:~# ``` **1.low-latency0** - low-latency0用于实时音频播放,如音乐、游戏、通知等,要求超低延迟。 - 特点: 延迟极低,适合对实时性要求高的应用; 支持PCM格式(未压缩音频); 支持speaker(扬声器),也支持headset(耳机)。 **2.deep-buffer0** - deep-buffer0用于需要大缓冲的音频播放,如流媒体、网络电台等,允许更大的音频缓冲,减少卡顿。 - 特点: 延迟较高,但音频更稳定,适合网络不稳定的环境; 支持speaker(扬声器),也支持headset(耳机)。 **3.offload0** - offload0用于硬件卸载压缩音频(如MP3、AAC),由硬件直接解码播放,节省CPU资源。 - 特点: 仅支持压缩格式(如 MPEG、AAC),不支持PCM; 适用于长时间播放压缩音频(如音乐播放器)。 **4.voip-rx0** - voip-rx0专门用于VoIP通话的音频接收(如网络电话、视频会议)。 - 特点: 优化了语音通话的延迟和回声抑制; 仅在VoIP应用(如Skype、Zoom)中自动激活,普通音频播放不会使用。 ### Source讲解 ```bash sh-5.2# pactl list sources short 1 low-latency0.monitor module-qal-card.c s16le 2ch 48000Hz SUSPENDED 2 deep-buffer0.monitor module-qal-card.c s16le 2ch 48000Hz SUSPENDED 3 offload0.monitor module-qal-card.c s16le 2ch 48000Hz SUSPENDED 4 regular0 module-qal-card.c s16le 1ch 48000Hz SUSPENDED ``` **1.low-latency0.monitor** - low-latency0.monitor适用于实时录音,如录制游戏音效、音乐播放器输出等。 - 特点: 延迟极低,适合实时监控音频输出。 **2.deep-buffer0.monitor** - deep-buffer0.monitor适用于长时间录音,如流媒体、网络电台。 - 特点: 延迟较高,但音频稳定,适合网络不稳定的环境。 **3.offload0.monitor** - offload0.monitor用于录制offload0 Sink的音频输出,即录制硬件卸载的压缩音频(如 MP3、AAC)。 - 特点: 仅在播放压缩音频时激活; 适合长时间录制压缩音频。 **4.voip-rx0.monitor** - voip-rx0.monitor适用于录制网络电话或视频会议的对方声音。 - 特点: 适用于录制网络电话或视频会议的对方声音。 **5.regular0** - regular0用于直接录制麦克风或线路输入的音频。 - 特点: 通用音频输入源,适用于大多数录音场景。 **6.voip-tx0** - voip-tx0用于VoIP通话的音频发送,即录制你的麦克风输入,用于网络电话。 - 特点: 优化了语音通话的音质和延迟。 # 测试蜂窝语音通话 Weston 环境下无图形化拨号界面,通话控制通过 `qlril-api-test` 命令行工具完成。该工具可注册事件监听、拨号、接听及挂断电话。通话过程中的音频路由切换仍需通过 PulseAudio 命令(`pactl`)进行。 ## 测试准备与初始化 确保 SIM 卡已正确插入,且模组已注册网络。 发送 **AT$QCSIMAPP=?** 检查网络连接状态 > AT$QCSIMAPP=? > $QCSIMAPP: 0,"SUB1","L" # 网络已连接 > $QCSIMAPP: 1,"SUB2","No Service" 在拨号或接听前,使用 `pactl` 将音频通道切换到期望的设备。示例: ```plaintext # 查看当前音频设备 pactl list short sinks pactl list short sources # 设置为耳机通道 pactl set-source-port 4 headset-mic pactl set-sink-port 1 headset # 设置为板载mic录音,耳机播音 pactl set-source-port 4 speaker-mic pactl set-sink-port 1 headset ``` 打开终端,执行以下命令启动 `qlril-api-test` 程序: ```plaintext qlril-api-test ``` ## 配置事件监听 为了能够接收来电、通话状态等事件,需要进行以下设置(以下编号对应程序内的命令索引): ```plaintext # 输入 10,开启事件监听器 > 10 # 输入 12,然后输入起始值 1000,再输入终止值 1070,开启注册事件监听功能 # (终止值可根据实际返回的最大值调整,SW可能增加新事件) > 12 > 1000 > 1070 # 输入 13,屏蔽编号在 1009~1009 范围内的消息事件(可根据需要调整) > 13 > 1009 > 1009 ``` ## 接听来电(被叫测试) 当辅助机拨打测试机电话时,`qlril-api-test` 窗口会上报来电事件,类似: 此时执行以下操作接听: ```plaintext # 输入 44,接听来电 > 44 ``` 接听后,通话应建立。如果出现“通话无声”,请检查音频路由是否正确。 ## 挂断电话 通话结束后,执行: ```plaintext # 输入 43,然后选择 1(挂断当前通话) > 43 > 1 ``` 此时通话被挂断,界面应提示挂断成功。 ## 主动拨号(主叫测试) 若需主动拨号,可使用以下命令(假设号码为 10086): ```plaintext # 输入 43,然后输入电话号码 > 43 > 10086 ``` 拨号后,系统会发起呼叫,对方接听后即可通话。 # 疑难解答 | **问题** | **可能原因** | | --- | --- | | 录音文件未生成 |
  1. 检查设置指令是否正确。
  2. 操作目录是否有可读写权限。
| | 音频播放失败 |
  1. 检查播放文件是否存在。
  2. 检查播放指令是否正确,对于"-"需要注意中英文符号。
| | 语音通话无声 | 1.检查硬件连接完好。
2.检查音频路由设置(是否正确选择了耳机和 MIC 源) | # 资源与支持 - [ALSA介绍]() - [tinyalsa]()