简介:CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀
人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1. 前言
- 要点概括
- 🌻2. 应用场景与用法
- 函数原型
- 参数说明
- 返回值
- 应用场景
- 🌻3. 调用流程剖析
- 🌻3.1 核心步骤
- 1. 应用层准备事件循环
- 2. 应用层发起创建请求
- 3. 分配 pw_context 对象
- 4. 绑定 pw_loop
- 5. 初始化 Context 属性
- 6. 初始化内部资源
- 7. 返回 Context 句柄
- 8. 后续销毁 Context
- 🌻3.2 调用流程图
- 🌻3.3 pw_context 创建生命周期图
- 🌻4. 实战应用案例
- 🌻5. 一句话总结
🌻1. 前言
本篇目的:
Linux PipeWire 深度解析之pw_context_new调用流程与实战。
要点概括
- 核心功能:创建 PipeWire 的
pw_context上下文对象。 - 工作机制:应用先准备
pw_loop和pw_properties,再调用pw_context_new()创建本地上下文对象,为后续连接 PipeWire Core、加载模块、管理资源和创建对象提供基础环境。 - 典型用途:PipeWire 客户端初始化、PipeWire 服务端初始化、模块加载、对象工厂管理、音视频图节点管理。
🌻2. 应用场景与用法
pw_context_new()是 PipeWire Context 创建流程中的核心接口。
在 PipeWire 中,pw_loop负责事件循环,pw_context负责承载上下文环境,后续的 Core 连接、模块加载、对象工厂、全局对象管理等操作都要依赖这个 Context。
而该接口用于:
基于指定
pw_loop创建一个 PipeWire Context 上下文对象。
函数原型
structpw_context*pw_context_new(structpw_loop*main_loop,structpw_properties*props,size_tuser_data_size);参数说明
main_loop:PipeWire 事件循环对象 props:Context 初始化属性,可为NULLuser_data_size:为用户私有数据预留的字节数返回值
返回structpw_context*对象用于后续连接 Core、加载模块、创建工厂对象、管理全局资源,以及销毁 Context 生命周期。
应用场景
pw_context_new()常见应用场景主要有三类。
第一类是 PipeWire 客户端初始化。普通音频、视频或屏幕采集程序在使用 PipeWire 时,通常会先初始化pw_main_loop,再通过pw_main_loop_get_loop()获取底层pw_loop,然后调用pw_context_new()创建上下文对象,最后再通过pw_context_connect()连接到 PipeWire Server。
第二类是 PipeWire 服务端或嵌入式运行环境初始化。在自定义 PipeWire Daemon、嵌入式音视频框架或车载多媒体系统中,pw_context通常作为整个运行环境的核心容器,用来承载模块加载、协议注册、对象工厂、全局资源管理和事件循环调度。
第三类是模块与资源生命周期管理。在开发 PipeWire 插件、测试工具或音视频图调试程序时,可以通过pw_context_new()创建一个独立上下文,用于加载模块、创建对象、注册工厂、连接 Core,并在退出时统一销毁相关资源,保证模块、对象和事件循环生命周期清晰可控。
🌻3. 调用流程剖析
🌻3.1 核心步骤
1. 应用层准备事件循环
structpw_main_loop*main_loop;structpw_loop*loop;main_loop=pw_main_loop_new(NULL);loop=pw_main_loop_get_loop(main_loop);2. 应用层发起创建请求
context=pw_context_new(loop,props,0);3. 分配 pw_context 对象
内部创建:
structpw_context表示:
PipeWire 上下文环境对象。
4. 绑定 pw_loop
pw_context_new()会把传入的pw_loop保存到 Context 中。
后续 Context 内部的事件、定时器、IO 监听、模块事件和 Core 连接事件,都可以通过该事件循环统一调度。
5. 初始化 Context 属性
如果传入:
structpw_properties*props则 Context 会接收这些属性作为初始化配置。
这些属性可以用于描述上下文名称、配置路径、模块加载参数或其他运行时配置。
6. 初始化内部资源
Context 创建过程中会准备后续运行所需的基础资源,例如资源列表、对象管理结构、模块管理结构、工厂管理结构和协议相关状态。
7. 返回 Context 句柄
函数返回:
structpw_context*应用后续可以基于该对象继续执行:
pw_context_connect() pw_context_load_module() pw_context_destroy()8. 后续销毁 Context
当不再使用时,应用需要调用:
pw_context_destroy(context);释放 Context 及其关联资源。
🌻3.2 调用流程图
🌻3.3 pw_context 创建生命周期图
🌻4. 实战应用案例
#include<pipewire/pipewire.h>#include<stdio.h>intmain(intargc,char*argv[]){structpw_main_loop*main_loop;structpw_loop*loop;structpw_context*context;/* * 初始化 PipeWire 库 */pw_init(&argc,&argv);/* * 创建主事件循环 */main_loop=pw_main_loop_new(NULL);if(!main_loop){printf("create pw_main_loop failed\n");return-1;}/* * 获取底层 pw_loop */loop=pw_main_loop_get_loop(main_loop);if(!loop){printf("get pw_loop failed\n");pw_main_loop_destroy(main_loop);return-1;}/* * 创建 PipeWire Context */context=pw_context_new(loop,NULL,0);if(!context){printf("create pw_context failed\n");pw_main_loop_destroy(main_loop);return-1;}printf("create pw_context success\n");/* * 后续可以继续: * * pw_context_connect() * pw_context_load_module() * pw_main_loop_run() *//* * 销毁 Context */pw_context_destroy(context);/* * 销毁 main loop */pw_main_loop_destroy(main_loop);/* * 反初始化 PipeWire */pw_deinit();return0;}🌻5. 一句话总结
pw_context_new()本质上是:
“基于 pw_loop 创建 PipeWire 的上下文环境”。
它负责把事件循环、初始化属性和内部资源管理结构组织成一个pw_context对象,是 PipeWire 客户端初始化、服务端运行环境初始化、模块加载、Core 连接和对象生命周期管理中最基础的入口接口之一。