Linux PipeWire深度解析之pw_properties_new_dict调用流程与实战(五十七)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言要点概括2.应用场景与用法函数原型参数说明返回值应用场景3.调用流程剖析3.1核心步骤3.2调用流程图3.3生命周期图4.实战应用案例5.一句话总结1.前言本篇目的Linux PipeWire深度解析之pw_properties_new_dict调用流程与实战。要点概括核心功能根据已有spa_dict创建一个新的pw_properties对象用于承载PipeWire对象属性。工作机制读取spa_dict中的key/value条目复制为pw_properties内部可管理的属性集合并返回新的properties对象。典型用途把已有SPA字典转换成PipeWire属性对象再传给Context、Stream、Filter、Node、Proxy等创建接口。pw_properties_new_dict的本质是“属性对象构造函数”。它不负责连接PipeWireCore不负责创建Stream不负责解析完整配置文件也不负责改变已有对象状态。它只做一件事把一个spa_dict形式的只读键值集合转换成PipeWire可拥有、可传递、可释放的pw_properties对象。它和pw_properties_new的区别在于pw_properties_new适合直接用变参方式手写少量key/valuepw_properties_new_dict适合已经有spa_dict的场景尤其是在SPA、模块、回调、对象信息复制等链路中更自然。它和pw_properties_update的区别在于pw_properties_new_dict创建新对象pw_properties_update更新已有对象。前者解决“从dict生成properties”后者解决“把dict合并到已有properties”。它和pw_properties_new_string也不同。pw_properties_new_string面向字符串解析适合配置文本pw_properties_new_dict面向结构化字典适合C代码内部已有的spa_dict数据。2.应用场景与用法pw_properties_new_dict是PipeWire通用Properties API中用于从spa_dict创建pw_properties对象的接口。它位于PipeWire对象创建链路的前置位置。PipeWire中大量对象都需要属性描述例如应用名、媒体类型、媒体角色、节点名称、流名称、对象序列、设备属性、模块属性等。这些属性通常以key/value形式存在。pw_properties_new_dict把已有spa_dict转换成pw_properties之后就可以继续传入PipeWire对象创建接口。pw_properties_new_dict用于根据已有spa_dict构造新的pw_properties对象。函数原型structpw_properties*pw_properties_new_dict(conststructspa_dict*dict);参数说明conststructspa_dict*dict;dict表示输入字典。它通常由若干个spa_dict_item组成每个item包含一个key和一个value。key/value都以字符串形式表达。该函数只读取dict内容不修改输入dict本身。典型spa_dict结构如下structspa_dict_item{constchar*key;constchar*value;};structspa_dict{uint32_tflags;uint32_tn_items;conststructspa_dict_item*items;};工程上要注意三点。第一dict只是初始化来源不是输出对象本身。第二dict中的key/value应保持有效字符串语义不要依赖NULLvalue表达复杂逻辑。第三dict中不要设计重复key。pw_properties是属性集合不适合表达同名多值语义。返回值成功时返回structpw_properties*表示新创建的pw_properties对象。返回NULL表示创建失败常见原因是内存分配失败。调用者必须检查返回值不能直接把NULL传给后续对象创建接口。返回的pw_properties拥有自己的生命周期。未交给其他PipeWire对象接管时调用者需要使用pw_properties_free释放。若传入某些PipeWire创建接口并且该接口声明会接管properties所有权则调用者不应再次释放。应用场景第一类场景是从静态属性表创建Stream属性。例如播放器、录音器、测试音源、虚拟音频节点等应用通常先准备一组media.type、media.category、media.role、application.name等属性再创建PipeWireStream。第二类场景是从已有对象属性复制一份可修改属性。PipeWire对象信息中经常携带spa_dict形式的属性。如果业务需要基于已有属性派生新对象可以先用pw_properties_new_dict复制再通过pw_properties_set增加或覆盖部分字段。第三类场景是模块加载和对象创建。PipeWire模块、会话管理器、设备监控器、Filter、Node、Port、Metadata等对象创建时通常都需要一组属性描述。pw_properties_new_dict可以把已有字典快速转换成创建接口可接收的properties对象。第四类场景是测试代码和最小化示例。当测试代码已经用spa_dict_item数组描述属性时pw_properties_new_dict比变参形式更清晰也更适合复用和封装。3.调用流程剖析3.1核心步骤1.调用者准备spa_dict_item数组每个条目包含一个key和一个value。2.调用者用spa_dict封装items和n_items形成输入字典。3.调用pw_properties_new_dict并传入dict。4.函数内部创建新的pw_properties对象。5.函数读取dict中的每个spa_dict_item。6.函数把key/value复制到pw_properties内部属性集合。7.如果dict为空或没有条目则返回一个空properties对象。8.如果内存分配失败则返回NULL。9.调用者根据返回值判断是否创建成功。10.调用者可以继续通过pw_properties_set修改属性。11.调用者把properties传给Context、Stream、Filter、Node等对象创建接口。12.如果properties没有被后续API接管调用者负责释放。3.2调用流程图3.3生命周期图4.实战应用案例下面以“从spa_dict创建Stream属性”为例说明pw_properties_new_dict的典型用法。这个场景常见于音频播放、音频采集、虚拟节点、测试音源、媒体桥接等PipeWire客户端代码中。应用先把属性写成spa_dict_item数组然后调用pw_properties_new_dict生成pw_properties最后交给pw_stream_new或pw_stream_new_simple创建Stream。#includepipewire/pipewire.hstructapp_data{structpw_core*core;structpw_stream*stream;};staticintcreate_audio_stream(structapp_data*data){staticconststructspa_dict_itemitems[]{{PW_KEY_MEDIA_TYPE,Audio},{PW_KEY_MEDIA_CATEGORY,Playback},{PW_KEY_MEDIA_ROLE,Music},{PW_KEY_APP_NAME,pipewire-properties-demo},{PW_KEY_NODE_NAME,demo.playback.stream},{PW_KEY_NODE_DESCRIPTION,Demo Playback Stream},};staticconststructspa_dictdict{.flags0,.n_itemsSPA_N_ELEMENTS(items),.itemsitems,};structpw_properties*props;propspw_properties_new_dict(dict);if(propsNULL)return-ENOMEM;pw_properties_set(props,PW_KEY_STREAM_IS_LIVE,true);data-streampw_stream_new(data-core,demo-playback,props);if(data-streamNULL)return-EIO;return0;}这段代码的关键点不在Stream创建而在properties构造方式。items是静态属性表适合表达一组固定的对象属性。dict只是对items的轻量封装。pw_properties_new_dict根据dict创建新的pw_properties对象。创建完成后应用仍然可以调用pw_properties_set继续补充属性。需要特别注意所有权问题。在上面的场景中props传给pw_stream_new之后Stream创建接口会接管props所有权。调用者不应再对同一个props调用pw_properties_free否则容易造成重复释放。如果只是临时创建properties并没有传给接管所有权的PipeWireAPI就应由调用者释放staticintbuild_temp_properties(void){staticconststructspa_dict_itemitems[]{{object.name,temporary-object},{object.serial,1001},};staticconststructspa_dictdict{.flags0,.n_itemsSPA_N_ELEMENTS(items),.itemsitems,};structpw_properties*props;propspw_properties_new_dict(dict);if(propsNULL)return-ENOMEM;pw_properties_set(props,object.description,Temporary Properties);/* * 这里可以读取、检查、修改或传递props。 * 如果没有把props交给会接管所有权的API必须主动释放。 */pw_properties_free(props);return0;}还可以用它从已有对象属性派生新属性staticstructpw_properties*clone_and_extend_properties(conststructspa_dict*src){structpw_properties*props;propspw_properties_new_dict(src);if(propsNULL)returnNULL;pw_properties_set(props,application.name,derived-client);pw_properties_set(props,node.description,Derived PipeWire Node);returnprops;}这个写法在对象代理、模块封装、调试工具和会话管理逻辑中很常见。它的优势是原始spa_dict保持只读新对象拥有独立pw_properties后续修改不会反向污染原始属性来源。工程实践中pw_properties_new_dict最容易踩的坑主要有三个。第一把dict误认为properties。spa_dict只是轻量字典视图pw_properties才是PipeWire可管理的属性对象。第二忽略返回值。该函数可能返回NULL后续直接传入对象创建接口会放大错误。第三混淆所有权。props一旦交给会接管所有权的API调用者就不应再释放props如果没有被接管调用者就必须释放。5.一句话总结pw_properties_new_dict是PipeWire中把已有spa_dict转换成新pw_properties对象的属性构造接口核心价值是完成结构化key/value属性复制并为Context、Stream、Filter、Node等对象创建链路提供可拥有、可传递、可释放的properties对象。

