ffd70caffd
Nach docs/STREAMING_60FPS.md: neue Presets 720p/1080p mit 60 FPS und hoher Bitrate (5/8 Mbit/s), Preset-Aufloesung+FPS werden jetzt bis in die Capture-Constraints durchgereicht (vorher blieb der LiveKit-Default 1080p/15 aktiv), 60-FPS-Presets publishen ohne Simulcast mit DegradationPreference.maintainFramerate (unter Last Aufloesung statt Frames opfern). contentHint 'motion' ist in flutter_webrtc 1.4.1 aus Dart nicht setzbar (geprueft) - im Code dokumentiert. 4 neue Vertragstests fuer die Preset-Tabellen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76 lines
2.7 KiB
Dart
76 lines
2.7 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' | 'hd60' | 'fhd' | 'fhd60' | '4k').
|
||
/// Die *60-Presets sind für flüssiges Bildschirm-Streaming (M4).
|
||
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;
|
||
});
|