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");
        }
Beispiel #2
0
        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");
        }