feat: Call-Robustheit + Standalone-Voice-Channel per Klick beitretbar (M3)

Mit zwei echten Test-Accounts (zwei GUI-Instanzen via PYRAMID_PROFILE_DIR)
durchgeklickt: Beitreten, Teilnehmerliste, bidirektionaler Screenshare,
Live-Qualitaetswechsel (Full HD 60fps), sauberes Verlassen.

- rooms_list.dart: Voice-Channel in der normalen Raumliste war per Klick
  nicht beitretbar (oeffnete nur Chat) -> _toggleVoiceChannel wie Space-Liste.
- livekit_call_manager.dart: _callGeneration entwertet laufenden connect
  bei Auflegen/Wechsel (keine Geisterverbindung mit offenem Mikro);
  Fehlerpfade setzen error sichtbar statt still zu verschwinden.
- rooms_panel_core.dart: raeumt activeVoiceRoomIdProvider auf, wenn der
  Voice-Service inaktiv wird, + Fehler-SnackBar.
- test/live_call_setup_test.dart: gegateter Setup-Helfer fuer den Testraum.

UNGETESTET: echtes 2-Peer-Audio, Netz-Abbruch mitten im Call.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernd Steckmeister
2026-07-06 22:50:58 +02:00
parent ffd70caffd
commit f8f5332d90
7 changed files with 407 additions and 10 deletions
+76
View File
@@ -13,6 +13,82 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
---
## 2026-07-06 Nacht-Session (C+B): 60-FPS-Streaming + Call mit ZWEI echten Test-Accounts real durchgeklickt
**Erledigt:** Fokus (C) Streaming und (B) Calls beides mit zwei echten
Test-Logins (pyramidtest1 GUI-Fenster links, pyramidtest2 rechts, zwei
getrennte Profile über `PYRAMID_PROFILE_DIR`) am laufenden Windows-Build
verifiziert, nicht nur analysiert.
**(C) 60-FPS-Streaming (`docs/STREAMING_60FPS.md`, Commit ffd70ca):**
- Neue Presets `hd60` (720p·60, 5 Mbit/s) und `fhd60` (1080p·60, 8 Mbit/s)
in `qualityPresets` + `screenShareEncodings`; im SENDEN-Menü als
„HD 60fps"/„Full HD 60fps" ergänzt. Preset-Auflösung UND -FPS werden
jetzt bis in `ScreenShareCaptureOptions.params` durchgereicht (vorher
blieb der LiveKit-Default 1080p/15 aktiv, egal welches Preset). 60-FPS-
Modi publishen ohne Simulcast mit
`DegradationPreference.maintainFramerate` (unter Last Auflösung statt
Frames opfern). `contentHint='motion'` ist in flutter_webrtc 1.4.1 aus
Dart NICHT setzbar (Pub-Cache geprüft) im Code ehrlich dokumentiert.
4 Vertragstests für die Preset-Tabellen (grün).
- **Real getestet:** pyramidtest1 teilt Bildschirm → pyramidtest2 sieht den
Stream (und umgekehrt, beide Richtungen). Über das SENDEN-Menü live auf
„Full HD 60fps" umgeschaltet: Screenshare-Track wird mit dem neuen
Encoding neu published, kein Absturz, Empfänger bekommt weiter Bild.
- **UNGETESTET (ehrlich):** subjektives „flüssiges 60-FPS-Gefühl"
Sender und Empfänger liefen auf DEMSELBEN PC (Selbst-Streaming =
Hall-of-Mirrors), das taugt nicht zur Ruckel-Beurteilung. Ob
`sender.parameters.encodings` real `maxFramerate==60` trägt, ist nur am
Preset-Vertrag belegt, nicht am Live-RTP-Report. Braucht zwei echte
Geräte + Netz.
**(B) Call-Robustheit (Commit siehe git log):**
- **Bug gefunden + gefixt:** Standalone-Voice-Channels (nicht in einem
Space, sondern in der normalen Raumliste) waren per Klick GAR NICHT
beitretbar `rooms_list.dart` öffnete für sie nur die Chat-Ansicht.
Jetzt tritt ein Klick dem Kanal bei/verlässt ihn (Toggle), exakt wie in
der Space-Liste (`_toggleVoiceChannel`). Real verifiziert: beide
Test-User beigetreten, Teilnehmerliste zeigt beide, Zähler „2".
- **Zustands-Härtung `livekit_call_manager.dart`:** (1) `_callGeneration`
entwertet einen noch laufenden `connect`, wenn zwischendurch aufgelegt/
gewechselt wird vorher konnte eine Geisterverbindung mit offenem Mikro
im alten Kanal zurückbleiben, während die UI „nicht verbunden" zeigte.
(2) Fehlerpfade setzen `error` sichtbar (unerwarteter
`RoomDisconnectedEvent` mit Grund, fehlgeschlagener Beitritt) statt
still aus dem Kanal zu verschwinden CLAUDE.md „keine stillen
Fehlerpfade". (3) `rooms_panel_core.dart` hört auf den Voice-Service und
räumt `activeVoiceRoomIdProvider` auf, sobald der Service inaktiv wird
(Kanal-Highlight/eigener Teilnehmer-Eintrag blieben sonst hängen),
und zeigt den Fehler als SnackBar.
- **Real getestet:** Beitreten (beide), Teilnehmerliste, Screenshare
bidirektional, Qualitätswechsel live, sauberes Verlassen (pyramidtest1
legt auf → bei test1 Voice-Widget weg + Kanal nicht mehr aktiv, bei
test2 Teilnehmerzähler auf 1, test1-Stream verschwunden).
- **Setup-Helfer `test/live_call_setup_test.dart`** (gegated wie die
Encryption-Tests): legt den Voice-Testraum an und bringt beide Test-User
rein, damit die zwei GUI-Instanzen sofort joinen können.
- **UNGETESTET (ehrlich):** echtes 2-Peer-AUDIO (beide auf einem PC =
Rückkopplung, nicht sinnvoll prüfbar). VerbindungsABBRUCH mitten im Call
(Netz weg → `RoomDisconnectedEvent`-Pfad mit meiner Fehlermeldung) nur
im Code abgesichert, nicht live simuliert braucht kontrollierten
Netzausfall. M3-Punkt „Voice-Channel-Logik robust" daher nur annotiert,
nicht abgehakt.
**Offen/Nächster Schritt:** auth_log-Check des Beobachtungslaufs (Bernds
echtes Profil neu gestartet 22:49:22 `loggedIn`, keine Re-Migration)
Einträge seit 2026-07-06 22:49 prüfen. Für Bernd: 60-FPS-Streaming auf zwei
ECHTEN Geräten übers Netz gegentesten (Ruckeln?), echtes 2-Peer-Audio.
**Stolperfallen:** (1) `PYRAMID_PROFILE_DIR` leitet DB/Media um, aber NICHT
flutter_secure_storage zwei Profile teilen sich denselben
`db_cipher_key`. Für reine Login-Tests unkritisch (Schlüssel wird nur
gelesen). (2) Der SENDEN-Qualitäts-Zahnrad taucht erst beim Hovern über den
Hero-Videobereich auf (Bottom-Bar slidet ein). (3) Eine per
`flutter build` neu gebaute exe lässt sich nicht überschreiben, solange die
Beobachtungs-exe läuft vorher beenden.
---
## 2026-07-06 Nacht-Session (A): SQLCipher mit ECHTEM Login live verifiziert (Test-Account, 2 neue E2E-Tests grün)
**Erledigt:** Bernds Fokus (A) für die Nacht die Verschlüsselung nicht nur