4.8 KiB
HANDOFF — session state
Current operational state, read right after
TASKS.md. Trust this file as the truth of what is in flight — do not re-derive from git/fs unless it points at a problem. Conventions:schema.md. Rewrite this file at session end, compaction, or any interruption.
Session state (last updated: 2026-08-13)
-
Branch:
main. The audio UX follow-up (9f9ed34) is committed and pushed. -
This session (round 2 — the game audio bar + meter fixes):
- Meter scaling: the bars looked dead on a flat scale — real speech/game RMS is
~0.01..0.1 linear, so the fill barely moved even at full volume. Added
AudioLevelMeter.ToDisplay(float): maps −60..0 dBFS linearly onto 0..1. Both meters (micMeterLevel, gameGameMeterLevel) now scale the raw level through it before multiplying by volume. +2 unit tests. - Game bar placement correction (user: it belongs in the preview, not the footer):
moved the game audio bar OUT of the footer (footer back to two rows) and into the
preview window as a bottom-center dark chip overlaid on the live display
(
MainWindow.xaml, in thePreviewGridnext to the OpacityChip). Monitoring UI only — never rendered into the live output (theSceneCompositoris unaware of it). - About button (user: stop jacking Notepad; standalone app): the top-bar About
button that opened
THIRD-PARTY-NOTICES.txtin the OS viewer is GONE (button +AboutButton_Clickremoved). The ytLlive wordmark (top-left) is now clickable and opens the existing in-app About overlay (OpenAboutCommand). Queued as task 21: make a real logo + expand the About overlay into the creator's hub (premium / coffee / socials links + a scrolling licensing/legal panel, all in-app).
- Meter scaling: the bars looked dead on a flat scale — real speech/game RMS is
~0.01..0.1 linear, so the fill barely moved even at full volume. Added
-
Uncommitted: this round-2 work —
Services/Audio/AudioLevelMeter.cs,ViewModels/MainViewModel.cs,MainWindow.xaml(scaling + game bar + logo/About),MainWindow.xaml.cs(AboutButton_Click + unused usings removed),ytLive.Tests/AudioMixerTests.cs(2 newToDisplaytests), memory docs (TASKS.md — incl. new task 21, ai.md, Services/index.md, ViewModels/index.md, HANDOFF, THIRD-PARTY-NOTICES.txt). -
Verified: build 0 warnings, 0 errors; 169 tests passing (full suite).
-
Landmines:
- Never set a local
Canvas.SetTopon the social bar — a local value permanently overrides{Binding SocialBarTop}(theClearValuelesson from 5.5). AudioMixermeterPushis unconditional by design now:OnMicSample/OnLoopbackSamplecompute the level first, then raise the event — a?.Invoke(meter.Push(...))short-circuit skipped the meter update when nothing was subscribed (found byRestartMic_ResetsLevel, fixed).MicConnectedcomes from the sourceStartedevent, raised right afterStartRecording()succeeds — tests mustMarkStarted()the fake source before asserting connection state.- Zero mic devices at startup = red dot AND the mixer is never started, so loopback + the game bar can't run either (no capture at all) — acceptable.
- The game detector is polled on the UI thread via a 250ms
DispatcherTimer;OnGameAudioPollTickwrapsPoll()in try/catch +AppLog. - The pump reads the active scene on a background thread while the UI can still
edit it — a concurrent-mutation exception is contained (logged +
Failed+ the pump stops), not a crash. StopAsyncmust stop the encoder (closes stdin) before awaiting the pump loop — closing stdin unblocks a write stuck on pipe backpressure; the reverse order deadlocks.- Tests never instantiate
MainViewModeldirectly except the round-clip integration test (a realMainWindow), which never goes live — keep it that way. - Sandbox can't reach outbound HTTPS —
HttpSocialValidatorstub-handler tests only, never the real instance.
- Never set a local
-
Next step: commit + push the audio UX follow-up (the whole uncommitted set above in one commit). Then TASK 4 ship step 6 — health stats: bind
FramePump.HealthUpdated(bitrate/FPS/duration) into the bottom bar. Nothing else queued — do not expand the task queue on your own. Optional, not queued: rewriting the healed entry'sProfileUrltohttps://mastodon.llamachile.tube/@gramps(user must say the word). -
Secret/DB/port facts live: OAuth client id/secret in
Helpers/OAuthCredentials.cs; OAuth session token inHelpers/TokenStore.cs(DPAPI →%APPDATA%\ytLlive\ytLlive.auth); layout DB%APPDATA%\ytLlive\ytLlive.db(schema v8;SocialEntry.Softwarecolumn is a column-presence migration like the others, no version bump); OAuth callbackhttp://localhost:8765/oauth2/callback; crash log%APPDATA%\ytLlive\startup.log.