Linux PipeWire深度解析之pw_stream_return_buffer调用流程与实战(五十一)
简介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_stream_return_buffer调用流程与实战。要点概括核心功能把已经dequeue但不准备作为有效媒体数据提交的pw_buffer退回给PipeWireStream。工作机制应用从Stream中取出Buffer后如果发现当前Buffer不适合继续处理或者本周期决定放弃提交就调用pw_stream_return_buffer把Buffer还回Stream内部队列。典型用途Buffer检查失败、数据源不足、业务决定丢弃本周期输出、采集数据不再处理、异常路径下避免Buffer泄漏。pw_stream_return_buffer的本质不是“提交媒体数据”而是“退回Buffer使用权”。它解决的问题是应用已经通过pw_stream_dequeue_buffer拿到了Buffer但后续判断发现不应该把它作为正常数据送入PipeWire图调度此时需要把Buffer还回去。它和pw_stream_queue_buffer的区别非常关键。queue_buffer表示Buffer已经完成正常处理可以进入后续媒体链路return_buffer表示放弃本次使用只是把Buffer归还给Stream不表达有效媒体数据提交语义。它也不是内存释放函数。Buffer内存仍然由PipeWireStream管理应用不能手动释放pw_buffer也不能在return之后继续访问该Buffer。return之后Buffer所有权重新回到PipeWire后续可能被再次dequeue复用。2.应用场景与用法pw_stream_return_buffer是PipeWireStream API中用于退回已取出Buffer的接口。它位于PipeWireStream数据路径的异常分支或放弃分支中。正常媒体数据处理路径通常是dequeue、处理、queue而return_buffer处理的是dequeue之后不想提交有效数据的场景。pw_stream_return_buffer用于把已经dequeue但不准备提交的Buffer退回给PipeWireStream。函数原型intpw_stream_return_buffer(structpw_stream*stream,structpw_buffer*buffer);参数说明structpw_stream*stream;stream表示当前Buffer所属的PipeWireStream对象。该Stream必须是有效Stream并且必须和buffer来源一致。不能从一个Stream中dequeue出Buffer再通过另一个Stream调用return_buffer。structpw_buffer*buffer;buffer表示需要退回的pw_buffer对象。该Buffer通常来自同一个Stream的pw_stream_dequeue_buffer。调用return_buffer之后应用不应继续读取、写入或修改该Buffer中的spa_buffer、spa_data、spa_chunk等字段。返回值成功时通常返回0。失败时返回负值错误码。工程代码中应按“小于0为失败”的方式处理。return_buffer失败通常说明调用关系不正确例如Stream无效、Buffer无效、Buffer不属于当前Stream或者Buffer当前状态不允许被退回。应用场景第一类场景是Buffer检查失败。应用dequeue到Buffer后发现data-data为空、data-chunk为空、maxsize不足、格式状态不符合预期此时不应把该Buffer当作有效数据queue出去可以直接return_buffer退回。第二类场景是播放流数据不足。例如播放器、网络音频、解码器或环形缓冲区当前没有足够PCM数据。如果业务策略不是补静音而是放弃本周期提交就可以return_buffer退回Buffer。第三类场景是采集数据丢弃。采集流中如果当前输入数据不再需要处理例如录音暂停、上层丢弃、算法模块临时不可用可以在读取前或读取后退回Buffer避免应用侧长期占用Buffer。第四类场景是异常路径清理。实时音视频处理代码中dequeue之后可能出现业务判断失败、格式变化、状态切换、对象销毁前保护等情况。return_buffer可以保证Buffer及时回到Stream避免Buffer池被应用侧耗尽。3.调用流程剖析3.1核心步骤1.应用创建pw_stream对象并注册process事件回调。2.应用调用pw_stream_connect连接Stream完成格式协商和Buffer协商。3.PipeWire通过add_buffer事件把Buffer加入Stream内部管理。4.PipeWire图调度触发process回调。5.应用调用pw_stream_dequeue_buffer取出一个pw_buffer。6.应用检查Buffer状态、业务状态、数据源状态或格式状态。7.如果Buffer可以正常处理则进入常规数据路径处理完成后调用pw_stream_queue_buffer。8.如果Buffer不适合提交有效数据则进入退回路径。9.应用调用pw_stream_return_buffer把Buffer退回Stream。10.Buffer重新回到Stream内部可用队列等待后续调度周期再次使用。3.2调用流程图3.3生命周期图4.实战应用案例下面以“播放流中数据不足时退回Buffer”为例说明pw_stream_return_buffer的典型用法。播放流正常情况下应该取出Buffer、填充PCM、设置chunk、queue提交。但如果当前业务侧没有可用PCM数据并且不希望填充静音就可以把Buffer退回给Stream。structapp_data{structpw_stream*stream;uint32_tframe_size;};staticuint32_tread_pcm_from_ringbuffer(void*dst,uint32_tmax_bytes){/* * 实际项目中这里通常从解码器、网络流、 * 环形缓冲区或算法输出队列中读取PCM数据。 */return0;}staticvoidon_process(void*userdata){structapp_data*appuserdata;structpw_buffer*b;structspa_buffer*buf;structspa_data*data;uint32_tn_bytes;intret;bpw_stream_dequeue_buffer(app-stream);if(bNULL)return;bufb-buffer;databuf-datas[0];if(data-dataNULL||data-chunkNULL){retpw_stream_return_buffer(app-stream,b);(void)ret;return;}n_bytesread_pcm_from_ringbuffer(data-data,data-maxsize);if(n_bytes0){retpw_stream_return_buffer(app-stream,b);(void)ret;return;}data-chunk-offset0;data-chunk-sizen_bytes;data-chunk-strideapp-frame_size;pw_stream_queue_buffer(app-stream,b);}这个案例中return_buffer只出现在放弃路径。当Buffer不可写或者没有有效PCM数据时应用不把Buffer提交给正常播放链路而是退回Stream。这样可以避免把无效数据、脏数据或未初始化数据送入PipeWire图。采集流中也可以使用return_buffer。例如应用取到采集Buffer后发现当前录音已经暂停或者上层算法暂时不需要数据就可以退回Buffer。structcapture_data{structpw_stream*stream;bool capture_enabled;};staticvoidon_capture_process(void*userdata){structcapture_data*appuserdata;structpw_buffer*b;structspa_buffer*buf;structspa_data*data;constuint8_t*src;uint32_tsize;bpw_stream_dequeue_buffer(app-stream);if(bNULL)return;if(!app-capture_enabled){pw_stream_return_buffer(app-stream,b);return;}bufb-buffer;databuf-datas[0];if(data-dataNULL||data-chunkNULL){pw_stream_return_buffer(app-stream,b);return;}srcSPA_PTROFF(data-data,data-chunk-offset,uint8_t);sizedata-chunk-size;/* * 正常采集处理 * 可以送入录音文件、编码器、语音前处理、 * 回声消除模块或网络发送模块。 */(void)src;(void)size;pw_stream_queue_buffer(app-stream,b);}工程开发中使用pw_stream_return_buffer要注意四点。第一return_buffer只能用于已经dequeue出来的Buffer。没有dequeue就return或者重复return同一个Buffer都会破坏Stream内部Buffer状态。第二return_buffer不是正常提交路径。如果Buffer已经填充了有效音频或视频数据并且希望PipeWire继续处理应使用pw_stream_queue_buffer而不是return_buffer。第三return之后不要继续访问Buffer。return之后Buffer所有权已经回到PipeWire应用继续读写会造成数据竞争、状态错乱或难以复现的实时问题。第四异常路径也必须归还Buffer。只要dequeue成功无论后续成功、失败、丢弃还是暂停都必须通过queue_buffer或return_buffer结束本次Buffer持有周期。5.一句话总结pw_stream_return_buffer是PipeWireStream数据路径中的Buffer退回接口当应用已经dequeue到Buffer但不准备提交有效媒体数据时用它把Buffer使用权还给Stream避免Buffer长期占用并保持图调度链路稳定。

