Files
ytLlive/HANDOFF.md
T

4.8 KiB
Raw Blame History

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):

    1. 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 (mic MeterLevel, game GameMeterLevel) now scale the raw level through it before multiplying by volume. +2 unit tests.
    2. 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 the PreviewGrid next to the OpacityChip). Monitoring UI only — never rendered into the live output (the SceneCompositor is unaware of it).
    3. About button (user: stop jacking Notepad; standalone app): the top-bar About button that opened THIRD-PARTY-NOTICES.txt in the OS viewer is GONE (button + AboutButton_Click removed). 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).
  • 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 new ToDisplay tests), 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.SetTop on the social bar — a local value permanently overrides {Binding SocialBarTop} (the ClearValue lesson from 5.5).
    • AudioMixer meter Push is unconditional by design now: OnMicSample/ OnLoopbackSample compute the level first, then raise the event — a ?.Invoke(meter.Push(...)) short-circuit skipped the meter update when nothing was subscribed (found by RestartMic_ResetsLevel, fixed).
    • MicConnected comes from the source Started event, raised right after StartRecording() succeeds — tests must MarkStarted() 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; OnGameAudioPollTick wraps Poll() 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.
    • StopAsync must 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 MainViewModel directly except the round-clip integration test (a real MainWindow), which never goes live — keep it that way.
    • Sandbox can't reach outbound HTTPS — HttpSocialValidator stub-handler tests only, never the real instance.
  • 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's ProfileUrl to https://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 in Helpers/TokenStore.cs (DPAPI → %APPDATA%\ytLlive\ytLlive.auth); layout DB %APPDATA%\ytLlive\ytLlive.db (schema v8; SocialEntry.Software column is a column-presence migration like the others, no version bump); OAuth callback http://localhost:8765/oauth2/callback; crash log %APPDATA%\ytLlive\startup.log.