GMF-Element 是工作片的提供者,为每个 element 提供三个基础的工作片,即 open,process 和 close。其中 open 一般是最先加载的工作片,process 会在 open 处理完后被加载,当所有 element 的工作片都处理完或者发生错误的时,close 工作片会被加载。
GMF-Pipeline 负责管理和加载被连接的 element 的工作片,同时负责对 GMF-Task 的开始和停止进行控制。当 GMF-Pipeline 有 IN 和 OUT 的 IO 接口时,还负责对其进行打开和关闭操作。
GMF-Task 处理工作片的流程参见下图。整个过程分为三个阶段,第一个阶段是 opening,把每个 element 的 open 和 process 工作片都调用一次,然后进入 running 阶段,这个过程是按 element 连接顺序循环执行每个 element 的 process 工作片,当工作片处理完或者出错则进入最后一个阶段 cleanup,它会调用每个 element 的 close 工作片来回收 element 资源。
GMF-Pipeline 是 GMF 中可以独立运行的模块,为用户提供 pipeline 的控制接口,如 Pipeline 的 run\stop\pause\resume\reset 等。GMF-Pipeline 负责处理连接的 element 和 task 事件,还负责打开和关闭 IN 和 OUT port。在运行过程中 pipeline 还负责注册连接的 element job。GMF-Pipeline 一般由一个 GMF-Task、至少一个 element、最多一个 IN port 和最多一个 OUT port 组成。IN port 连接的是第一级 element 的输入,OUT port 连接的是最后一级 element 的输出。一个 pipeline 可以包含一个 element 或多个 element,支持的 element 数量没有上限,只受物理资源限制。
GMF-Pipeline 的灵活性很高,本文介绍 4 个基本的 pipeline 应用。
应用 1:一路 pipeline 从文件解码音频到 I2S 播放
Mermaid
graph LR
File((File)) --> Decoder1[decoder] --> Resample1[Resample] --> I2S((I2S))
应用 2:pipeline 输入输出不连接 port,而是使用回调函数,让用户去填充数据
Mermaid
graph LR
CB1((CB)) --> Decoder2[decoder] --> Resample2[Resample] --> CB2((CB))
应用 3:一路播放文件的 pipeline 拆成两个,通过 Ringbuffer 连接
Mermaid
graph LR
subgraph P1
File3((File)) --> MP3_1[MP3]
end
MP3_1 --> Resample3[Resample]
subgraph P2
Resample3 --> OUT3((OUT))
end