文章

MiguDelay 架构 16:输出模式

MiguDelay(DDLive)项目架构系列文档:输出模式。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。

MiguDelay 架构 16:输出模式

系列导航系列总览 · 上一篇:MiguDelay 架构 15:推流、网络复用与重试 · 下一篇:MiguDelay 架构 17:Aux 播单、Reader 与帧源

扫描基线

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

1. 四种模式

Mode 视频 音频
Delay 原延时视频 原延时音频
AuxWithAudio Aux 视频 Aux 音频
AuxVideoOnly Aux 视频 原延时音频
MutedLive 非 Aux 视频路径 原音频路径,推流 mute

单一 enum 取代多个可写 bool 组合。

2. 核心类

职责
OutputModeService 校验、写 mode、发布 event
OutputModeStateView 唯一 atomic mode
LegacyOutputModeBinding readiness snapshot 与兼容副作用
OutputModeViewModel QML command/read-only projection
FrameAvailabilityTracker input/delay readiness
IOutputModeSource media thread 只读 Port

3. 命令链

sequenceDiagram
    participant Q as QML
    participant V as OutputModeViewModel
    participant B as LegacyOutputModeBinding
    participant S as OutputModeService
    participant ST as OutputModeStateView
    participant O as Output Tick

    Q->>V: switchTo target
    V->>B: typed command
    B->>B: capture readiness snapshot
    B->>S: switchMode
    alt rejected
        S-->>V: stable error code
    else accepted
        S->>ST: atomic exchange
        S-->>B: mode changed event
        S-->>V: authoritative state
        O->>ST: acquire load
    end

4. 校验

包括 shutdown、task not Running、already target、Aux playlist/reader 不可用、Delay return not ready、无 input frame、delay buffer 不足、无 delayed frame 和 output not ready。

5. accepted 后副作用

Binding 在状态提交后执行 MQTT block/delay/aux/mute、ShieldSnapshot start/flush、Aux reader load/reset、操作日志和主机复制。副作用不能先于 Service commit。

6. 跨线程读

Service 是唯一 writer;Output/Gateway 通过 shared const source 读取;Aux/Preview 持 const reference。控制线程写 atomic,媒体线程 acquire read。

7. internal reset

恢复到 Delay 仍通过 Service/StateView,但 origin 标记 internal recovery,可抑制复制、截图和操作日志等外部副作用。

8. 源码证据

  • src/code/module/playback/outputmode/outputmodeservice.*
  • src/code/module/playback/outputmode/outputmodestateview.h
  • src/code/module/playback/outputmode/legacyoutputmodebinding.*
  • src/code/data/playback/outputmodeviewmodel.*
  • src/code/module/output/outputmoderouting.h

系列导航系列总览 · 上一篇:MiguDelay 架构 15:推流、网络复用与重试 · 下一篇:MiguDelay 架构 17:Aux 播单、Reader 与帧源

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