相关新闻

什么是重组蛋白?|重组蛋白表达原理、表达系统及应用全面解析

什么是重组蛋白?|重组蛋白表达原理、表达系统及应用全面解析

什么是重组蛋白?|重组蛋白表达原理、表达系统及应用全面解析近年来,随着分子生物学、细胞生物学和蛋白质工程技术的快速发展,重组蛋白(Recombinant Protein)已成为生命科学研究中最常见的研究对象之一。从细…

2026/8/12 18:33:31 阅读更多 →
Python环境高效部署指南:国内镜像加速与全流程配置详解

Python环境高效部署指南:国内镜像加速与全流程配置详解

1. 为什么你的Python下载总是“龟速”? 如果你正准备踏入Python的世界,或者需要在一台新电脑上配置环境,第一步“下载Python安装包”可能就给了你一个下马威。点开Python官网(python.org)的下载页面,选择好…

2026/8/12 18:33:31 阅读更多 →
WarcraftHelper终极方案:魔兽争霸III完美适配现代系统的快速上手指南

WarcraftHelper终极方案:魔兽争霸III完美适配现代系统的快速上手指南

WarcraftHelper终极方案:魔兽争霸III完美适配现代系统的快速上手指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽…

2026/8/12 18:33:31 阅读更多 →

最新新闻

