Audio功能
本文档旨在提供Linux音频系统操作的简明指南。系统采用ALSA与PulseAudio双架构后端,提供从底层到应用层的完整音频解决方案。在硬件方面,全面支持外置麦克风输入和外置扬声器放大输出,并集成标准3.5mm音频接口,支持耳机播放与麦克风输入的全双工通信。在软件方面,本文提供了关键音频配置命令以确保音频完美初输出。通过本文档,您将掌握如何使用基础命令行工具快速完成设备检查、录音播放及音量控制等日常操作,无需深入复杂配置即可解决大多数音频相关问题。
快速开始
- 本节将介绍如何连接外部喇叭和耳机,并通过命令检查系统配置,以确保软硬件协同工作正常。
喇叭和耳机硬件接口


查看声卡信息
- 在终端中输入下面命令,查看声卡的挂载情况:
root@qcm6490-idp:/opt# cat /proc/asound/cards
0 [qcm6490idpsndca]: qcm6490 - qcm6490-idp-snd-card
qcm6490-idp-snd-card
- 在终端中输入下面命令,查看已分配的PCM流列表:
root@qcm6490-idp:/opt# cat /proc/asound/pcm
00-00: CODEC_DMA-LPAIF_RXTX-RX-0 multicodec-0 : : playback 1
00-01: CODEC_DMA-LPAIF_RXTX-TX-3 multicodec-1 : : capture 1
00-02: CODEC_DMA-LPAIF_VA-TX-0 va_macro_tx1-2 : : capture 1
- 如果没有声卡信息和PCM流列表,则ALSA与PulseAudio功能都将会无法使用。
ALSA架构
ALSA概述
ALSA是Linux系统的底层音频架构与驱动核心,它直接管理和控制计算机的音频硬件。它一方面为声卡提供原生驱动,实现对物理音频通道(如外置麦克风、耳机、扬声器)的直接读写;另一方面为应用程序提供标准化的API接口,完成最基础的音频采集与播放。ALSA是构建一切高级音频服务(如PulseAudio)的基石。
音频录制
1.外置麦克风音频录制
root@qcm6490-idp:/opt# systemctl stop pulseaudio
root@qcm6490-idp:/opt# tinymix set "VA DMIC MUX0" "DMIC0"
root@qcm6490-idp:/opt# tinymix set "VA_AIF1_CAP Mixer DEC0" "1"
root@qcm6490-idp:/opt# tinymix set "VA_DEC0 Volume" "100"
root@qcm6490-idp:/opt# agmcap test1.wav -D 100 -d 101 -c 1 -r 48000 -b 16 -i "CODEC_DMA-LPAIF_VA-TX-0"
pcm_plug_open: dlopen successful for libagm_pcm_plugin.so
Capturing sample: 1 ch, 48000 hz, 16 bit
diag: Diag_LSM_Init: invoked for pid: 1599 with init_count: 0
diag:successfully connected to socket 17
diag: Diag_LSM_Init: done for pid: 1599 with init_count: 1
diag: Successfully registered commands with the driver
PulseAudio可能会占用音频设备,导致直接硬件访问(如agmcap)失败。停止该服务可确保独占访问。
-c 1 单声道录音
-r 48000 采样率 48 kHz
-b 16 采样位深 16-bit
-i "CODEC_DMA-LPAIF_VA-TX-0" 指定输入设备接口为发送(录音)通道 0
若想停止录制,请按下Ctrl+C键,录制文件test1.wav将生成于当前目录下。
root@qcm6490-idp:/opt# ls
cni containerd test1.wav
2.耳机录制
- 使用3.5mm耳机录制,请输入以下命令:
root@qcm6490-idp:/opt# systemctl stop pulseaudio
root@qcm6490-idp:/opt# tinymix set "TX DEC0 MUX" "SWR_MIC"
root@qcm6490-idp:/opt# tinymix set "TX SMIC MUX0" "ADC1"
root@qcm6490-idp:/opt# tinymix set "TX_AIF1_CAP Mixer DEC0" "1"
root@qcm6490-idp:/opt# tinymix set "ADC2 MUX" "INP2"
root@qcm6490-idp:/opt# tinymix set "ADC2 Switch" "1"
root@qcm6490-idp:/opt# tinymix set "ADC2_MIXER Switch" "1"
root@qcm6490-idp:/opt# tinymix set "TX_DEC0 Volume" "80"
root@qcm6490-idp:/opt# tinymix set "ADC2 Volume" "20"
root@qcm6490-idp:/opt# agmcap test2.wav -D 100 -d 101 -c 1 -r 48000 -b 16 -i "CODEC_DMA-LPAIF_RXTX-TX-3"
pcm_plug_open: dlopen successful for libagm_pcm_plugin.so
Capturing sample: 1 ch, 48000 hz, 16 bit
diag: Diag_LSM_Init: invoked for pid: 1384 with init_count: 0
diag:successfully connected to socket 17
diag: Diag_LSM_Init: done for pid: 1384 with init_count: 1
diag: Successfully registered commands with the driver
- 若想停止录制,请按下Ctrl+C键,录制文件test2.wav将生成于当前目录下。
root@qcm6490-idp:/opt# ls
cni containerd test2.wav
音频播放
1.耳机播放
- 使用3.5mm耳机播放,请输入以下命令:
root@qcm6490-idp:/opt# systemctl stop pulseaudio
root@qcm6490-idp:/opt# tinymix set "RX_MACRO RX0 MUX" "AIF1_PB"
root@qcm6490-idp:/opt# tinymix set "RX_MACRO RX1 MUX" "AIF1_PB"
root@qcm6490-idp:/opt# tinymix set "RX INT0_1 MIX1 INP0" "RX0"
root@qcm6490-idp:/opt# tinymix set "RX INT1_1 MIX1 INP0" "RX1"
root@qcm6490-idp:/opt# tinymix set "RX INT0 DEM MUX" "CLSH_DSM_OUT"
root@qcm6490-idp:/opt# tinymix set "RX INT1 DEM MUX" "CLSH_DSM_OUT"
root@qcm6490-idp:/opt# tinymix set "RX_COMP1 Switch" "1"
root@qcm6490-idp:/opt# tinymix set "RX_COMP2 Switch" "1"
root@qcm6490-idp:/opt# tinymix set "HPHL Switch" "1"
root@qcm6490-idp:/opt# tinymix set "HPHR Switch" "1"
root@qcm6490-idp:/opt# tinymix set "HPHL_RDAC Switch" "1"
root@qcm6490-idp:/opt# tinymix set "HPHR_RDAC Switch" "1"
root@qcm6490-idp:/opt# agmplay test.wav -D 100 -d 100 -i "CODEC_DMA-LPAIF_RXTX-RX-0"
- 音频播放完会自动停止,若想提前停止,可按下Ctrl+C键
2.喇叭播放
- 输入以下命令播放音频:
root@qcm6490-idp:/opt# systemctl stop pulseaudio
root@qcm6490-idp:/opt# tinymix set "AUX_RDAC Switch" "1"
root@qcm6490-idp:/opt# tinymix set "RX_MACRO RX0 MUX" "AIF1_PB"
root@qcm6490-idp:/opt# tinymix set "RX INT2_1 MIX1 INP0" "RX0"
root@qcm6490-idp:/opt# tinymix set "LO Switch" "1"
root@qcm6490-idp:/opt# agmplay test_loop.wav -D 100 -d 100 -i "CODEC_DMA-LPAIF_RXTX-RX-0"
PulseAudio架构
PulseAudio概述
PulseAudio是一款跨平台的、支持网络功能的音频服务,它从一个或多个音源源(进程或输入设备)接收声音输入,然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。它与最底层的ALSA(Advanced Linux Sound Architechture)交互,并为应用程序提供统一的接口,从而实现多路音频混合、音频转发等高级功能。
设备查看与管理
1.查看可用输出设备(Sinks)
- 要查看系统当前可用的音频输出设备及其详细信息,可以使用以下命令。
- 此命令会列出所有可用的sink(输出设备)的索引(index)和名称(name)。输出示例:
root@qcm6490-idp:/# pactl list short sinks
0 low-latency0 module-pal-card.c s16le 1ch 16000Hz SUSPENDED
1 deep-buffer0 module-pal-card.c s16le 2ch 48000Hz 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:/# pactl list sinks
2.查看输入设备(Sources)
类似地,你可以用以下命令查看音频输入设备(如麦克风):
root@qcm6490-idp:/# pactl list short sources
0 low-latency0.monitor module-pal-card.c s16le 1ch 16000Hz SUSPENDED
1 deep-buffer0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
2 offload0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
3 voip-rx0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
4 regular0 module-pal-card.c s16le 2ch 48000Hz SUSPENDED
5 regular2 module-pal-card.c s16le 2ch 48000Hz SUSPENDED
6 voip-tx0 module-pal-card.c s16le 1ch 48000Hz SUSPENDED
- 若要获取更详细的设备信息,请使用:
root@qcm6490-idp:/# pactl list sources
录音
1.板载DIMC录音
root@qcm6490-idp:~# pactl set-source-port 5 speaker-mic
root@qcm6490-idp:~# parec -d 5 --file-format=wav output.wav
2.耳机录音
root@qcm6490-idp:~# pactl set-source-port 5 headset-mic
root@qcm6490-idp:~# parec -d 5 --file-format=wav output1.wav
播放
1.喇叭播放
root@qcm6490-idp:~# pactl set-sink-port 0 speaker
root@qcm6490-idp:~# paplay output.wav
2.耳机播放
root@qcm6490-idp:~# pactl set-sink-port 0 headset
root@qcm6490-idp:~# paplay output1.wav
进阶功能
Sink讲解
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讲解
root@qcm6490-idp:~# pactl list sources short
0 low-latency0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
1 deep-buffer0.monitor module-pal-card.c s16le 2ch 32000Hz SUSPENDED
2 offload0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
3 voip-rx0.monitor module-pal-card.c s16le 2ch 48000Hz SUSPENDED
4 regular0 module-pal-card.c s16le 2ch 48000Hz SUSPENDED
5 regular2 module-pal-card.c s16le 2ch 48000Hz SUSPENDED
6 voip-tx0 module-pal-card.c s16le 1ch 48000Hz SUSPENDED
root@qcm6490-idp:~#
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和regular2
- regular0和regular2用于直接录制麦克风或线路输入的音频。
- 特点:
- 通用音频输入源,适用于大多数录音场景。
6.voip-tx0
- voip-tx0用于VoIP通话的音频发送,即录制你的麦克风输入,用于网络电话。
- 特点:
- 优化了语音通话的音质和延迟。
疑难解答
喇叭无法正常播放
1.查看默认音频输出设备 (Sink)
root@qcm6490-idp:~# pactl get-default-sink
low-latency0
root@qcm6490-idp:~#
- 如果不是low-latency0或者deep-buffer0,请按照以下步骤设置默认sink。
root@qcm6490-idp:~# pactl set-default-sink low-latency0
root@qcm6490-idp:~# pactl get-default-sink
low-latency0
root@qcm6490-idp:~#
2.检查sink的默认输出端口
- 使用
pactl list sinks检查默认输出sink的Active Port值是否是speaker,如果不是请设置为speaker:
root@qcm6490-idp:~# pactl set-sink-port 0 speaker
root@qcm6490-idp:~#
- 以上步骤配置正确即可解决喇叭无法播放的问题。