3c7eb9ddca
- CallSignalingService/callSignalingProvider und VoiceChannelService/ voiceChannelProvider als einzige oeffentliche Schnittstellen - voip_manager.dart / livekit_call_manager.dart in ihre Module verschoben, Logik unangetastet (nur Klassen-Koepfe, @override, Imports, Provider-Namen) - Alle Konsumenten entkoppelt; Kompositions-Punkt matrix_client.dart als dokumentierte Ausnahme. analyze sauber, 29 Tests gruen, Windows-Start ok. Call-Klick-/Geraetetest steht aus (PROGRESS.md)
75 lines
2.6 KiB
Dart
75 lines
2.6 KiB
Dart
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<void> startCall({
|
||
required String roomName,
|
||
required String roomDisplayName,
|
||
required String identity,
|
||
bool audioOnly,
|
||
bool voiceChannel,
|
||
Client? matrixClient,
|
||
String? matrixRoomId,
|
||
});
|
||
Future<void> hangUp();
|
||
|
||
Future<void> toggleMute();
|
||
Future<void> toggleDeafen();
|
||
Future<void> toggleCamera();
|
||
Future<void> toggleScreenShare();
|
||
Future<void> startScreenShare(String sourceId);
|
||
Future<void> stopScreenShare();
|
||
|
||
Future<void> changeQuality(String qualityKey);
|
||
Future<void> setSubscribeQuality(String key);
|
||
|
||
/// Live-Anwendung des Lautstärke-Sliders auf alle Remote-Audio-Tracks.
|
||
Future<void> setOutputVolume(double v);
|
||
Future<void> changeAudioInput(String deviceId);
|
||
void setRemoteVolume(double volume);
|
||
}
|
||
|
||
/// Einziger Zugriffsweg der UI auf das Voice-Channel-Modul.
|
||
final voiceChannelProvider =
|
||
ChangeNotifierProvider<VoiceChannelService>((ref) {
|
||
return LiveKitCallManager.instance;
|
||
});
|