70 lines
4.8 KiB
Markdown
70 lines
4.8 KiB
Markdown
# 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`](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`.
|