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

Linux PipeWire深度解析之pw_thread_loop_new调用流程与实战(十五)

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

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

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

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


🍉🍉🍉文章目录🍉🍉🍉

  • 🌻1. 前言
      • 要点概括
  • 🌻2. 应用场景与用法
    • 函数原型
    • 参数说明
    • 返回值
  • 应用场景
  • 🌻3. 调用流程剖析
    • 🌻3.1 核心步骤
      • 1. 应用层发起创建
      • 2. 分配 pw_thread_loop
      • 3. 保存创建参数
      • 4. 创建内部 pw_loop
      • 5. 初始化线程同步对象
      • 6. 初始化线程状态
      • 7. 返回 Thread Loop 对象
      • 8. 后续启动工作线程
    • 🌻3.2 调用流程图
    • 🌻3.3 Thread Loop创建生命周期图
  • 🌻4. 实战应用案例
  • 🌻5. 一句话总结

按相同结构整理如下。

🌻1. 前言

本篇目的:

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

要点概括

  • 核心功能:创建一个由独立线程驱动的 PipeWire Thread Loop 对象。
  • 工作机制pw_thread_loop_new()分配pw_thread_loop,创建内部pw_loop,初始化线程同步对象,并保存线程名称与属性配置。
  • 典型用途:异步连接 PipeWire Core、后台监听 Registry、音视频 Stream 事件处理、多线程客户端开发。

🌻2. 应用场景与用法

pw_thread_loop_new()是 PipeWire 多线程事件循环体系中的创建接口。

pw_main_loop不同,pw_thread_loop可以通过pw_thread_loop_start()创建独立工作线程,并在该线程中持续驱动底层pw_loop

而该接口用于:

创建 Thread Loop 对象,并初始化内部事件循环与线程同步机制。

需要注意:

pw_thread_loop_new()只完成对象创建,不会立即启动工作线程。创建成功后,还需要调用pw_thread_loop_start()


函数原型

structpw_thread_loop*pw_thread_loop_new(constchar*name,conststructspa_dict*props);

参数说明

name:Thread Loop工作线程名称 props:Thread Loop属性字典 不需要额外属性时传入NULL

返回值

成功:返回pw_thread_loop对象指针 失败:返回NULL

返回的对象需要通过:

pw_thread_loop_destroy()

释放。


应用场景

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

第一类是后台连接 PipeWire Core。图形界面程序、播放器或录音程序不希望主线程阻塞在事件循环中,可以创建pw_thread_loop,再通过pw_thread_loop_start()启动独立线程,让 Core 连接、Registry 事件和对象代理回调在后台持续执行。

第二类是音视频 Stream 异步处理。应用创建pw_stream后,Stream 状态变化、Buffer 处理、参数更新和错误事件都需要事件循环驱动。使用 Thread Loop 可以让 PipeWire Stream 在独立线程中运行,应用主线程继续处理 UI、业务逻辑或其他控制任务。

第三类是多线程同步控制。应用线程需要访问 PipeWire Context、Core、Registry 或 Stream 对象时,可以配合pw_thread_loop_lock()pw_thread_loop_unlock()pw_thread_loop_wait()pw_thread_loop_signal()完成跨线程同步,避免应用线程与 PipeWire 工作线程同时修改对象状态。


🌻3. 调用流程剖析

🌻3.1 核心步骤

1. 应用层发起创建

应用调用:

structpw_thread_loop*thread_loop;thread_loop=pw_thread_loop_new("pipewire-thread-loop",NULL);

传入线程名称和属性字典。


2. 分配 pw_thread_loop

内部为:

structpw_thread_loop

分配内存空间。

该对象负责维护:

内部pw_loop 工作线程 互斥锁 条件变量 运行状态 线程名称

3. 保存创建参数

函数保存:

name props

其中name用于标识后续创建的工作线程,props用于传递 Loop 或线程相关属性。


4. 创建内部 pw_loop

pw_thread_loop_new()创建内部事件循环对象:

structpw_loop

该对象负责管理:

I/O事件源 Timer事件源 Signal事件源 Event事件源 Idle事件源 PipeWire通信事件

5. 初始化线程同步对象

Thread Loop 初始化内部同步机制,包括:

mutex condition accept condition 运行状态 等待状态

这些对象为后续的:

pw_thread_loop_lock()pw_thread_loop_unlock()pw_thread_loop_wait()pw_thread_loop_signal()pw_thread_loop_accept()

提供同步基础。


6. 初始化线程状态

创建完成时,Thread Loop 尚未启动。

此时逻辑状态为:

Thread Loop对象已创建 内部pw_loop已创建 工作线程尚未运行

7. 返回 Thread Loop 对象

创建成功后返回:

structpw_thread_loop*

应用可以继续调用:

pw_thread_loop_get_loop()