一套比较实用的测试策略

一套比较实用的测试策略

在需求频繁变动、迭代周期紧张的情况下,测试人员不能只依赖“完整测试一遍”来保障质量,而要采用 风险驱动、快速反馈、自动化支撑、重点验证 的测试策略。 下面给出一套比较实用的测试策略。一、核心思路 1. 从“全面覆盖”转向“风险优先” 时间有限时…

2026/8/13 22:32:17 阅读更多 →
MySQL-Innodb-内存结构

MySQL-Innodb-内存结构

一、 Innodb内存结构的基本组成 1.1 基本结构说明Innodb内存结构的组成大致有: Buffer pool:缓冲池,用于存储数据页、索引页(包括自适应哈希索引、undolog缓冲区);Change buffer:变更缓冲区&…

2026/8/13 22:32:17 阅读更多 →
C# System.IO文件处理全攻略:从基础API到高性能实战

C# System.IO文件处理全攻略:从基础API到高性能实战

1. 项目概述:为什么System.IO是C#开发者的必修课 如果你用C#写过任何需要和文件打交道的程序,无论是读取一个配置文件、保存用户上传的图片,还是处理海量的日志数据,那你一定绕不开 System.IO 这个命名空间。它就像是C#世界里通…

2026/8/13 22:32:16 阅读更多 →
从亚美尼亚AI工厂看分布式AI算力:GPU集群、成本优化与开发者实战

从亚美尼亚AI工厂看分布式AI算力:GPU集群、成本优化与开发者实战

如果你是一名开发者,最近可能已经感受到了AI基础设施领域正在发生一些微妙但重要的变化。过去,当我们谈论“AI算力”时,第一反应往往是美国、中国或者新加坡的数据中心。但最近,一个位于亚美尼亚、名为Firebird的公司,…

2026/8/13 22:32:16 阅读更多 →
网络热词FMB~~的传播机制与内容创作应用解析

网络热词FMB~~的传播机制与内容创作应用解析

1. 项目概述:从“FMB~~”看网络热词的传播与解构 最近在社交媒体和网络社区里,一个看起来有点“无厘头”的词——“FMB~~”——开始频繁出现。它可能出现在评论区,也可能作为某个视频的标签,甚至是一些年轻人聊天时的口头禅。乍一…

2026/8/13 22:32:16 阅读更多 →
花生壳怎么建设网站:从零开始的硬核指南,告别域名焦虑,让你的个人站点稳稳上线

花生壳怎么建设网站:从零开始的硬核指南,告别域名焦虑,让你的个人站点稳稳上线

说实话,很多刚接触建站的朋友,一听到“域名”、“服务器”、“公网IP”这几个词,脑子立马就嗡嗡作响。尤其是当你的电脑就放在家里或者办公室里,想搭建一个演示系统、一个个人博客,或者一个简单的内网应用,却发现外网根本访问不了的时候,那种挫败感真的让人抓狂。这时候…

2026/8/13 22:31:15 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →