PulseAudio 和 ALSA 的关系
在大多数现代 Linux 桌面系统(如 Ubuntu)中,PulseAudio 作为音频管理的中间层,接管了应用程序与硬件之间的通信。当 PulseAudio 运行时,它会成为默认的音频设备,应用程序(包括您的程序)会优先与 PulseAudio 交互,再由 PulseAudio 将音频流混合后传递给底层的 ALSA 驱动,PulseAudio 未运行,ALSA 无法直接访问被占用的声卡硬件。
查看是否安装
dpkg -l | grep pulseaudio
安装
apt install pulseaudio pulseaudio-utils
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:
下列软件包有未满足的依赖关系:
pulseaudio : 依赖: libpulse0 (= 1:16.1+dfsg1-2ubuntu10) 但是 1:16.1+dfsg1-2ubuntu10.1 正要被安装
pulseaudio-utils : 依赖: libpulse0 (= 1:16.1+dfsg1-2ubuntu10) 但是 1:16.1+dfsg1-2ubuntu10.1 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
修复错误:apt install libpulse0=1:16.1+dfsg1-2ubuntu10,修复后重新安装即可
ls | grep libpulse
libpulse-simple.so.0
libpulse-simple.so.0.1.1
libpulse.so.0
libpulse.so.0.24.2
root@x-DS-V-P13SWM:/lib/x86_64-linux-gnu# apt install libpulse-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:
下列软件包有未满足的依赖关系:
libmount-dev : 依赖: libblkid-dev 但是它将不会被安装
依赖: libmount1 (= 2.39.3-9ubuntu6) 但是 2.39.3-9ubuntu6.2 正要被安装
libpcre2-dev : 依赖: libpcre2-8-0 (= 10.42-4ubuntu2) 但是 10.42-4ubuntu2.1 正要被安装
依赖: libpcre2-16-0 (= 10.42-4ubuntu2) 但是 10.42-4ubuntu2.1 正要被安装
依赖: libpcre2-32-0 (= 10.42-4ubuntu2) 但是 10.42-4ubuntu2.1 正要被安装
libselinux1-dev : 依赖: libselinux1 (= 3.5-2ubuntu2) 但是 3.5-2ubuntu2.1 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
解决依赖问题:
apt install libpcre2-8-0=10.42-4ubuntu2
apt install libpcre2-16-0=10.42-4ubuntu2
apt install libpcre2-32-0=10.42-4ubuntu2
apt install libselinux1=3.5-2ubuntu2
apt install libmount1=2.39.3-9ubuntu6
apt install libblkid1=2.39.3-9ubuntu6
apt install libuuid1=2.39.3-9ubuntu6
查看PulseAudio状态
root@coder-develop:/opt# ps aux | grep pulseaudio
gdm 1144 0.0 0.1 959180 17656 ? S<sl 12:42 0:00 /usr/bin/pulseaudio --daemonize=no --log-target=journal
root 6285 0.0 0.0 12340 2764 pts/1 S+ 14:51 0:00 grep --color=auto pulseaudio
root@coder-develop:/opt# systemctl status --user pulseaudio
● pulseaudio.service - Sound Service
Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
Active: inactive (dead)
TriggeredBy: ● pulseaudio.socket
Condition: start condition failed at Fri 2025-10-17 12:42:35 CST; 2h 4min ago
└─ ConditionUser=!root was not met
10月 17 12:42:35 coder-develop systemd[1586]: Condition check resulted in Sound Service being skipped.
开启 pulseaudio --start --log-target=syslog
排查ALSA获取左声道音量失败原因,snd_mixer_selem_get_playback_volume(pMixerElement, SND_MIXER_SCHN_FRONT_LEFT, &nLVolume)
查看所有声卡
root@coder-develop:~# cat /proc/asound/cards
0 [Generic ]: HDA-Intel - HD-Audio Generic
HD-Audio Generic at 0xfccc8000 irq 72
1 [Generic_1 ]: HDA-Intel - HD-Audio Generic
HD-Audio Generic at 0xfccc0000 irq 73
2 [acp ]: acp - acp
LENOVO-90UK0006CD-YangTianM4000q_02ACH-376D
root@coder-develop:/opt# aplay -l
**** PLAYBACK 硬體裝置清單 ****
card 0: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0] (可以看出这个应该是屏幕的音频输出)
子设备: 1/1
子设备 #0: subdevice #0
card 1: Generic_1 [HD-Audio Generic], device 0: ALC897 Analog [ALC897 Analog]
子设备: 1/1
子设备 #0: subdevice #0
可以看出有两个声卡
查看默认声卡
root@coder-develop:/opt# aplay -L | grep default:
default:CARD=Generic_1
sysdefault:CARD=Generic_1
查看简化的混音器控件(Mixer Simple Controls)
要查看其他声卡(例如 card 1 的模拟设备)是否有我们常见的 Master或 PCM控制器
root@coder-develop:/opt# amixer -c 0 scontrols
Simple mixer control 'IEC958',0
root@coder-develop:/opt# amixer -c 1 scontrols
Simple mixer control 'Master',0
Simple mixer control 'Headphone',0
Simple mixer control 'Speaker',0
Simple mixer control 'Line Out',0
Simple mixer control 'Mic',0
Simple mixer control 'Mic Boost',0
Simple mixer control 'Capture',0
Simple mixer control 'Auto-Mute Mode',0
Simple mixer control 'Loopback Mixing',0
root@coder-develop:/opt# amixer -c 2 scontrols
root@coder-develop:/opt#
root@coder-develop:/opt# amixer -c Generic_1 scontrols
Simple mixer control 'Master',0
Simple mixer control 'Headphone',0
Simple mixer control 'Speaker',0
Simple mixer control 'Line Out',0
Simple mixer control 'Mic',0
Simple mixer control 'Mic Boost',0
Simple mixer control 'Capture',0
Simple mixer control 'Auto-Mute Mode',0
Simple mixer control 'Loopback Mixing',0
控制特定声卡控制器
# 查看`card 1`的模拟设备的 `Master`控制器状态
root@coder-develop:/opt# amixer -c 1 sget 'Master'
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 87
Mono: Playback 79 [91%] [-6.00dB] [on]
# 设置模拟器音量
root@coder-develop:/opt# amixer -c 1 sset 'Master' 80%
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 87
Mono: Playback 70 [80%] [-12.75dB] [on]
root@coder-develop:/opt# amixer -c Generic_1 sset 'Master' 80%
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 87
Mono: Playback 70 [80%] [-12.75dB] [on]
查看所有底层控制元素(Controls)
root@coder-develop:~# amixer controls
numid=1,iface=CARD,name='HDMI/DP,pcm=3 Jack'
numid=2,iface=MIXER,name='IEC958 Playback Con Mask'
numid=3,iface=MIXER,name='IEC958 Playback Pro Mask'
numid=4,iface=MIXER,name='IEC958 Playback Default'
numid=5,iface=MIXER,name='IEC958 Playback Switch'
numid=6,iface=PCM,name='ELD',device=3
numid=7,iface=PCM,name='Playback Channel Map',device=3
获取某个底层控件的详细信息
root@coder-develop:/opt# amixer -c Generic_1 controls
numid=18,iface=CARD,name='Front Headphone Jack'
numid=17,iface=CARD,name='Line Out Jack'
numid=16,iface=CARD,name='Mic Jack'
numid=19,iface=CARD,name='Speaker Phantom Jack'
numid=15,iface=MIXER,name='Master Playback Switch'
numid=14,iface=MIXER,name='Master Playback Volume'
numid=4,iface=MIXER,name='Headphone Playback Switch'
numid=3,iface=MIXER,name='Headphone Playback Volume'
numid=2,iface=MIXER,name='Line Out Playback Switch'
numid=1,iface=MIXER,name='Line Out Playback Volume'
numid=13,iface=MIXER,name='Mic Boost Volume'
numid=9,iface=MIXER,name='Mic Playback Switch'
numid=8,iface=MIXER,name='Mic Playback Volume'
numid=12,iface=MIXER,name='Capture Switch'
numid=11,iface=MIXER,name='Capture Volume'
numid=7,iface=MIXER,name='Loopback Mixing'
numid=10,iface=MIXER,name='Auto-Mute Mode'
numid=6,iface=MIXER,name='Speaker Playback Switch'
numid=5,iface=MIXER,name='Speaker Playback Volume'
numid=21,iface=PCM,name='Capture Channel Map'
numid=20,iface=PCM,name='Playback Channel Map'
root@coder-develop:/opt# amixer -c 0 cget numid=1
numid=1,iface=CARD,name='HDMI/DP,pcm=3 Jack'
; type=BOOLEAN,access=r-------,values=1
: values=off
root@coder-develop:/opt# amixer -c 0 cget numid=2
numid=2,iface=MIXER,name='IEC958 Playback Con Mask'
; type=IEC958,access=r-------,values=1
: values=[AES0=0x0f AES1=0xff AES2=0x00 AES3=0x00]
root@coder-develop:/opt# amixer -c 0 cget iface=MIXER,name='IEC958 Playback Con Mask'
numid=2,iface=MIXER,name='IEC958 Playback Con Mask'
; type=IEC958,access=r-------,values=1
: values=[AES0=0x0f AES1=0xff AES2=0x00 AES3=0x00]
设置某个底层控件的值
# 查询
amixer -c 0 cget numid=1 # 通过 numid
amixer -c 0 cget iface=MIXER,name='Master Playback Volume' # 通过完整名称
# 设置
amixer -c 0 cset numid=1 80% # 通过numid设置
amixer -c 0 cset iface=MIXER,name='Master Playback Volume' 80% # 通过完整名称设置
| 特性 | amixer -c 0 scontrols | amixer controls |
|---|---|---|
| 查看对象 | 简化的混音器控件(Mixer Simple Controls) | 所有底层控制元素(Controls) |
| 详细程度 | 简洁,显示用户常用、易于理解的名称(如 'Master', 'PCM') | 详细,显示包括 numid、iface、name 等完整技术信息 |
| 输出示例 | Simple mixer control 'Master',0 | numid=1,iface=MIXER,name='Master Volume' |
| 主要用途 | 快速查看和操作常见的、面向用户的音频控制项 | 查看所有可用的、底层的控制元素,用于精确控制或调试 |