当前位置:首页>Linux>Linux多媒体进阶之旅(三):图解Pulseaudio共享内存链路全景

Linux多媒体进阶之旅(三):图解Pulseaudio共享内存链路全景

  • 2026-10-11 07:35:04
Linux多媒体进阶之旅(三):图解Pulseaudio共享内存链路全景

点击下方👇关注Android系统攻城狮

第196篇原创文章

每日充电:OS+MultiMedia学习之旅


学习理念:一次理解一个知识点
源码环境:PulseAudio17
硬件平台:RK3588
主题内容:图解Pulseaudio共享内存链路全景
难度:★★★★☆
阅读时间:2.8分钟

   本篇我们继续PulseAudio一条非常重要的共享内存链路,先看一个结构体关系:

pa_memblockq

  └── pa_memchunk

        └── pa_memblock

              └── pa_mempool

                    └── pa_shm

     第一眼看上去,可能会有点蒙圈,这些内存结构到底谁包含谁?谁真正持有内存?谁只是描述一段数据?谁负责管理底层共享内存?

     不过,搞懂这层关系,它会帮助我们理解PulseAudio中音频数据如何从应用写入、进入队列、跨进程共享最核心的部分之一。

01

共享内存结构关系
    链路最上层的pa_memblockq不是直接保存PCM,而是通过pa_memchunk间接引用真正的数据块。。
    pa_memblockq内部有两类典型chunk路径:
💡队列里保存的是chunk描述,真正的音频数据在memblock后面。

02

职责 VS 角色

        核心结构体的按层级的职责 vs 角色:

💡上层是内存组织管理,下层是共享内存实现。

03

pa_memblockq:内存控制队列
    pa_memblockq的核心职责,是保存一组按时间顺序排列的pa_memchunk,所以这里是链表队列。
💡pa_memblockq是队列控制器,而它内部通过多个struct list_item节点来组织数据。链表节点list_item中真正保存是pa_memchunk。

04

pa_memchunk内存结构

        pa_memchunk的功能,是描述pa_memblock中的一段数据。

    比如,一个memblock里存字符串:"Hello_PulseAudio"为例:

    可以有不同的chunk去描述它的不同片段,所以 pa_memchunk 本质上是一个“切片描述符”。

💡pa_memchunk不拥有内存,也没有引用计数,它只是描述:从哪个memblock的哪个位置,取多长的一段。

05

pa_memblock:数据块对象

    如果说pa_memchunk只是视图,那么pa_memblock才是实体。

💡pa_memblock才是真正可被ref/unref管理的数据块对象。

06

pa_mempool内存池与slot

    pa_mempool管理底层pa_shm内存区域,并把它按block_size切成许多slot。

💡mempool管理的是内存池,不是某一个具体数据块。

07

pa_shm底层内存区域

    pa_shm描述的不是队列,也不是chunk,而是真正的底层共享内存区域。

💡整条链简单来说:pa_shm先创建底层内存,接着pa_mempool 持有并切分它,最后pa_memblock从这些slot中取得data数据。

08

总结:提取模型骨架
💡更直白的理解:pa_shm提供底层内存,pa_mempool管理这块内存,pa_memblock引用其中一块数据,pa_memchunk描述这块数据中的某一段,而pa_memblockq把很多memchunk排队。
  • 若读者朋友发现有错误、疑问的地方,或者好的建议,欢迎拍砖!!!

★★★★★★★★★★< END >★★★★★★★★★★

关注,回复【1024】,限时领取:OS+Multimedia资料包

精彩文章合集

  专栏推荐

☞【专栏一】基础原理系列
☞【专栏二】Android车载音频系列
☞【专栏三】Android编解码系列
☞【专栏四】Android相机系列
☞【专栏五】Android图形系列
☞【专栏六】Android系统系列
☞【专栏七】WSL进击AOSP系列
原创不易, 谢谢支持~~

最新文章

随机文章