文章

MiguDelay 架构 10:Gateway 与 TaskHandle 兼容边界

MiguDelay(DDLive)项目架构系列文档:Gateway 与 TaskHandle 兼容边界。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。

MiguDelay 架构 10:Gateway 与 TaskHandle 兼容边界

系列导航系列总览 · 上一篇:MiguDelay 架构 09:TaskOrchestrator 编排 · 下一篇:MiguDelay 架构 11:收流、探测、解复用与解码

扫描基线

  • 项目:MiguDelay(DDLive)
  • 分支:refactor/video-frame-provider
  • HEAD:d28ec061406e4e3df93e3d1a92478d71a9ad4908
  • 工作树:clean
  • 扫描日期:2026-08-04
  • 说明:内容以当前 HEAD 源码为准;仓库旧架构文档只作为检索线索。

1. 分工

  • TaskHandleGateway:typed 请求、ticket/UUID 关联、callback gate、线程切换。
  • LegacyTaskHandleAdapter:typed struct 与 legacy TaskInfo 转换,接收快照和 Output 激活。
  • TaskHandle:任务队列、worker、context map 和具体 Task。
  • TaskOrchestrator:决定业务下一步。

2. 六类请求

start/stop receive、start/stop record、start/stop push。activateReceive() 不创建 worker task,而是把已就绪 context 接入 Runtime dependencies 和 Preview callback。

3. 提交调用链

sequenceDiagram
    participant O as TaskOrchestrator
    participant G as TaskHandleGateway
    participant A as LegacyTaskHandleAdapter
    participant T as TaskHandle
    participant W as Legacy Task Worker

    O->>G: typed request
    G->>G: allocate nonzero ticket and UUID
    G->>A: submit variant and UUID
    A->>A: build legacy TaskInfo
    A->>T: addTask ownership transfer
    T->>W: execute
    W-->>T: TaskResultInfo
    T-->>A: raw callback
    A-->>G: RawGatewayResult
    G-->>O: typed TaskGatewayResult

4. Pending 关联

pending operation 记录 UUID、ticket、expected TaskType、task generation、resourceId、lifecycle epoch 和首结果标记。未知 UUID、类型不匹配、wrong payload、duplicate 和 late result 在边缘过滤。

5. 线程安全

raw callback 可能来自 TaskHandle worker。Gateway 先用共享 IngressState 检查 accepting 和关联,再 queued 到 QObject 线程;deliverResult() 再检查 lifecycle epoch 后 emit。

6. Adapter 字段映射

  • Receive:address、contextId、generation、current-generation token、hardware decoder、long delay、only live。
  • Record:recordId、paths、encoder/muxer、尺寸、帧率、GOP、bitrate、音轨信息。
  • Push:contextId、encoder params、muxer init、音轨映射和协议。

7. ReceiveReadySnapshot

Adapter 从 NetworkRecvContext 按值复制视频分辨率、帧率、bit depth、codec、color、pixel format、全部音轨和 long-time-delay。领域层不持有 legacy context。

8. activateReceive

1
2
3
4
5
6
7
8
9
TaskOrchestrator
  -> TaskStartEffects.activateReceive
  -> TaskHandleGateway.activateReceive
  -> LegacyTaskHandleAdapter.activateReceive
       -> get NetworkRecvContext
       -> inject OutputRuntimeDependencies
       -> register current/delay/indelay/Aux callbacks
       -> adaptPreviewFrame
       -> IPreviewFrameSink

主输入才注入 mode/aux source 和延时回调;备路只绑定独立 preview。

9. context 幂等停止

TaskHandle 的 recv、record、push map 均由 mutex 保护。take*Context() 在同一临界区取出并删除,保证并发 stop 只有一个执行者拥有真实资源。

10. 源码证据

  • src/code/module/playback/gateway/taskhandlegateway.*
  • src/code/module/playback/gateway/legacytaskhandleadapter.*
  • src/code/module/playback/gateway/taskgatewaybackend.*
  • src/code/module/taskhandle/TaskHandle.*
  • src/code/module/taskhandle/TaskDef.*

系列导航系列总览 · 上一篇:MiguDelay 架构 09:TaskOrchestrator 编排 · 下一篇:MiguDelay 架构 11:收流、探测、解复用与解码

本文由作者按照 CC BY 4.0 进行授权