文章

MiguDelay 架构 19:监看音频

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

MiguDelay 架构 19:监看音频

系列导航系列总览 · 上一篇:MiguDelay 架构 18:Preview、九路 Surface 与首帧 · 下一篇:MiguDelay 架构 20:运行中流重配置

扫描基线

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

1. 问题模型

用户控制、Surface 中的 PcmPlayer2 attachment 和任务音频 format 可能乱序到达。MonitorAudioService 汇合三者;只有 Player 与 format 都具备才异步初始化,但控制值始终保留。

2. 核心类

职责
MonitorAudioService 控制、attachment、format、readiness 真值
LegacyMonitorAudioBinding 观察 Preview Registry,转发 format/frame
PcmPlayerAdapter 适配 PcmPlayer2
MonitorAudioViewModel QML read-only state/control
PcmPlayer2 PCM 设备与播放线程

3. 七路 Surface

MainInput、Delay、InDelay、Aux、Program、BackupInput、BackupOutput。主流 format 配置前五路,两个备路只配置各自 Surface。

4. 状态机

stateDiagram-v2
    [*] --> WaitingPlayer
    WaitingPlayer --> WaitingFormat: playerAttached
    WaitingPlayer --> Initializing: playerAndFormat
    WaitingFormat --> Initializing: formatArrived
    Initializing --> Ready: currentInitSuccess
    Initializing --> Failed: currentInitFailure
    Ready --> Initializing: replacement
    Failed --> Initializing: newPlayerOrFormat
    Ready --> WaitingPlayer: playerDetached

5. 三重 generation

init completion 必须匹配 task generation、attachment generation 和 configuration generation。页面重建、任务替换或 format 变化都会让旧 completion stale。

6. 控制链

sequenceDiagram
    participant Q as QML
    participant V as Monitor ViewModel
    participant S as MonitorAudioService
    participant A as PcmPlayerAdapter

    Q->>V: set mute tracks or volume
    V->>S: typed control
    S->>S: update authoritative control state
    alt player attached
        S->>A: apply latest controls
    else player unavailable
        S->>S: retain controls
    end
    S-->>V: state snapshot

默认 input/output muted、左右 track [0,1]、volume 50,volume clamp 0–100。

7. format 与帧调用

1
2
3
4
5
6
7
8
9
10
11
ReceiveReadySnapshot
  -> LegacyTaskStartBinding
  -> MonitorAudioService.configureStream
  -> async player initialization

Preview audio event
  -> LegacyMonitorAudioBinding
  -> current surface adapter
  -> PcmPlayerAdapter.playAudio
  -> PcmPlayer2
  -> AudioPlaybackThread or PulseAudio

Service 不保存 PCM 帧。

8. shutdown

关闭 Service gate、使 generations 失效、关闭 Adapter callback gate、停止 player、清 attachments/formats/readiness。Runtime 在清 Preview Registry 前先关闭 Monitor。

9. 源码证据

  • src/code/module/playback/monitoraudio/*
  • src/code/controls/audio/pcmplayer2.*
  • src/code/data/playback/monitoraudioviewmodel.*

系列导航系列总览 · 上一篇:MiguDelay 架构 18:Preview、九路 Surface 与首帧 · 下一篇:MiguDelay 架构 20:运行中流重配置

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