public CoreAudioController() { // ReSharper disable once SuspiciousTypeConversion.Global var innerEnumerator = ComObjectFactory.GetDeviceEnumerator(); _innerEnumeratorPtr = Marshal.GetIUnknownForObject(innerEnumerator); if (innerEnumerator == null) { throw new InvalidComObjectException("No Device Enumerator"); } _innerEnumerator = new ThreadLocal <IMultimediaDeviceEnumerator>(() => Marshal.GetUniqueObjectForIUnknown(_innerEnumeratorPtr) as IMultimediaDeviceEnumerator); ComThread.Invoke(() => { _systemEvents = new SystemEventNotifcationClient(() => InnerEnumerator); _systemEvents.DeviceAdded.Subscribe(x => OnDeviceAdded(x.DeviceId)); _systemEvents.DeviceRemoved.Subscribe(x => OnDeviceRemoved(x.DeviceId)); _deviceCache = new HashSet <CoreAudioDevice>(); IMultimediaDeviceCollection collection; InnerEnumerator.EnumAudioEndpoints(EDataFlow.All, EDeviceState.All, out collection); using (var coll = new MultimediaDeviceCollection(collection)) { foreach (var mDev in coll) { CacheDevice(mDev); } } }); }
public void LoadDevices(bool loadMeter = true, bool loadEndpoint = true, bool loadSession = true) { ComThread.Invoke(() => { _systemEvents = new SystemEventNotifcationClient(() => InnerEnumerator); _systemEvents.DeviceAdded.Subscribe(x => OnDeviceAdded(x.DeviceId)); _systemEvents.DeviceRemoved.Subscribe(x => OnDeviceRemoved(x.DeviceId)); _deviceCache = new HashSet <CoreAudioDevice>(); IMultimediaDeviceCollection collection; InnerEnumerator.EnumAudioEndpoints(EDataFlow.All, EDeviceState.All, out collection); using (var coll = new MultimediaDeviceCollection(collection)) { foreach (var mDev in coll) { CacheDevice(mDev, loadMeter, loadEndpoint, loadSession); } } }); }