public AudioDeviceManager(AudioDeviceKind kind) { _kind = kind; _dispatcher = Dispatcher.CurrentDispatcher; _devices = new AudioDeviceCollection(); _policyConfigService = new AudioPolicyConfigService(Flow); TraceLine($"Create"); Task.Factory.StartNew(() => { try { _enumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator(); _enumerator.RegisterEndpointNotificationCallback(this); var devices = _enumerator.EnumAudioEndpoints(Flow, DeviceState.ACTIVE); uint deviceCount = devices.GetCount(); for (uint i = 0; i < deviceCount; i++) { ((IMMNotificationClient)this).OnDeviceAdded(devices.Item(i).GetId()); } _dispatcher.Invoke((Action)(() => { QueryDefaultDevice(); Loaded?.Invoke(this, null); })); } catch (Exception ex) { // Even through we're going to be broken, show the tray icon so the user can collect debug data. AppTrace.LogWarning(ex); _dispatcher.Invoke((Action)(() => { Loaded?.Invoke(this, null); })); } }); TraceLine($"Create Exit"); }
public AudioDeviceManager(Dispatcher dispatcher) { Trace.WriteLine("AudioDeviceManager Create"); _dispatcher = dispatcher; _devices = new AudioDeviceCollection(); _policyConfigService = new AudioPolicyConfigService(); Task.Factory.StartNew(() => { try { _enumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator(); _enumerator.RegisterEndpointNotificationCallback(this); var devices = _enumerator.EnumAudioEndpoints(EDataFlow.eRender, DeviceState.ACTIVE); uint deviceCount = devices.GetCount(); for (uint i = 0; i < deviceCount; i++) { ((IMMNotificationClient)this).OnDeviceAdded(devices.Item(i).GetId()); } // Trigger default logic to register for volume change _dispatcher.BeginInvoke((Action)(() => { QueryDefaultPlaybackDevice(); Loaded?.Invoke(this, null); })); } catch (Exception ex) when(ex.Is(Error.AUDCLNT_E_DEVICE_INVALIDATED)) { // Expected in some cases. } }); Trace.WriteLine("AudioDeviceManager Create Exit"); }