Commit Graph

  • d90b5ded0d TASK 7 UI polish batch: scene/source row cleanup, dedup naming, full social handles — scenes are now pure selection rows (edit/trash/visibility icons and inline rename removed with EditSceneCommand/RemoveSceneCommand/ToggleSceneVisibilityCommand + Scene.IsEditing); source rows gained the trio (new EditElementCommand → inline rename via SceneElement.IsEditing, ToggleElementVisibilityCommand → eye flips IsVisible, open/slashed style rebound, hidden rows dim to 45%); duplicate resource names get a no-space incrementing suffix via shared NextSourceName (Image, Image2, Image3…) derived from actual names so deletions never collide (AddSource + AddReusedImage); social bar renders the full validated handle (MaxWidth=200 + TextTrimming removed from SocialBarRenderer and the preview template); side panels stay fixed 220/300; focus-loss capture lag documented in ai.md as a known OS limit (deferred) — the two real-App tests now share RealAppHost, a dedicated STA thread owning the single WPF App, instead of each calling new App(); new SourceNamingTests integration test (Text/Text2/Text3, delete-middle re-add no-collision) — 170 tests passing, 0 warnings main gramps 2026-08-13 18:50:56 -07:00
  • 8292663791 TASK 4 ship step 6: health stats land in the bottom bar — FramePump.HealthUpdated is now wired to the VM (OnFramePumpHealthUpdated marshals onto the UI thread — the encoder's stderr loop raises on a background thread — and copies the parsed bitrate/FPS/dropped/duration into CurrentHealth, the bottom bar's existing binding); ResetHealth zeroes dropped frames + elapsed duration on go-live and on End so stats never linger from a previous session (bitrate/FPS stay on the tier's targets); the bar shows real encoder values once TASK 5 fills _rtmpUrlProvider (until then the pump skips the encoder) — 169 tests passing, 0 warnings gramps 2026-08-13 15:56:29 -07:00
  • dc29adf9bb TASK 4 audio round 3: mic mute icon + top-center REC sign + voice-filter to-do — the mic bar gained a second 16px clickable glyph (microphone, red + slash when muted) between the meter and the speaker so both mute toggles sit adjacent with spacing, reusing the same ToggleMicMuteCommand handler (no VM/code-behind change); the top-center LIVE badge became an always-visible REC sign driven by new VM props (RecDotBrush/RecTextBrush/RecDotOpacity/IsLivePrivate): dark gray dot + dim REC offline, bright red + REC + elapsed while live, darker red when live with a private stream (driven by the dialog's chosen StreamVisibility; the stream service still forces public — ship step 7), pulsing while live; LiveIndicatorVisible/LivePulseOpacity removed; task 22 queued (bass boost, treble, noise suppression, compressor on the mic channel, KISS, always on); HANDOFF documents the mic status contract (red until a mic resource actually connects) — 169 tests passing, 0 warnings gramps 2026-08-13 12:13:00 -07:00
  • 18abe4210f TASK 4 audio fixes round 2: dB-scaled meters, game bar moved into the preview, Notepad About button replaced by the logo → in-app About — AudioLevelMeter.ToDisplay maps -60..0 dBFS onto 0..1 (real speech/game RMS ~0.01..0.1 linear left the flat scale dead; both meters now scale through it before volume); the game audio bar moved OUT of the footer (back to two rows) and is now a bottom-center dark chip overlaid on the preview window — monitoring UI only, never on the live output; the top-bar About button (opened THIRD-PARTY-NOTICES.txt in the OS viewer) removed, the ytLlive wordmark now opens the in-app About overlay, and task 21 queued (real logo + creator-hub About with premium/coffee/socials links + in-app scrolling licensing panel) — 169 tests passing, 0 warnings gramps 2026-08-13 11:56:22 -07:00
  • 9f9ed34627 TASK 4 audio follow-up: game audio bar + mic status dot + always-on capture — the footer's second audio control (desktop/game, a mirror of the mic bar: meter + mute + volume) appears only while a full-screen game is producing sound (IGameAudioDetector seam + GameAudioHysteresis: show ~500ms of fullscreen+sound, hide ~1s after leaving fullscreen, silence never hides an active bar; VM polls on a 250ms timer); capture now runs for the app's lifetime so both meters preview live (started at startup via StartMicCaptureAsync, disposed in Shutdown — no longer go-live driven); MIC label is a button with a status dot (Models/MicStatus: green via the source Started event, yellow = mic problem, red = no device); PickMicrophone swaps the live device immediately via AudioMixer.RestartMic; fixed a latent ?.Invoke(meter.Push(...)) short-circuit that skipped the meter update when nothing subscribed — 167 tests passing, 0 warnings gramps 2026-08-13 11:29:44 -07:00
  • ea250c02a6 Social bar position is a click-toggle, not a drag — the drag-snap misbehaved for shaky hands (snapped up but wouldn't come back down; jitter around the deadzone). Clicking the bar now flips it top/bottom via ToggleSocialBarPosition; SocialBarSnap and its units removed — 153 tests passing, 0 warnings gramps 2026-08-13 11:04:32 -07:00
  • ac60a26d82 TASK 4 ship step 5.5: social bar bug fixes + bar on the live output — direction-snap drag (SocialBarSnap.Decide + ClearValue, local Canvas.Top was overriding the binding), fediverse nodeinfo subdomain probing + load-time heal (settable FediverseSoftware), SocialBarRenderer strip blitted above the flash via a re-read FramePump socialBar seam — 155 tests passing, 0 warnings gramps 2026-08-13 09:29:58 -07:00
  • e72ba71165 TASK 4 ship step 5: live frame pipeline — FramePump paces the active scene's composite into the encoder, ScreenCaptureManager.GetLatestFrame, MainViewModel resolver/option-builder/pump wiring, FramePumpTests (7) + GetLatestFrame test — 147 tests passing, 0 warnings gramps 2026-08-13 08:57:56 -07:00
  • 58c0f8e8c4 TASK 4 ship step 4: WASAPI audio capture — NAudio loopback + mic behind an IAudioSource seam, AudioMixer driving AudioLevel while live, pure level meter + WaveToFloat, NAudio.Wasapi 2.2.1 (MIT, notices item 9) — 139 tests passing, 0 warnings gramps 2026-08-12 21:18:07 -07:00
  • ba427e85e1 TASK 4 ship step 3: encoder + RTMP push — FFmpeg subprocess with probed H.264 picker, BGRA stdin feed, stderr health parsing, graceful stop — 122 tests passing, 0 warnings gramps 2026-08-12 20:32:24 -07:00
  • e494dce311 HANDOFF: next step is TASK 4 ship step 3 — encoder + RTMP push gramps 2026-08-12 18:43:36 -07:00
  • b094755e08 Rule: memory update ships in the SAME commit as the feature — follow-up docs backfill commits are a broken rule gramps 2026-08-12 18:40:18 -07:00
  • 7c456042a6 Docs backfill for social bar v2 (9873eed): schema v6->v8 in TASKS.md/ai.md, social bar architecture section + Simple Icons CC0 notice, README structure rows, HANDOFF rewritten (committed+pushed) gramps 2026-08-12 18:39:08 -07:00
  • 9873eeda7d Social bar v2: fediverse icons resolved via nodeinfo (with redirect-following), persisted software column, icon colors — 112 tests passing, 0 warnings gramps 2026-08-12 18:28:59 -07:00
  • db5fc06174 HANDOFF: social bar UX is wrong — user's correction lost to ctrl+enter, waiting for re-statement gramps 2026-08-12 07:45:22 -07:00
  • 8868f98392 Social bar UX: YT auto-add from connected account, two-box dialog (YT handle + URL/handle for other services), service auto-detection from URL domain, fediverse @user@domain support, footer repositioned (Social controls left under scenes/sources, meter centered under preview), validation with add-anyway fallback gramps 2026-08-12 07:40:42 -07:00
  • 5437c776fe Merge social-bar: global social bar resource with per-scene presence, validated lookups, schema v7 gramps 2026-08-12 07:33:08 -07:00
  • 5e8b8e5835 Social bar (Branch B): global resource with per-scene presence — Models/Socials.cs (19 services, icons, canonical URLs), Services/SocialValidator.cs (HTTP lookup validation seam), LayoutStore schema v7 (Socials + SocialEntry tables + Scene.HasSocialBar), MainViewModel (socials collection, AddSocial/RemoveSocial/ToggleSceneSocialBar commands, freemium cap YT+1, premium seam), MainWindow.xaml (footer Social button + [+/-] toggle on meter line, preview bar rendering top/bottom + LCR), 4 integration tests (roundtrip, empty-not-persisted, canonical URLs, icons), 85 tests passing, 0 warnings gramps 2026-08-12 07:33:03 -07:00
  • e1d9e1388d Merge webcam-validation: resource validation + first-frame proof + CameraConflictProbe gramps 2026-08-12 07:21:20 -07:00
  • 3f7f1880c5 Webcam resource validation + first-frame proof + CameraConflictProbe: MediaCaptureFrameSource validates post-init (VideoDeviceId match, stream properties, reader StartAsync status), subscribes Failed/CameraStreamStateChanged → SourceFailed; CameraManager.AcquireAsync requires first-frame proof (4s timeout) — silent empty box impossible; MainViewModel surfaces WebcamError chip + MessageBox with suspect-app names; fallback ladder VideoPreview → VideoRecord; 19041 SDK projection gaps documented; AGENTS.md + schema.md + HANDOFF.md memory-map rules added; 81 tests passing, 0 warnings gramps 2026-08-12 07:21:15 -07:00
  • 60259c08c2 Fix CameraStreamState.Failed compile error (19041 projection omits enum member names — compare by int); fix first-frame proof test (no dispatcher = no bitmap, assert LatestFrame instead) gramps 2026-08-12 07:11:54 -07:00
  • cc3b1c9234 TASKS.md reformat: task-list statuses under every task + all lists numbered gramps 2026-08-10 11:18:37 -07:00
  • 8c7938aca0 FFmpeg locator (TASK 4 ship step 2) + licensing: notices, About, LGPL-shared pin gramps 2026-08-10 11:02:26 -07:00
  • 18a21010bb Scene compositor (TASK 4 ship step 1): encoder master-frame scaffolding gramps 2026-08-10 10:15:58 -07:00
  • b00a4cbd5e Mic audio UX: realtime read-only meter + mic picker gramps 2026-08-07 17:44:16 -07:00
  • 4b3fb04322 Audio UX (UI) + bottom bar rework: two-line footer (dropped/duration under bitrate/fps), centered sound meter (blank→green→yellow→red, zone markers at 60%/80%) + MIC chip (MicVolume slider, ToggleMicMuteCommand) — the mic is the creator's only audio control, desktop/game audio is automatic (KISS rule); scenes list is content-height (no dead space before SOURCES); top bar shows the connected YT account avatar/name via SyncConnectedAccount; docs updated (65 tests passing) gramps 2026-08-07 15:20:48 -07:00
  • 4d10b23714 TASKS: backlog adds v0.5 — stream clipping gramps 2026-08-07 14:35:42 -07:00
  • 3c32c8c105 README: add Screenshot section with app preview (docs/ytLlive-preview.png) gramps 2026-08-07 14:30:09 -07:00
  • d5f50edf23 Kill stringly-typed command tokens: Add Source menu passes SourceType enum via x:Static CommandParameter (typos break the build, not silently add an Image); webcam gets its own AddWebcamCommand; AddSource keeps Enum.TryParse fallback; docs updated (65 tests passing) gramps 2026-08-07 14:22:12 -07:00
  • ad9b3e1e48 Screen backdrop (schema v5/v6) + five-scene catalog + webcam polish: live desktop/game capture as a permanent non-deletable bottom layer (Source.IsBackdrop), auto full-screen game detection (Win32FullScreenDetector) else primary display, GraphicsCapturePicker re-designation, refcounted shared ScreenCaptureManager, Live-only backdrop by policy (HasBackdrop + v5-v6 backfill + EnforceBackdropPolicy, checkbox gone), SceneCatalog (Starting/Live/BRB/Chat/Ending) with + button re-adding missing scenes, webcam mid-session transparent-container fix (GetPreviewBitmap propagation), Chat half-screen-area cap, 'Add Webcam' always opens the picker (SwapWebcamIdentityAsync, no silent resurrect), WindowsRuntimeMarshal frame-read + 5s-throttled errors, docs updated, tests (65 passing) gramps 2026-08-07 14:15:50 -07:00
  • e037ba027b Multi-scene webcam (schema v3/v4): singleton Webcam + per-scene WebcamSceneConfig, right-click OBS-style border/context menu, persisted round-to-rect restore + legacy-square 16:9 heal, dark MenuItem template, tests (25 passing) gramps 2026-08-07 08:24:18 -07:00
  • f31ce9fdb7 Hermetic real-MainWindow tests: LayoutPathOverride temp-DB seam (InternalsVisibleTo); fix tests persisting fake webcam sources over the real layout DB; LayoutStore delete-roundtrip guard gramps 2026-08-06 15:16:58 -07:00
  • 7bc70872d9 Round clip: true circle (Viewbox/1x1 ellipse) + grabbable corner handle (transparent source grid, non-hit-testable selection overlay); resize locks square in round mode gramps 2026-08-06 15:05:21 -07:00
  • b64830ed11 Webcam grab: SharedReadOnly mode, VideoPreview/VideoRecord source fallback, name the blocking app in the error (NVIDIA Broadcast finding) gramps 2026-08-06 14:42:54 -07:00
  • 98cdc4b3f4 TASK 3 milestone 1: webcam capture (MediaCapture CPU-first, CameraManager refcount, picker, clip/mirror, schema v2, tests) gramps 2026-08-06 14:35:34 -07:00
  • d97b5d375c End Livestream completes the session: StopStream clears the OAuth session and DPAPI token (crash-safe sign-out) gramps 2026-08-06 11:50:50 -07:00
  • 4afe11e718 OAuth session persists via DPAPI; sign-in lives in the Start Stream dialog; add xUnit test project (6 passing) gramps 2026-08-06 09:38:35 -07:00
  • 8f0ecd3796 Resolution dropdown drives the output frame: vertical 9:16 tier with semi-crop preview over the fixed 1920x1080 master gramps 2026-08-06 09:20:32 -07:00
  • 4bf4a13299 Add Good Dog Rule to AGENTS.md: one integration test per branch, one test per PR gramps 2026-08-06 09:06:42 -07:00
  • 4ef11ef5ac Branding flash monetization: full-frame 'made with ytLlive!' every 300s replaces the always-on watermark gramps 2026-08-06 09:04:20 -07:00
  • 3a2c87f518 Add AGENTS.md on-ramp, response-style rules, and optional No-Fluff Mode gramps 2026-08-06 08:43:01 -07:00
  • a74162e34e Resolution dropdown, list-focus preservation, unified dark theme, startup logging, and memory map gramps 2026-08-06 08:33:05 -07:00
  • 7dc8490d96 Scene/source builder with image overlays, reuse dialog, and SQLite layout persistence gramps 2026-08-04 17:12:32 -07:00
  • d6ae048583 Two-state flow with go-live dialog, unmissable live indicators, taskbar overlay gramps 2026-08-04 10:54:21 -07:00
  • aae17a1511 Go Live gated on auth; scene building stays auth-free; update design docs gramps 2026-08-04 10:40:51 -07:00
  • 3caccfff1f Go Live no longer requires YouTube connection; auth stays optional enhancement gramps 2026-08-04 10:39:17 -07:00
  • 4caf7eec8d Three explicit buttons: Connect / Go Live / End Stream, shown per state gramps 2026-08-04 10:37:38 -07:00
  • 639e1bb323 Remove redundant OFFLINE/LIVE status pill; single button conveys state gramps 2026-08-04 10:36:37 -07:00
  • 4293ae11a4 Replace three-button cluster with a single context-aware primary button gramps 2026-08-04 10:35:00 -07:00
  • 8ee44f571e UI polish: YouTube status light, Go Live/Stop Stream buttons with working visibility gramps 2026-08-04 10:32:04 -07:00
  • d4945f4fd0 Make YouTube auth optional and non-blocking; manual stream key is baseline go-live path gramps 2026-08-04 10:28:01 -07:00
  • 8aebbff318 Add README with design principle, TASKS.md roadmap, and ai.md agent guide gramps 2026-08-04 10:24:20 -07:00
  • b3c81f0af8 Silence CS1998 warning in StartStream stub gramps 2026-08-04 09:16:54 -07:00
  • 84599303fc Fix HttpUtility reference in auth URL builder gramps 2026-08-04 09:14:11 -07:00
  • 29c33012c1 Add .gitignore gramps 2026-08-04 09:10:07 -07:00
  • 9103ff1fb7 Initial scaffold: ytLive C# WPF project gramps 2026-08-04 09:09:52 -07:00