import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:livekit_client/livekit_client.dart' as lk; import 'package:matrix/matrix.dart' hide Room; import 'package:pyramid/features/voice_channel/livekit_call_manager.dart'; /// Öffentliche Schnittstelle des Moduls `voice_channel` – LiveKit-SFU-basierte, /// dauerhafte Voice-Channels (Discord-artig: Presence über Matrix-State-Events, /// Screensharing, Mehrpersonen). Schnitt nach `docs/M2_MODULE_SCHNITT.md`; /// bewusst GETRENNT vom 1:1-Modul `call_signaling`, siehe dort. /// /// Andere Module konsumieren ausschließlich diese Schnittstelle über /// [voiceChannelProvider] – nie `livekit_call_manager.dart` direkt. /// /// Bewusste Abweichungen vom Entwurf im Doc (Verhaltensgleichheit vor /// Schönheit): ChangeNotifier statt `stateStream`, Methodennamen wie im /// Bestand (`startCall`/`hangUp` statt `join`/`leave`), und [room] bleibt /// als LiveKit-Typ sichtbar, weil die Teilnehmer-Kacheln der UI direkt /// LiveKit-Tracks rendern (analog zu den WebRTC-Renderern im Signaling). abstract class VoiceChannelService extends ChangeNotifier { bool get isActive; bool get isConnecting; String? get error; bool get isMuted; bool get isCameraOff; bool get isScreenSharing; bool get isDeafened; bool get isVoiceChannel; /// Der verbundene LiveKit-Raum (null = nicht verbunden). lk.Room? get room; /// Matrix-Raum-ID des aktiven Voice-Channels. String? get currentRoomId; String get displayName; /// Sende-Qualität ('sd' | 'hd' | 'fhd' | '4k'). String get currentQualityKey; /// Empfangs-Qualität ('auto' | 'low' | 'medium' | 'high'). String get subscribeQualityKey; Future startCall({ required String roomName, required String roomDisplayName, required String identity, bool audioOnly, bool voiceChannel, Client? matrixClient, String? matrixRoomId, }); Future hangUp(); Future toggleMute(); Future toggleDeafen(); Future toggleCamera(); Future toggleScreenShare(); Future startScreenShare(String sourceId); Future stopScreenShare(); Future changeQuality(String qualityKey); Future setSubscribeQuality(String key); /// Live-Anwendung des Lautstärke-Sliders auf alle Remote-Audio-Tracks. Future setOutputVolume(double v); Future changeAudioInput(String deviceId); void setRemoteVolume(double volume); } /// Einziger Zugriffsweg der UI auf das Voice-Channel-Modul. final voiceChannelProvider = ChangeNotifierProvider((ref) { return LiveKitCallManager.instance; });