当前位置: 首页 > news >正文

Linux PipeWire深度解析之pw_context_new调用流程与实战(二十三)

简介:CSDN博客专家、《Android系统多媒体进阶实战》作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀

人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮


🍉🍉🍉文章目录🍉🍉🍉

  • 🌻1. 前言
      • 要点概括
  • 🌻2. 应用场景与用法
    • 函数原型
    • 参数说明
    • 返回值
  • 应用场景
  • 🌻3. 调用流程剖析
    • 🌻3.1 核心步骤
      • 1. 传入底层 pw_loop
      • 2. 分配 Context 与用户数据空间
      • 3. 初始化对象容器与监听列表
      • 4. 接管并补全属性
      • 5. 初始化运行支撑对象
      • 6. 组装支持接口
      • 7. 创建内部 Core
      • 8. 返回 Context 或执行失败清理
    • 🌻3.2 调用流程图
    • 🌻3.3 对象关系与销毁路径图
  • 🌻4. 实战应用案例
  • 🌻5. 一句话总结

🌻1. 前言

本篇目的:

Linux PipeWire 深度解析之pw_context_new调用流程与实战。

要点概括

  • 核心功能:创建 PipeWire Context,作为 Core、Registry、Stream、模块与对象的运行容器。
  • 工作机制:初始化属性、配置、内存池、工作队列、支持接口和内部 Core。
  • 典型用途:创建 PipeWire 客户端环境、连接 Core、管理 Registry 与 Stream。

🌻2. 应用场景与用法

pw_context_new()是 PipeWire Context 生命周期的创建接口。

应用先准备一个pw_loop,再创建 Context:

context=pw_context_new(loop,NULL,0);

而该接口用于:

创建承载 PipeWire 对象、配置、内存池、工作队列和内部 Core 的运行上下文。

pw_context_connect()不同:

pw_context_new()只创建本地 Context;pw_context_connect()才通过该 Context 连接 PipeWire Core。


函数原型

structpw_context*pw_context_new(structpw_loop*main_loop,structpw_properties*properties,size_tuser_data_size);

参数说明

main_loop:Context 使用的 pw_loop properties:Context 属性;传入非空对象后, Context 会接管其所有权 user_data_size:为 Context 额外分配的私有用户数据长度

返回值

NULL:创建成功,返回 pw_context 对象NULL:创建失败,并设置 errno

创建成功后,使用:

pw_context_destroy(context);

销毁对象。


应用场景

pw_context_new()常见应用场景主要有三类。

第一类是创建 PipeWire 客户端运行环境。应用将 Thread Loop 或 Main Loop 提供的pw_loop传入,后续使用 Context 连接 PipeWire 服务。

第二类是创建 Core 与 Registry 管理入口。Context 创建完成后,可通过pw_context_connect()获取pw_core,再监听 Registry 全局对象。

第三类是创建 Stream 所需的基础容器。播放、录音和视频采集程序通常先创建 Context,再创建 Core、Stream 与对应 Listener。


🌻3. 调用流程剖析

🌻3.1 核心步骤

1. 传入底层 pw_loop

应用获取或创建:

structpw_loop*loop;

并将其传入pw_context_new()

Context 不创建调用者传入的pw_loop,而是保存并使用它。


2. 分配 Context 与用户数据空间

内部为 Context 实现对象分配内存:

Context 实现对象 可选 user_data 区域

分配失败时,函数释放传入的properties并返回NULL


3. 初始化对象容器与监听列表

内部初始化数组、映射表、对象列表与 Listener 列表,用于管理:

Core Client Node Device Factory Module Metadata Link

等 PipeWire 对象。


4. 接管并补全属性

若:

properties==NULL

内部创建默认属性对象;否则 Context 接管调用者提供的属性对象。

随后填充默认属性并加载 Context 配置。


5. 初始化运行支撑对象

Context 创建数据 Loop、内存池和工作队列,并保存:

context->main_loop=main_loop;

工作队列用于把异步工作安排到 Context 所属的 Loop 中执行。


6. 组装支持接口

内部将 System、Loop、LoopUtils、PluginLoader 等支持接口加入 Context。

这些接口供后续 SPA 插件、模块和 PipeWire 对象使用。


7. 创建内部 Core

Context 创建并注册内部pw_impl_core,随后解析:

context.spa-libs context.modules context.objects context.exec

等配置项。


8. 返回 Context 或执行失败清理

全部初始化成功后返回:

structpw_context*

任一步失败则调用pw_context_destroy()回收已创建资源,并返回NULL


