点击下方👇关注 Android系统攻城狮
第208篇原创文章
持续迭代 | Android+Linux多媒体进阶体系
专栏·课程 知识体系持续更新
音乐播放器创建播放流Node后,系统里可能同时存在扬声器、HDMI和蓝牙耳机等多个Audio/Sink设备Node。PipeWire已经有了Node、Port和Graph,但是播放流应该连接到哪个设备,设备插拔后是否重新连接,还需要一套系统策略决定。
WirePlumber负责管理这套策略,它会启用和配置设备、选择默认目标、管理客户端权限、配置Node、维护Metadata,再根据Graph变化创建调整Link,那么,WirePlumber如何让PipeWire Graph按系统策略连接起来?

1


一个播放应用进入PipeWire后,应用在成为Stream/Output/Audio类型的流Node,声卡播放设备会成为Audio/Sink类型的设备Node。两个Node同时存在,PipeWire Graph已创建播放流对象和设备对象,还要从候选设备中选择目标Node,再连接两端对应的Port。
简单理解为:PipeWire负责承载和运行Node、Port、Link组成的Graph,WirePlumber监控设备的变化,根据设备状态、默认目标和流属性选择连接Node方式,根据策略连接Graph中的Link。

在这条链路中,设备监控先让可用设备进入PipeWire Graph模型,Wireplumber根据策略配置确定当前优先使用的输出设备。播放流Node创建后,Linking Policy读取流属性和默认目标,选择一个可连接的设备Node,最后在两端Port之间建立Link。

2


wireplumber进程启动后,读取配置文件wireplumber.conf,创建WpCore对象并激活它。这里的WpCore是WirePlumber连接和管理PipeWire的核心对象,它连接PipeWire以后,根据当前profile加载配置中的组件和策略。
在默认main profile加载policy.standard字段、音频、蓝牙、视频设备监控模块,其中policy.standard又依赖客户端权限、设备Profile、设备Route、默认Node、Node配置和Linking等策略,WirePlumber通过这些组件持续响应设备、Node、Metadata和Link变化。
以ALSA设备为例,ALSA monitor使用api.alsa.enum.udev创建SPA设备监控并启用它。发现声卡后,监控逻辑继续创建并启用SpaDevice,再根据设备提供的对象信息创建对应Node。WirePlumber还会为设备选择Profile和Route,让扬声器、麦克风、HDMI等实际通道按当前配置进入Graph。

WirePlumber在这里负责调用设备监控和策略能力,让Device和Node按配置进入PipeWire,ALSA枚举和PCM访问仍然由SPA ALSA及底层ALSA完成,WirePlumber不处理播放数据本身。

3


Graph中加载多个Audio/Sink设备Node,WirePlumber进程会扫描当前可用Node,为Audio/Sink选择默认目标。用户也可以通过命令wpctl set-default指定的设备,会写入default.configured.audio.sink,默认节点策略优先使用这个配置目标。
如果当前配置的目标Node不存在,WirePlumber会继续检查已经保存的用户选择。如果没有可用的历史目标,再根据设备Node的priority.session和当前Route优先级选择更合适的设备,最后把实际选中的Node名称写入default.audio.sink。

default.configured.audio.sink表示用户自定义配置,default.audio.sink表示当前策略实际选择的默认输出,设备拔出后,配置偏好可以继续保留,但当前默认目标会根据剩余设备重新计算。

4


播放流Node加入Graph后,WirePlumber会为需要自动连接的流安排一次Linking rescan,再为每个流触发目标选择。普通播放场景会先检查流是否通过target.object指定了目标,没有指定目标时再查找默认Audio/Sink,如果默认目标不可用,最后从Route可用、格式兼容的设备中选择priority.session更高的目标。
目标确定后,linking/prepare-link会检查设备是否可连接、当前Link是否需要移动,以及独占和Passthrough条件。条件满足时,linking/link-target创建si-standard-link,分别保存输出端和输入端的Session Item,再注册并激活这条连接。
si-standard-link激活时会取得两端Port,根据声道和方向匹配输出Port与输入Port,最后通过wp_link_new_from_factory()调用link-factory创建PipeWire Link,WirePlumber做出的目标选择,到了这里才真正变成Graph里的连接关系。

如果没有可用目标设备,普通播放流不会凭空形成完整链路,客户端可能收到no target node available错误。默认设备或设备状态变化后,WirePlumber还会重新扫描连接,在策略允许时把播放流移动到新的目标设备。

5


WirePlumber是PipeWire常用的会话和策略管理器,它连接PipeWire后加载设备监控和策略组件,负责设备启用与配置、客户端权限、Node配置和Link管理等。
在一条播放链路中,WirePlumber先让可用设备形成Device和设备Node,再从候选Audio/Sink中确定默认输出,播放流Node出现后继续选择目标并创建Link。PipeWire负责运行Graph,WirePlumber负责让Graph按系统策略连接起来。
若读者朋友发现有错误、疑问的地方,或者好的建议,欢迎拍砖!!!