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:~# 
  • 以上步骤配置正确即可解决喇叭无法播放的问题。

资源与支持

PulseAudio详细介绍
linux-PulseAudio
Pulseaudio详解