docs: hand off TASK 21 UI picker slice (acquisition + loop wiring spec)

All headless-testable TASK 21 decoder/mechanism slices shipped; the remaining UI
picker slice (AddMedia command + file dialog + Acquire/Release + Source.MediaIsLooping
-> IMediaFrameSource.Looping) is a GUI feature and is spec'd in HANDOFF for native
Windows build + verification. TASKS status + HANDOFF updated.
This commit is contained in:
2026-08-31 20:17:09 -07:00
parent 881addb5b4
commit 097dd0d9bd
2 changed files with 30 additions and 7 deletions
+29 -6
View File
@@ -14,7 +14,7 @@ the full refactor series (Commit F `3107f92`, Commit G `85893ea`).
## What's In Flight ## What's In Flight
**TASK 21 (media source) — slice 1 step 3 shipped (the session-manager + interface); next open work is the VM wire-in (slice 1 step 4).** **TASK 21 (media source) — all headless-testable decoder/mechanism slices shipped (slice 1 + 2a + 2b + 3); the remaining UI-picker (acquisition) slice is handed off below — it is a GUI feature to build + verify on native Windows.**
Increment A (the `Source` model: `MediaSourceType`, `SourceType.MediaSource`, Increment A (the `Source` model: `MediaSourceType`, `SourceType.MediaSource`,
`MediaPath`/`MediaIsLooping`/`MediaVolume`/`MediaPlaybackState` + LayoutStore `MediaPath`/`MediaIsLooping`/`MediaVolume`/`MediaPlaybackState` + LayoutStore
@@ -83,11 +83,34 @@ pure tests run in WSL; user verifies the GUI suites on native Windows PowerShell
## Next ## Next
1. Commit slice 3 (this unit): loop mechanism + process factory + probe wiring + tests + docs. 1. **(Handed off) UI picker slice** — the last TASK 21 work unit. GUI feature; build + verify natively on Windows.
2. UI picker slice: acquire/release media sessions on add/remove AND wire `Source.MediaIsLooping` → `IMediaFrameSource.Looping` (manager-level per-path loop provider). 2. Await user push checkpoint for the pending commits (TASK 22 + TASK 21 slices below).
3. Slice 3: loop control (restart decode on `Completed` when `MediaIsLooping`).
4. UI picker slice: acquire/release media sessions on add/remove (the remaining slice-1-step-4 open end). ## UI picker slice — handoff spec (2026-08-31)
5. Await user push checkpoint for the pending TASK 22/21 commits.
Nothing `AcquireAsync`s a media path yet, so **no frames flow in a running app** —
the decoder, manager, pacing, and loop mechanism are all shipped and unit-tested,
but a media Source has no way to start a session. Deliverables, in order:
1. **File picker + add/remove commands** (mirror `MainViewModel.Background.cs`/`Trax.cs`
`OpenFileDialog` usage — see `MainViewModel.Trax.cs:68`). A "Media" source action
opens an `OpenFileDialog` filtered to video (mp4/mov/avi); on OK set `Source.MediaPath`,
add to scene, and **`AcquireAsync(MediaPath)`**; on remove **`ReleaseAllAsync(MediaPath)`**.
On `StagedScene` layout loads/teardown, call `ReleaseAllAsync` for every media path no
longer present (and acquire new ones) so sessions track the live scene.
2. **Wire `Source.MediaIsLooping` → `IMediaFrameSource.Looping`** — needs a manager-level
per-**path** loop provider (see ambiguity: sessions are refcounted per `MediaPath` and
shared across scenes, but `MediaIsLooping` is per-`Source`; a scene set → the path's
session `Looping` = any live reference has it on, so one scene turning it on while
another shares the file is shared behaviour — pick a rule and record it).
3. **Loop toggle + volume slider** in the source context menu / inspector (TASKS 11/10).
4. `MediaVolume`/`MediaPlaybackState` wiring (audio path for media is future work).
**Design notes to preserve:** `ResolveOutputFrame` reads `_mediaManager.GetLatestFrame(MediaPath)`;
`OnMediaPreviewBitmapChanged` adopts the shared `WriteableBitmap` per path; `MediaFailed` →
`OnMediaFailed` (currently `Debug.WriteLine`, surface in UI). Composer scales any frame size.
Tmpl: the real-ffmpeg decode/loop/restart path is only exercised natively on Windows — first
GUI smoke test should add a short mp4, confirm it plays and previews, then crash further.
## The directive (2026-08-31, user) ## The directive (2026-08-31, user)
+1 -1
View File
@@ -1036,7 +1036,7 @@ The tasks below are ordered by dependency and risk. Each task builds on the prev
**Goal:** play video files (MP4, MOV, AVI) into scenes — starting soon videos, BRB loops, intro/outro clips. **Goal:** play video files (MP4, MOV, AVI) into scenes — starting soon videos, BRB loops, intro/outro clips.
### Status: 🔶 In progress — Increment A (model + persistence) + Increment B (decoder) shipped; slice 1 step 3 (manager + `IMediaFrameSource`) shipped; resolver/preview wire-in + pacing + loop open ### Status: 🔶 In progress — Increment A (model + persistence) + Increment B (decoder) + slice 1 (manager + resolver/preview wire-in) + slice 2a/2b (ffprobe probe + native-FPS pacing) + slice 3 (loop mechanism) shipped. **Remaining: the UI picker slice (AddMedia command + file dialog + Acquire/Release wiring + loop-flag wiring) — GUI, handed off to build/verify natively on Windows (see HANDOFF → "UI picker slice — handoff spec").**
1. ✅ `MediaSourceType` enum: `Video`, `Audio` (audio-only files via media source) 1. ✅ `MediaSourceType` enum: `Video`, `Audio` (audio-only files via media source)
2. ✅ `SourceType.MediaSource` addition to the enum 2. ✅ `SourceType.MediaSource` addition to the enum