# 音频功能
***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.检查音频路由设置(是否正确选择了耳机和 MIC 源) |
# 资源与支持
- [ALSA介绍]()
- [tinyalsa]()