相关新闻

如何用3个步骤让小爱音箱播放你的本地音乐库?

如何用3个步骤让小爱音箱播放你的本地音乐库?

如何用3个步骤让小爱音箱播放你的本地音乐库? 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否厌倦了在线音乐平台的版权限制和广告干扰&#xff1…

2026/8/8 10:15:14 阅读更多 →
从0到1带你使用最新版Codex,我整理的全新保姆即教程来了

从0到1带你使用最新版Codex,我整理的全新保姆即教程来了

最近 Codex 的存在感,确实越来越强了。 但我发现一件很有意思的事:很多人已经装好了 Codex,却还是把它当成另一个 ChatGPT。 而最近openai开始不再更新Codex App,二十选择把codex app揉进Chat GPT 客户端里面。 很多人使用codex的…

2026/8/8 10:15:14 阅读更多 →
Linux进程创建:fork()与写时拷贝揭秘

Linux进程创建:fork()与写时拷贝揭秘

进程控制进程创建Linux创建进程通过fork()函数调用!在之前的学习已经提到了这个知识点!父进程在主函数中调用fork函数,此时os就在创建了一个子进程,此时父子进程就开始并发调度,分流运行! fork函数返回: 子…

2026/8/8 10:15:14 阅读更多 →

最新新闻