🌻3.2 调用流程图


🌻3.3 对象关系与销毁路径图

在这里插入图片描述

🌻4. 实战应用案例

#include<pipewire/pipewire.h>#include<stdlib.h>intmain(intargc,char*argv[]){structpw_thread_loop*thread_loop;structpw_loop*loop;structpw_context*context;structpw_core*core;intexit_code=EXIT_FAILURE;pw_init(&argc,&argv);thread_loop=pw_thread_loop_new("pipewire-context",NULL);if(!thread_loop){gotodone;}loop=pw_thread_loop_get_loop(thread_loop);context=pw_context_new(loop,NULL,0);if(!context){gotodestroy_loop;}core=pw_context_connect(context,NULL,0);if(!core){gotodestroy_context;}if(pw_thread_loop_start(thread_loop)<0){gotodisconnect_core;}exit_code=EXIT_SUCCESS;pw_thread_loop_stop(thread_loop);disconnect_core:pw_core_disconnect(core);destroy_context:pw_context_destroy(context);destroy_loop:pw_thread_loop_destroy(thread_loop);done:pw_deinit();returnexit_code;}

该示例中,pw_context_new()将 Thread Loop 的底层pw_loop作为事件执行环境;随后pw_context_connect()基于 Context 创建客户端 Core 连接。


🌻5. 一句话总结

pw_context_new()本质上是:

“基于指定pw_loop创建 PipeWire 运行上下文,并初始化后续 Core、对象、模块和异步任务所需的基础设施。”

http://www.jsqmd.com/news/1250521/

相关文章:

  • 华硕商城 | ROG首款音响曝光!今夏最硬核的桌面升级指南!
  • Autorize:越权检测插件性能优化
  • AutoGPT:自主AI代理系统的核心技术与应用实践
  • AI Agent面试题第二期(持续更新)
  • 计算机毕业设计之基于jsp在线选课系统的设计与实现
  • 天道随笔第二篇
  • 非结构化数据满天飞,90%的敏感数据藏在文档堆里,怎么让AI真正分得清?
  • 深圳设备搬运公司罗湖区2026年:医疗设备搬运+养老院搬迁合作案例,养老产业支持要点 - szxybj
  • 2026年怎么选靠谱品牌全案公司?五家主流机构对比参考 - 优企甄选
  • 2026热门视频去水印在线工具推荐,免费网站优缺点与侵权注意事项 - 免费软件工具方法教程
  • C语言学习(跟b站鹏哥)
  • Django计算机毕设之基于 Django 的贵州山地特色产品产地直售商城系统设计与实现 轻量化贵州特色好物线上交易平台的设计与实现(完整前后端 代码+说明文档+LW,调试定制等)
  • AI写作工具如何提升学术论文效率与质量
  • 白帽SEO服务商机构排名:白帽SEO与GEO双合规服务商分级排名榜单 - GEORANK
  • 北京食品检测服务企业做GEO服务商怎么选?2026靠谱选型指南与五家服务商深度测评 - 小随科技
  • ShortGPT: Layers in Large Language Models are More Redundant Than You Expect 解读
  • PCBA贴片加工中影响回流焊接的因素
  • 【项目扩展实战|第8篇】Spring Boot + MyBatis 分页条件查询接口优化
  • [具身智能-632]:efficientnasnet、googlenet、resnet18、vargconvnet对比
  • 网站自动建站备份工具:本地测试站,1分钟平滑传阿里云
  • 广州黄埔区搬家公司起步价完整明细汇总,正规服务商联系方式整理,全城可随时咨询报价 - 厚道搬家
  • 天河区搬家公司全街道收费价格一览,广州天河居民企业搬家报价及正规搬家联系电话汇总 - 厚道搬家
  • 论文查重免费平台哪个准?2026年实测4家,这家和学校结果误差不到3%
  • 面向欧洲GDPR合规的Node-RED边缘计算网关本地脱敏架构实战
  • 大模型入门与实战:从原理到企业级应用优化
  • 华为OD机试真题 新系统 2026-07-15 JavaGoC 实现【谁没交卷】
  • 青岛工程纠纷律师于臻分析转包、分包与实际施工人的法律关系 - 新思维商业观察
  • 白帽SEO服务商平台推荐:2026年平台化服务选型指南 - GEORANK
  • 2026年充电桩怎么选:七个问题帮你找到适合自家的那一款
  • 环境变量“爆仓”记:Spring Boot 云函数 4KB 限制下的配置瘦身与外部化破局之道