Bernds Test 2026-10-08 (Streamen ging weder am PC noch am Handy, Ton kam nicht an, Trenner blieb manchmal stehen) – mit neuem Live-Anruftest (zwei Testkonten im selben Prozess) nachgestellt und behoben: - Bildschirm teilen: Die Stromzuordnung rief ein SDK-getFeeds() auf, das es nicht gibt; der Fehler wurde geschluckt → Übertragungen wurden nie angezeigt und beim Sender nie als aktiv erkannt. Jetzt typisierte Zugriffe (remote/localScreenSharingStream, 'stopped' beachtet). - Verbindungsaufbau: matrix-SDK verwirft Kandidaten, die vor der fertig verarbeiteten Einladung bzw. während des Annehmens eintreffen; unter Windows wirft getRemoteDescription zudem statt null zu liefern. Pyramid puffert alle Kandidaten der Gegenseite und reicht sie direkt an die Verbindung nach. Test: vorher nie verbunden, jetzt ~0,5 s (angerufen) bzw. ~2,7 s (anrufend), Ton beide Richtungen, Teilen beide Richtungen. - SDK-Aufrufe in eigener Zone: harmlose Plugin-Fehler (Lautsprecher unter Windows) werden protokolliert statt durchzuschlagen; Ergebnisse/Fehler per Completer über die Zonengrenze (sonst ewiges Warten). - Sprech-Ring auch bei 1:1-Anrufen (Pegel aus WebRTC-Statistiken) – zeigt, ob das eigene Mikrofon Ton liefert und ob die Gegenseite ankommt; großes Bild springt nicht mehr bei jedem Sprechwechsel. - „Neue Nachrichten“ mitten in einer Gruppe (mehrere Nachrichten desselben Absenders) blieb bis zum erneuten Öffnen stehen: Inline-Trenner jetzt nur mit Ungelesenem, blendet aus und trägt den Sprungschlüssel. Live-Test. - „Anruf läuft“-Leiste nicht schon beim Klingeln. Co-Authored-By: Claude Opus 5.5 <[email protected]>
78 lines
3.1 KiB
Dart
78 lines
3.1 KiB
Dart
import 'package:flutter/widgets.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
||
import 'package:matrix/matrix.dart';
|
||
import 'package:pyramid/features/call_signaling/voip_manager.dart';
|
||
|
||
/// Öffentliche Schnittstelle des Moduls `call_signaling` – natives
|
||
/// Matrix-1:1-VoIP (`m.call.*`-Events, direkte WebRTC-Peer-Connection,
|
||
/// kein SFU). Schnitt nach `docs/M2_MODULE_SCHNITT.md`.
|
||
///
|
||
/// Andere Module (UI, Settings, Shell) konsumieren AUSSCHLIESSLICH diese
|
||
/// Schnittstelle über [callSignalingProvider] – nie `voip_manager.dart`
|
||
/// direkt. Einzige Ausnahme ist der Kompositions-Punkt in
|
||
/// `matrix_client.dart`, der die Implementierung konstruiert.
|
||
///
|
||
/// Bewusste Abweichungen vom Entwurf im Doc (Verhaltensgleichheit vor
|
||
/// Schönheit, heiliger Call-Pfad):
|
||
/// * ChangeNotifier statt Streams – die gesamte UI hängt heute an
|
||
/// `ref.watch(...)` mit notifyListeners; ein Stream-Umbau wäre eine
|
||
/// Verhaltensänderung ohne Not.
|
||
/// * [currentCall] bleibt als matrix-SDK-`CallSession` sichtbar (die UI
|
||
/// braucht state/room/answer/reject), ebenso die WebRTC-Renderer –
|
||
/// das Doc sieht Letzteres ausdrücklich vor.
|
||
abstract class CallSignalingService extends ChangeNotifier {
|
||
/// Der laufende 1:1-Call (null = keiner). UI liest state/room und
|
||
/// beantwortet eingehende Calls über [safeAction] + answer()/reject().
|
||
CallSession? get currentCall;
|
||
|
||
rtc.RTCVideoRenderer get localRenderer;
|
||
rtc.RTCVideoRenderer get remoteRenderer;
|
||
|
||
bool get isMicMuted;
|
||
bool get isCameraMuted;
|
||
bool get isScreensharing;
|
||
bool get isRemoteScreensharing;
|
||
bool get isDeafened;
|
||
|
||
/// Sende-Qualität ('sd' | 'hd' | 'fhd' | '4k').
|
||
String get currentQualityKey;
|
||
|
||
Future<void> startCall(String roomId, {bool video});
|
||
Future<void> hangup();
|
||
Future<void> toggleMic();
|
||
Future<void> toggleCamera();
|
||
Future<void> toggleDeafen();
|
||
|
||
/// Auf Windows öffnet ein [context] den Quellen-Picker fürs Screensharing.
|
||
Future<void> toggleScreenSharing([BuildContext? context]);
|
||
|
||
Future<void> changeQuality(String key);
|
||
|
||
/// Spricht gerade jemand? (Pegel aus den WebRTC-Statistiken, für den
|
||
/// grünen Sprech-Ring.)
|
||
bool get isLocalSpeaking => false;
|
||
bool get isRemoteSpeaking => false;
|
||
|
||
/// Handy: Ton über den Lautsprecher (true) oder die Hörmuschel (false).
|
||
/// Auf dem PC ohne Bedeutung.
|
||
bool get isSpeakerOn => true;
|
||
Future<void> toggleSpeaker() async {}
|
||
|
||
/// Wendet die in den Einstellungen gewählte Ausgabelautstärke auf den
|
||
/// Remote-Stream an. Ohne [value] wird der Pref-Wert gelesen.
|
||
Future<void> applyOutputVolume([double? value]);
|
||
|
||
/// Führt eine Call-Aktion (answer/reject/…) fehlertolerant aus und stößt
|
||
/// danach die interne Zustands-/Renderer-Aktualisierung an.
|
||
Future<void> safeAction(Future<dynamic> Function() action);
|
||
}
|
||
|
||
/// Einziger Zugriffsweg der UI auf das 1:1-VoIP-Modul. Die Instanz wird beim
|
||
/// Client-Aufbau in `matrix_client.dart` erzeugt (existiert also, sobald die
|
||
/// eingeloggte Shell steht).
|
||
final callSignalingProvider =
|
||
ChangeNotifierProvider<CallSignalingService>((ref) {
|
||
return PyramidVoipManager.instance;
|
||
});
|