feat: Windows-Audiogeraete-Erkennung reparieren - Dummy-PeerConnection weckt das Audio-Device-Modul (M3)

This commit is contained in:
Bernd Steckmeister
2026-07-07 06:22:28 +02:00
parent e0179ad907
commit bf552ee194
2 changed files with 92 additions and 6 deletions
+24 -6
View File
@@ -35,12 +35,30 @@ class _VoiceSectionState extends ConsumerState<_VoiceSection> {
} catch (_) {
devices = [];
}
// Windows (und teils Android) liefert eine LEERE Liste ohne Fehler,
// solange in diesem Prozess noch nie ein Media-Stream geöffnet wurde.
// Deshalb nicht nur bei Exception, sondern auch bei leerer Liste einmal
// kurz getUserMedia anfordern und erneut enumerieren — und zwar SOLANGE
// der Stream noch offen ist (nach stop() melden manche Systeme wieder 0).
final hasAudioInput =
// Windows: die Geräteliste kommt aus dem Audio-Device-Module der
// libwebrtc.dll, und das wird erst initialisiert, wenn irgendeine
// PeerConnection existiert (webrtc-sdk/libwebrtc Issue #141, Fix #142
// noch in keinem Binary-Release Diagnose siehe tool/device_probe.dart).
// Ohne laufenden Call ist die Liste deshalb IMMER leer. Workaround:
// kurz eine Dummy-PeerConnection anlegen (kein Mikrofonzugriff nötig),
// enumerieren, wieder schließen.
var hasAudioInput =
devices.any((d) => d.kind?.toLowerCase() == 'audioinput');
if (devices.isEmpty || !hasAudioInput) {
RTCPeerConnection? admWakeup;
try {
admWakeup = await createPeerConnection({});
devices = await navigator.mediaDevices.enumerateDevices();
} catch (_) {
// Fallback unten übernimmt.
} finally {
await admWakeup?.close();
}
}
// Zweite Stufe (andere Systeme, z. B. teils Android): einmal kurz
// getUserMedia anfordern und erneut enumerieren, SOLANGE der Stream
// offen ist (nach stop() melden manche Systeme wieder 0).
hasAudioInput =
devices.any((d) => d.kind?.toLowerCase() == 'audioinput');
if (devices.isEmpty || !hasAudioInput) {
try {