Deepin Linux下配置富士施乐M115b打印机驱动:CUPS与foo2zjs实战指南

Deepin Linux下配置富士施乐M115b打印机驱动:CUPS与foo2zjs实战指南

1. 项目缘起:当国产Linux遇上老牌打印机最近在把家里的老笔记本换成Deepin Linux,图的就是它界面漂亮、对中文友好,用起来跟Windows差不多顺手。一切都挺顺利,直到我需要打印一份文件,麻烦就来了。我手头这台富士施乐D…

2026/8/8 11:13:58 阅读更多 →
LLM推理降本实战:从模型量化到服务优化的系统性工程指南

LLM推理降本实战:从模型量化到服务优化的系统性工程指南

1. 项目概述:当推理成本成为拦路虎“模型又慢了”、“这个月的云账单怎么这么高”、“用户抱怨响应延迟”……如果你负责过大型语言模型(LLM)的生产部署,对这些抱怨一定不陌生。我们费尽心思选型、微调出一个效果惊艳的模型&#…

2026/8/8 11:13:58 阅读更多 →
3个痛点,1个解决方案:Rusted PackFile Manager如何彻底改变《全面战争》模组制作体验

3个痛点,1个解决方案:Rusted PackFile Manager如何彻底改变《全面战争》模组制作体验

3个痛点,1个解决方案:Rusted PackFile Manager如何彻底改变《全面战争》模组制作体验 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for …

2026/8/8 11:13:58 阅读更多 →
RFSoC系统设置API实战:从时钟配置到校准启动的稳健初始化流程

RFSoC系统设置API实战:从时钟配置到校准启动的稳健初始化流程

1. 从“能用”到“好用”:为什么系统设置是RFSoC开发的胜负手在基于Xilinx RFSoC平台进行射频信号处理开发时,很多工程师,尤其是从FPGA逻辑设计转过来的朋友,常常会把注意力集中在数据转换器(RF-ADC/RF-DAC&#xff09…

2026/8/8 11:13:58 阅读更多 →
单片机中断系统:从轮询到事件驱动的核心原理与实战配置

单片机中断系统:从轮询到事件驱动的核心原理与实战配置

单片机中断系统:从“轮询苦力”到“事件管家”的思维跃迁 又到了期末复习季,对于很多单片机初学者来说,中断系统就像一道无形的坎。课堂上听懂了“中断就是打断”,做题时却分不清中断向量、优先级和现场保护。更关键的是&#xff…

2026/8/8 11:13:58 阅读更多 →
滑动窗口算法解析:无重复字符最长子串实战

滑动窗口算法解析:无重复字符最长子串实战

1. 滑动窗口算法概述 滑动窗口(Sliding Window)是处理字符串和数组类问题的经典算法范式,特别适合解决"连续子串/子数组"相关的最值问题。它的核心思想是维护一个可动态扩展和收缩的窗口区间,通过调整窗口边界来高效地寻…

2026/8/8 11:12:45 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/7 23:54:54 阅读更多 →
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/7 17:02:36 阅读更多 →