Linux PipeWire深度解析之pw_main_loop_get_loop调用流程与实战(十二)
2026/7/17 5:52:02 网站建设 项目流程

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

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

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

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


🍉🍉🍉文章目录🍉🍉🍉

  • 🌻1. 前言
      • 要点概括
  • 🌻2. 应用场景与用法
    • 函数原型
    • 参数说明
    • 返回值
  • 应用场景
  • 🌻3. 调用流程剖析
    • 🌻3.1 核心步骤
      • 1. 创建 pw_main_loop
      • 2. 应用层发起调用
      • 3. 接收 pw_main_loop 参数
      • 4. 读取内部 pw_loop
      • 5. 同步返回 pw_loop 指针
      • 6. 不创建新对象
      • 7. 调用者使用 pw_loop
      • 8. 由 pw_main_loop 统一释放
    • 🌻3.2 调用流程图
    • 🌻3.3 pw_loop 获取生命周期图
  • 🌻4. 实战应用案例
  • 🌻5. 一句话总结

🌻1. 前言

本篇目的:

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

要点概括

  • 核心功能:从pw_main_loop中获取其内部管理的pw_loop接口。
  • 工作机制:函数直接读取pw_main_loop内部保存的 Loop 指针,并同步返回给调用者,不创建新对象,也不与 PipeWire Daemon 通信。
  • 典型用途:创建pw_context、注册 IO 事件、注册定时器、接入信号源以及构建 PipeWire 客户端事件循环。

🌻2. 应用场景与用法

pw_main_loop_get_loop()是 PipeWire Main Loop 体系中的基础接口。

在 PipeWire 中,pw_main_loop是一个完整的主循环管理对象,负责封装事件循环、迭代控制和事件源调度;而pw_loop是对外提供的 Loop 接口,供其他 PipeWire 对象接入同一个事件循环。

该接口用于:

pw_main_loop中获取内部的pw_loop接口指针。


函数原型

structpw_loop*pw_main_loop_get_loop(structpw_main_loop*loop);

参数说明

loop:通过pw_main_loop_new()创建的 pw_main_loop 对象

返回值

返回structpw_loop指针

返回的pw_loop属于pw_main_loop内部对象,不是新创建的独立对象。

调用者不能单独释放该指针,它的生命周期由对应的pw_main_loop管理。


应用场景

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

第一类是创建 PipeWire Context。pw_context_new()需要接收一个struct pw_loop *,因此应用通常先通过pw_main_loop_new()创建 Main Loop,再调用pw_main_loop_get_loop()获取内部 Loop,最后把它传入pw_context_new()。这样 Context、Core 连接和后续对象都可以运行在同一个事件循环中。

第二类是注册自定义事件源。应用获取pw_loop后,可以向当前 PipeWire 主循环注册文件描述符事件、定时器事件、信号事件、EventFD 事件或 Idle 事件,使应用自己的业务逻辑与 PipeWire 的事件处理运行在同一个 Loop 中。

第三类是构建统一的客户端运行框架。在播放器、录音程序、音频路由工具或节点管理程序中,通常需要同时管理 PipeWire Context、Core、Registry 和自定义事件。通过pw_main_loop_get_loop()获取统一的pw_loop后,这些对象可以共享同一套事件调度机制,避免应用额外维护多套事件循环。


🌻3. 调用流程剖析

🌻3.1 核心步骤

1. 创建 pw_main_loop

应用首先调用:

structpw_main_loop*main_loop;main_loop=pw_main_loop_new(NULL);

创建 Main Loop 管理对象。


2. 应用层发起调用

pw_main_loop_get_loop(main_loop);

3. 接收 pw_main_loop 参数

函数接收:

structpw_main_loop*loop

该参数指向已经创建完成的 Main Loop 对象。


4. 读取内部 pw_loop

pw_main_loop内部维护实际的:

structpw_loop

接口对象。

pw_main_loop_get_loop()直接获取该内部接口的地址。


5. 同步返回 pw_loop 指针

函数返回:

structpw_loop*

整个过程是本地同步调用,不需要等待异步事件。


6. 不创建新对象

该接口不会重新分配一个pw_loop,也不会复制 Main Loop 状态。

返回值仍然指向pw_main_loop内部管理的 Loop。


7. 调用者使用 pw_loop

获取的pw_loop可以继续传给:

pw_context_new()

也可以用于注册 IO、Timer、Signal、Event 和 Idle 等事件源。


8. 由 pw_main_loop 统一释放

当应用调用:

pw_main_loop_destroy(main_loop);

内部pw_loop会随 Main Loop 一起释放。

调用者不能在 Main Loop 销毁后继续使用此前返回的pw_loop指针。


🌻3.2 调用流程图


🌻3.3 pw_loop 获取生命周期图


🌻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 */main_loop=pw_main_loop_new(NULL);if(!main_loop){printf("create pw_main_loop failed\n");pw_deinit();return-1;}/* * 获取 Main Loop 内部的 pw_loop */loop=pw_main_loop_get_loop(main_loop);if(!loop){printf("get pw_loop failed\n");pw_main_loop_destroy(main_loop);pw_deinit();return-1;}printf("pw_main_loop : %p\n",(void*)main_loop);printf("pw_loop : %p\n",(void*)loop);/* * 使用 pw_loop 创建 PipeWire Context */context=pw_context_new(loop,NULL,0);if(!context){printf("create pw_context failed\n");pw_main_loop_destroy(main_loop);pw_deinit();return-1;}printf("create pw_context success\n");/* * 销毁 Context */pw_context_destroy(context);/* * pw_loop 属于 main_loop, * 不需要也不能单独销毁 */pw_main_loop_destroy(main_loop);pw_deinit();return0;}

🌻5. 一句话总结

pw_main_loop_get_loop()本质上是:

“从 pw_main_loop 中取出其内部管理的 pw_loop 接口”。

它不会创建新的 Loop,也不会向 PipeWire Daemon 发送请求,而是同步返回 Main Loop 内部的接口指针。该指针主要用于创建pw_context、注册事件源和接入 PipeWire 事件循环,其生命周期始终由对应的pw_main_loop管理。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询