Linux Pulseaudio深度解析之pa_proplist_sets调用流程与实战(九十六)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1. 前言要点概括2. 应用场景与用法函数原型参数说明返回值应用场景3. 调用流程剖析3.1 核心步骤1. 应用层准备 Proplist2. 应用层写入字符串属性3. 检查参数合法性4. 保存属性键值对5. 覆盖旧值6. 后续传给 PulseAudio 对象7. Server 端读取属性8. 工具侧展示属性3.2 调用流程图3.3 Proplist 字符串属性设置生命周期图4. 实战应用案例5. 一句话总结1. 前言本篇目的Linux PulseAudio 深度解析之pa_proplist_sets调用流程与实战。要点概括核心功能向pa_proplist属性表中写入一个字符串类型的键值对。工作机制应用程序传入key和字符串valuepa_proplist_sets()将其保存到pa_proplist内部属性表中后续可用于描述 Context、Stream、Device、Client 等对象。典型用途设置应用名称、设置媒体名称、设置流角色、设置设备描述、给音频对象附加元信息。2. 应用场景与用法pa_proplist_sets()是 PulseAudio 属性表管理体系中的核心写入接口。在 PulseAudio 中Context、Stream、Sink、Source、Client、Card 等对象都可以携带一组属性信息这些属性信息最终通常保存在pa_proplist对象中。而该接口用于向pa_proplist中写入一个字符串属性。函数原型intpa_proplist_sets(pa_proplist*p,constchar*key,constchar*value);参数说明p:目标 pa_proplist 对象 key:属性名称例如 PA_PROP_APPLICATION_NAME value:字符串属性值例如music-player返回值成功返回0失败返回负值用于判断属性是否写入成功。应用场景pa_proplist_sets()常见应用场景主要有三类。第一类是设置应用程序身份信息。应用创建 PulseAudio Context 或 Stream 时可以通过pa_proplist_sets()设置PA_PROP_APPLICATION_NAME、PA_PROP_APPLICATION_ID、PA_PROP_APPLICATION_ICON_NAME等属性让 PulseAudio Server、音量面板或调试工具知道这个连接来自哪个应用。第二类是设置媒体流描述信息。播放器创建播放流时可以通过该接口设置PA_PROP_MEDIA_NAME、PA_PROP_MEDIA_ROLE、PA_PROP_MEDIA_ICON_NAME等属性用来描述这条流正在播放什么内容以及它属于 music、video、phone、event 还是其他音频角色。第三类是设置设备或调试元信息。在设备管理、音频调试、自动化测试中可以通过pa_proplist_sets()给对象附加设备描述、测试标签、模块标识或自定义属性方便后续查询、过滤、日志分析和问题定位。3. 调用流程剖析3.1 核心步骤1. 应用层准备 Proplistpa_proplist*proplist;proplistpa_proplist_new();2. 应用层写入字符串属性pa_proplist_sets(proplist,PA_PROP_APPLICATION_NAME,pa-proplist-demo);3. 检查参数合法性内部会检查pa_proplist 对象 key value是否有效。4. 保存属性键值对把传入的key value写入pa_proplist内部属性表。5. 覆盖旧值如果同一个key已经存在则新的字符串值会覆盖旧值。6. 后续传给 PulseAudio 对象设置好的pa_proplist可以继续传给 Context、Stream 或其他对象使用。例如pa_context_new_with_proplist() pa_stream_new_with_proplist()7. Server 端读取属性当 Context 或 Stream 创建请求发送到 Server 后服务端可以读取这些属性用于显示、路由策略、日志和调试。8. 工具侧展示属性音量面板、调试工具或自定义管理程序可以通过查询接口看到这些属性信息。3.2 调用流程图3.3 Proplist 字符串属性设置生命周期图4. 实战应用案例#includepulse/pulseaudio.h#includestdio.hvoidcreate_proplist_demo(void){pa_proplist*proplist;intret;proplistpa_proplist_new();if(!proplist){printf(create proplist failed\n);return;}retpa_proplist_sets(proplist,PA_PROP_APPLICATION_NAME,pa-proplist-demo);if(ret0){printf(set application name failed\n);pa_proplist_free(proplist);return;}retpa_proplist_sets(proplist,PA_PROP_MEDIA_NAME,test pcm stream);if(ret0){printf(set media name failed\n);pa_proplist_free(proplist);return;}retpa_proplist_sets(proplist,PA_PROP_MEDIA_ROLE,music);if(ret0){printf(set media role failed\n);pa_proplist_free(proplist);return;}/* * 后续可以把 proplist 传给 * * pa_context_new_with_proplist() * pa_stream_new_with_proplist() */printf(set proplist success\n);pa_proplist_free(proplist);}intmain(){create_proplist_demo();return0;}5. 一句话总结pa_proplist_sets()本质上是“向 pa_proplist 属性表中写入一个字符串键值对”。它负责把应用层的描述信息、媒体信息、角色信息和自定义元信息保存到 PulseAudio 属性表中是 Context、Stream、Device、Client 等对象携带可读属性和调试信息的基础接口之一。