获取内部pw_loop


8. 后续启动工作线程

应用调用:

pw_thread_loop_start(thread_loop);

后,Thread Loop 才会创建工作线程,并在该线程中驱动内部事件循环。

🌻3.2 调用流程图


🌻3.3 Thread Loop创建生命周期图

🌻4. 实战应用案例

#include<pipewire/pipewire.h>// PipeWire核心API#include<stdio.h>#include<stdlib.h>structapp_data{structpw_thread_loop*thread_loop;// Thread Loop对象structpw_loop*loop;// 内部事件循环};intmain(intargc,char*argv[]){structapp_datadata={0};intresult;pw_init(&argc,&argv);// 初始化PipeWire环境data.thread_loop=pw_thread_loop_new("pipewire-thread-loop",NULL);// 创建Thread Loopif(!data.thread_loop){fprintf(stderr,"pw_thread_loop_new failed\n");pw_deinit();returnEXIT_FAILURE;}data.loop=pw_thread_loop_get_loop(data.thread_loop);// 获取内部pw_loopif(!data.loop){fprintf(stderr,"pw_thread_loop_get_loop failed\n");pw_thread_loop_destroy(data.thread_loop);pw_deinit();returnEXIT_FAILURE;}result=pw_thread_loop_start(data.thread_loop);// 启动工作线程if(result<0){fprintf(stderr,"pw_thread_loop_start failed: %d\n",result);pw_thread_loop_destroy(data.thread_loop);pw_deinit();returnEXIT_FAILURE;}pw_thread_loop_lock(data.thread_loop);// 获取Thread Loop互斥锁/* * 在锁保护范围内创建或操作: * * pw_context * pw_core * pw_registry * pw_stream */pw_thread_loop_unlock(data.thread_loop);// 释放Thread Loop互斥锁pw_thread_loop_stop(data.thread_loop);// 停止工作线程pw_thread_loop_destroy(data.thread_loop);// 销毁Thread Looppw_deinit();// 释放PipeWire环境资源returnEXIT_SUCCESS;}

🌻5. 一句话总结

pw_thread_loop_new()本质上是:

“创建一个包含内部pw_loop和线程同步机制的 Thread Loop 对象”。

它负责完成 Thread Loop 对象分配、内部事件循环创建、线程参数保存和同步对象初始化,但不会立即启动工作线程,是 PipeWire 后台事件处理、异步 Core 连接、Stream 驱动和多线程客户端开发中的基础创建接口。

http://www.cnnetsun.cn/news/3474220.html

相关文章:

  • GPT-5.6多智能体架构与程序化工具调用技术解析
  • Spring Boot集成PageHelper实现高效分页查询
  • AI落地失败的根源:如何定义真正值得解决的业务问题
  • UE5 RPG游戏动画模板:架构设计与高效复用实战指南
  • Sa-Token全局过滤器解决Spring Boot跨域问题实战
  • C++运算符重载:从基础语法到智能指针实战
  • 从零实现游戏内存读写与自动化:基于Cheat Engine与C#的实战指南
  • 电容串并联原理与应用技巧详解
  • ABAP 里的请求路由版图,为什么它不像 Spring MVC 只有一个 HandlerMapping
  • Python agent-api 包完全指南:功能、安装、案例与常见错误
  • 地铁车辆编号解析:从记录格式到实用价值全攻略
  • 技术SEO渲染、爬取与索引指南:修复GSC提示渲染超时的2个步骤
  • 鸿蒙 ArkTS 实战:Medical Beauty Followup 从专业流程到完成闭环完整解析
  • FastAPI多线程实战:提升IO密集型应用性能
  • express户外骑行社区与装备共享APP---附源码25899
  • 公司制度靠“查纸质本“来审计?我用飞算JavaAI做了个合规巡检看板
  • CDF实战指南:从统计概念到业务阈值决策的核心工具
  • UniApp开发Android TV应用全攻略
  • 基于Qwen的像素艺术AI辅助创作:从概念到成稿的全流程工具链
  • Jeff Dahn团队给NMC正极“辟谣“:四大流行误区
  • Chomsky(乔姆斯基)将文法分为四类
  • ACM模式与核心代码模式:编程竞赛与面试的两种解题方式
  • VB中SendMessage API的wMsg参数详解与应用
  • C++试除法判定质数:从暴力枚举到sqrt(n)优化的算法精讲
  • GPU架构演进与并行计算优化实战
  • OpenVLA:开源机器人通用大脑,以7B参数超越谷歌RT-2-X
  • 8259A PIC中断机制解析与内核开发实践
  • Java线程与CPU调度原理及性能优化实践
  • PageHelper分页插件ThreadLocal问题分析与解决方案
  • Unity游戏Mod加载器MelonLoader安装与使用全攻略