TASK 24 post-pause polish batch (creator's 8 review issues, 2026-08-15): (1) desktop/game audio volume slider + (2) mute were no-ops — the AudioMixer's gain Func seams defaulted to unity because the VM never passed them; new AudioGainProvider (Services/Audio/) wires MicMuted/MicVolume/GameMuted/GameAudioVolume into the mixer at construction, read live each mix tick, so sliders and mutes are stream-honest; the game bar also scales TRAX locally via new MusicPlayer.LocalGain (UpdateTraxLocalGain on every game volume/mute change + on load) so the creator HEARS the controls work on the music in the headphones. (3) TRAX played once then stopped — OnPlaybackStopped only looped on Position>=Length (unreliable for MediaFoundationReader); now any clean stop rewinds + replays, errors/explicit stops surface via PlaybackEnded; unused using dropped. (4+6) TRAX moved right of Socials in the footer's left cluster (centered under scenes/sources); the mic cluster is now MIC + meter + mute + volume. (5) mic source persists — LayoutStore gains a Settings key/value table (SaveMicSourceName/LoadMicSourceName); the VM saves on pick and restores before the mixer's first Start, so a restart reconnects the same vetted device (green) or reports it missing (yellow). (7) Backdrop's missing trashcan shifted the edit/eye icons right — new HiddenBoolToVisibilityConverter keeps the trash column reserved (Hidden, not Collapsed) so every source row's icons stay in fixed columns. (8) a 1px hairline with top/bottom padding separates scenes from sources in the left panel. Docs in the same commit: ai.md (gains honest + drive TRAX locally, TRAX loops, mic persistence, footer layout), TASKS.md TASK 24, HANDOFF.md shipped state, ViewModels/index.md. ONE integration test: AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback (real mixer + provider gains through the pipe harness: scaled loopback audible, silence after mute). Build 0 warnings, 197 tests passing
This commit is contained in:
+52
-33
@@ -5,43 +5,62 @@
|
||||
> a problem. Conventions: [`schema.md`](schema.md). Rewrite this file at session
|
||||
> end, compaction, or any interruption.
|
||||
|
||||
## Session state (last updated: 2026-08-14)
|
||||
## Session state (last updated: 2026-08-15)
|
||||
|
||||
- **Branch:** `main`, tracking `origin/main` at **`f2f6401`** (pushed). Working tree was clean until the
|
||||
monetization docs changeset below.
|
||||
- **AUDIO MILESTONE (TASK 9) — SHIPPED + COMMITTED + PUSHED this session.** Real stream audio + voice
|
||||
filters + auto-duck + free TRAX background music. Build **0 warnings**, full suite **196 passing**
|
||||
(ONE integration test: `AudioPipelineTests.Mix_WithFiltersDuckAndGain_Lands_On_AudioPipe`). Commits
|
||||
**`6d71ace`** (milestone) + **`f2f6401`** (secrets cleanup), force-pushed (`725f5a7...f2f6401`).
|
||||
- **Secrets scrubbed from git history.** The DO token + passwords recorded in `HANDOFF.md` were removed
|
||||
from the working file and **purged from all history** via `git filter-branch` over `3d92bd0..main`
|
||||
+ `git gc --prune=now --aggressive` (scan of all refs = 0 hits). They still exist in chat — **keep
|
||||
treating as compromised**; rotate the DO API token. Old objects remain in llgit's store until server
|
||||
GC (unreachable, not fetchable). If a value is ever needed, `git reflog` is expired — it's gone.
|
||||
- **MONETIZATION LOCKED (2026-08-14, creator).** One paid line = **annual subscription**: early access
|
||||
**$49.99/yr** → **$99/yr list at GA**, **grandfather-while-subscribed**, lapse → list on renewal.
|
||||
Free tier unchanged (branding flash = the billboard + no Alerts; Alerts is the paid feature).
|
||||
**Billing NOT itch-locked** — itch.io has no native subscription billing; candidates Gumroad (native
|
||||
affiliates = tiebreaker) / Lemon Squeezy. Support = in-app bug-report → git issues, "when I get
|
||||
around to it" + emergency patches. Full policy in `ai.md` → Monetization; scoped plan + line-items
|
||||
in `TASKS.md` **TASK 23**.
|
||||
- **DEVELOPMENT PAUSED (creator's call 2026-08-14) — resuming streaming instead.** Channel revival =
|
||||
**pair-programming dev streams via OBS** (ytLlive can't go live yet: private-only + `_rtmpUrlProvider`
|
||||
null) + **The Division 2** gaming streams under the **"gramps/GOAT"** persona (67, gaming since 1981).
|
||||
3D-printing content retired (printer hard down, novelty gone). **Dogfood switch** later: when TASK 5 +
|
||||
go-live capability land, stream *with* ytLlive — Division 2 (loud game + voice) is the demo for the
|
||||
ducking/voice-filter story. Early-access strategy + affiliate/ads are their own future line-item tasks.
|
||||
- **Docs changeset in flight (THIS changeset):** `ai.md` Monetization rewritten + stale paid-unlock seams
|
||||
fixed; `TASKS.md` TASK 23 added + TASK 21's itch.io URL mention corrected; this file rewritten. Commit
|
||||
+ push as one change.
|
||||
- **Shipped, all pushed:** TASK 21 (creator-hub About, `3d92bd0`), TASK 8 (meter +10 dB), TASK 4 ship
|
||||
step 7 (one-click go-live + private-only), TASK 9 audio milestone (`6d71ace`), secrets cleanup
|
||||
(`f2f6401`).
|
||||
- **Resume point (when dev starts again):** **TASK 5** — reusable stream → `_rtmpUrlProvider` (the last
|
||||
blocker before go-live actually encodes + pushes). Then TASK 23 (billing + unlock + support).
|
||||
- **Branch:** `main`, tracking `origin/main`. Working tree: the **TASK 24 polish batch** below is
|
||||
committed + pushed. Local branches `social-bar`/`webcam-validation` untouched (no secrets).
|
||||
- **TASK 24 — POST-PAUSE POLISH BATCH — SHIPPED + COMMITTED + PUSHED 2026-08-15.** All 8 creator
|
||||
review issues fixed in one branch (details below). Build **0 warnings**, full suite **197 passing**
|
||||
(ONE integration test for this branch: `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback`).
|
||||
- **AUDIO MILESTONE (TASK 9) — SHIPPED + COMMITTED + PUSHED.** Real stream audio + voice filters +
|
||||
auto-duck + free TRAX background music. Commits `6d71ace` (milestone) + `f2f6401` (secrets cleanup),
|
||||
force-pushed (`725f5a7...f2f6401`).
|
||||
- **MONETIZATION LOCKED (2026-08-14, creator) — committed `86fcd86`.** One paid line = **annual
|
||||
subscription**: early access **$49.99/yr** → **$99/yr list at GA**, **grandfather-while-subscribed**,
|
||||
lapse → list on renewal. Free tier unchanged (branding flash = the billboard + no Alerts; Alerts is
|
||||
the paid feature). **Billing NOT itch-locked**; candidates Gumroad (native affiliates =
|
||||
tiebreaker) / Lemon Squeezy. Support = in-app bug-report → git issues. Full policy in `ai.md` →
|
||||
Monetization; scoped plan in `TASKS.md` **TASK 23**.
|
||||
- **Secrets scrubbed from git history.** The DO token + passwords were purged via `git filter-branch`
|
||||
+ `git gc --prune=now --aggressive` (all-refs scan = 0 hits); values still exist in chat — keep
|
||||
treating as **compromised**; rotate the DO API token.
|
||||
- **Shipped, all pushed:** TASK 24 polish batch, TASK 21 (creator-hub About, `3d92bd0`), TASK 8
|
||||
(meter +10 dB), TASK 4 ship step 7 (one-click go-live + private-only), TASK 9 audio milestone
|
||||
(`6d71ace`), secrets cleanup (`f2f6401`), monetization docs (`86fcd86`).
|
||||
- **Resume point (next branch):** **TASK 5** — reusable stream → `_rtmpUrlProvider` (the last blocker
|
||||
before go-live actually encodes + pushes). Then TASK 23 (billing + unlock + support).
|
||||
Optional, not queued: rewriting the healed entry's `ProfileUrl` to
|
||||
`https://mastodon.llamachile.tube/@gramps` (user must say the word).
|
||||
|
||||
## TASK 24 — the 8-issue polish batch — SHIPPED 2026-08-15 (what changed)
|
||||
|
||||
The creator's review of the TASK 9 build, all fixed in one branch (full record in `TASKS.md` TASK 24).
|
||||
|
||||
1. ✅ **Desktop/game audio volume slider had no effect** — the `AudioMixer` gain seams defaulted to
|
||||
unity (the VM never passed them): the slider/mute were decorative, stream AND local. Fixed with a
|
||||
new **`AudioGainProvider`** (`Services/Audio/`) wired into the mixer at construction, read live
|
||||
each mix tick.
|
||||
2. ✅ **Desktop/game mute had no effect** — same wiring; `GameMuted` now zeroes the loopback on the
|
||||
stream AND silences the music locally via new `MusicPlayer.LocalGain` (scaled by the game bar on
|
||||
every volume/mute change + on TRAX load) — the creator hears the control work in the headphones.
|
||||
3. ✅ **TRAX played once then stopped** — `OnPlaybackStopped` only looped when `Position >= Length`
|
||||
(unreliable for `MediaFoundationReader`); now any clean stop rewinds + replays. Dropped the unused
|
||||
`using System.Runtime.InteropServices;` too.
|
||||
4. ✅ **TRAX/MIC buttons swapped** — footer mic cluster is now MIC + meter + mute + volume (TRAX is out
|
||||
of the mic cluster entirely).
|
||||
5. ✅ **Mic source persists across restarts** — `LayoutStore` gained a `Settings` key/value table
|
||||
(`SaveMicSourceName`/`LoadMicSourceName`); the VM saves on pick and restores before the mixer's
|
||||
first `Start` → same already-vetted device reconnects green on restart, missing → yellow.
|
||||
6. ✅ **TRAX moved right of Socials** — both centered under the scenes/sources listboxes (footer line
|
||||
1, left cluster).
|
||||
7. ✅ **Backdrop icons shifted right** — new `HiddenBoolToVisibilityConverter` keeps the trash column
|
||||
reserved (`Hidden`, not `Collapsed`) so edit/eye stay in fixed columns for every source row.
|
||||
8. ✅ **No separation between scenes and sources** — a 1px hairline with top/bottom padding now sits
|
||||
between the two left-panel listboxes.
|
||||
|
||||
**THE ONE integration test:** `Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` — real mixer +
|
||||
`AudioGainProvider` gains through the pipe harness: scaled loopback audible at 0.5, silence after mute.
|
||||
|
||||
## TASK 9 audio milestone — SHIPPED 2026-08-14 (what changed)
|
||||
|
||||
The creator's feature review settled this as the single next branch ("all the audio issues done and
|
||||
|
||||
Reference in New Issue
Block a user