// Diagnose-Sonde für die Windows-Audiogeräte-Erkennung (ROADMAP M3). // // BEFUND (2026-07-07, PC-Diagnose): enumerateDevices()/getSources liefert auf // Windows IMMER eine leere Liste, solange keine RTCPeerConnection existiert. // Ursache: flutter_webrtc holt die Geräteliste über das Audio-Device-Module // der libwebrtc.dll (`GetAudioDevice()`), und dieses ADM bekommt sein Init() // erst, wenn die Voice-Engine anläuft – sprich: wenn irgendeine // PeerConnection existiert. Ohne Init() liefern RecordingDevices()/ // PlayoutDevices() -1 (per Plugin-Instrumentierung verifiziert), die // Geräteliste bleibt leer, obwohl die MMDevice-API des Systems 23 Endpunkte // meldet. Upstream-Fix: webrtc-sdk/libwebrtc #142 (2026-06-24, „fix: audio // devices init issue"), aber noch in KEINEM libwebrtc-Binary-Release // (Stand 2026-07-07: neuestes ist m144.7559.09 vom 2026-06-11) und damit in // keiner flutter_webrtc-Version (geprüft: 1.4.1 und 1.5.2 identisch kaputt). // Workaround in der App: vor dem Enumerieren eine Dummy-PeerConnection // anlegen (siehe settings_voice.dart) – kein getUserMedia/Mikrofonzugriff // nötig. // // Diese Sonde belegt das stufenweise. Lauf: // flutter build windows --release -t tool/device_probe.dart // build\windows\x64\runner\Release\pyramid.exe // Ergebnis landet in %TEMP%\pyramid_device_probe.txt import 'dart:io'; import 'package:flutter/widgets.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; Future main() async { WidgetsFlutterBinding.ensureInitialized(); final out = StringBuffer(); void log(String s) { out.writeln(s); debugPrint('[probe] $s'); } log('device_probe ${DateTime.now().toIso8601String()}'); Future countDevices(String phase) async { try { final devices = await rtc.navigator.mediaDevices.enumerateDevices(); log('$phase: ${devices.length} Geräte'); for (final d in devices.take(30)) { log(' kind=${d.kind} label="${d.label}"'); } return devices.length; } catch (e) { log('$phase: FEHLER $e'); return -1; } } await countDevices('0-kalt'); // Stufe A: nur PeerConnection anlegen – das allein initialisiert das ADM. final pc = await rtc.createPeerConnection({}); await countDevices('A-pc-angelegt'); // Nachkontrolle: nach close() fällt die Liste wieder auf 0 zurück. await pc.close(); await Future.delayed(const Duration(milliseconds: 300)); await countDevices('B-nach-close'); final f = File( '${Platform.environment['TEMP'] ?? '.'}\\pyramid_device_probe.txt'); await f.writeAsString(out.toString()); debugPrint('[probe] geschrieben: ${f.path}'); exit(0); }