Example #1
0
        public void UpdateProcessList()
        {
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            IMMDeviceCollection outputDevices    = null;
            IMMDeviceCollection inputDevices     = null;

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, STATE.ACTIVE, out outputDevices);
            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eCapture, STATE.ACTIVE, out inputDevices);

            uint inputDeviceCount  = 0;
            uint outputDeviceCount = 0;

            inputDevices.GetCount(out inputDeviceCount);
            outputDevices.GetCount(out outputDeviceCount);

            // Loop over every output device
            for (uint i = 0; i < outputDeviceCount; i++)
            {
                IMMDevice device;
                outputDevices.Item(i, out device);

                AudioDevice audioDevice = new AudioDevice(device);
                Mapper.Mapper.DevicesAndProcesses[audioDevice] = audioDevice.GetAllSessions();
            }
        }
        void RefreshDevices()
        {
            lock (this)
            {
                IMMDeviceCollection IMMDeviceCollection;
                _IMMDeviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, 0xF, out IMMDeviceCollection);
                uint deviceCount = 0;
                IMMDeviceCollection.GetCount(out deviceCount);

                for (uint n = 0; n < deviceCount; n++)
                {
                    IMMDevice IMMDevice;
                    IMMDeviceCollection.Item(n, out IMMDevice);
                    string uid = "";
                    IMMDevice.GetId(out uid);
                    if (!_PlaybackDevices.ContainsKey(uid))
                    {
                        _PlaybackDevices.Add(uid, new PlaybackDevice_WindowsCoreApi(IMMDevice));
                    }
                }

                {
                    IMMDevice Default;
                    _IMMDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, 0x0, out Default);
                    string uid = "";
                    Default.GetId(out uid);
                    if (!_PlaybackDevices.ContainsKey(uid))
                    {
                        _PlaybackDevices.Add(uid, new PlaybackDevice_WindowsCoreApi(Default));
                    }
                    _PlaybackDevices[uid]._Default = true;
                }

                _IMMDeviceEnumerator.EnumAudioEndpoints(EDataFlow.eCapture, 0xF, out IMMDeviceCollection);

                deviceCount = 0;
                IMMDeviceCollection.GetCount(out deviceCount);

                for (uint n = 0; n < deviceCount; n++)
                {
                    IMMDevice IMMDevice;
                    IMMDeviceCollection.Item(n, out IMMDevice);
                    string uid = "";
                    IMMDevice.GetId(out uid);
                    if (!_RecordingDevices.ContainsKey(uid))
                    {
                        _RecordingDevices.Add(uid, new RecordingDevice_WindowsCoreApi(IMMDevice));
                    }
                }
            }
        }
Example #3
0
        public AudioDeviceCollection GetAudioDevices(AudioDeviceKind kind, AudioDeviceState state)
        {
            IMMDeviceCollection result;

            Marshal.ThrowExceptionForHR(_underlyingEnumerator.EnumAudioEndpoints(kind, state, out result));
            return(new AudioDeviceCollection(result));
        }
        private IEnumerable <MMDevice> GetAllDevices(IMMDeviceEnumerator deviceEnumerator, DeviceStates deviceStates)
        {
            // Collect default devices
            var communicationPlaybackId  = GetDefaultDeviceId(deviceEnumerator, DataFlows.Render, DeviceRoles.Communication);
            var communicationRecordingId = GetDefaultDeviceId(deviceEnumerator, DataFlows.Capture, DeviceRoles.Communication);
            var multimediaPlaybackId     = GetDefaultDeviceId(deviceEnumerator, DataFlows.Render, DeviceRoles.Multimedia);
            var multimediaRecordingId    = GetDefaultDeviceId(deviceEnumerator, DataFlows.Capture, DeviceRoles.Multimedia);

            IMMDeviceCollection deviceCollection;

            Marshal.ThrowExceptionForHR(deviceEnumerator.EnumAudioEndpoints(DataFlows.All, deviceStates, out deviceCollection));

            uint count;

            Marshal.ThrowExceptionForHR(deviceCollection.GetCount(out count));

            for (uint i = 0; i < count; i++)
            {
                IMMDevice result;
                deviceCollection.Item(i, out result);

                var mmDevice = new MMDevice(result,
                                            (int)i + 1,
                                            communicationPlaybackId,
                                            communicationRecordingId,
                                            multimediaPlaybackId,
                                            multimediaRecordingId);

                yield return(mmDevice);
            }
        }
Example #5
0
        private static bool IsAudioInputDevice(string deviceId)
        {
            IMMDeviceCollection deviceCollection;
            IMMDevice           device;
            string id;
            bool   result = false;
            uint   count;

            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eCapture, (uint)DeviceState.All, out deviceCollection);
            deviceCollection.GetCount(out count);
            Marshal.ReleaseComObject(deviceEnumerator);

            for (uint i = 0; i < count; i++)
            {
                deviceCollection.Item(i, out device);
                device.GetId(out id);
                Marshal.ReleaseComObject(device);
                if (deviceId == id)
                {
                    result = true;
                    break;
                }
            }
            if (deviceCollection != null)
            {
                Marshal.ReleaseComObject(deviceCollection);
            }
            return(result);
        }
        /// <summary>
        /// Enumerate Audio Endpoints
        /// </summary>
        /// <param name="dataFlow">Desired DataFlow</param>
        /// <param name="dwStateMask">State Mask</param>
        /// <returns>Device Collection</returns>
        public IReadOnlyCollection <DeviceFullInfo> EnumerateAudioEndPoints(EDataFlow dataFlow, DeviceState dwStateMask)
        {
            IMMDeviceCollection result;

            Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow, dwStateMask, out result));
            return(CreateDeviceList(new MMDeviceCollection(result)));
        }
Example #7
0
        /// <summary>
        /// Returns a list of the system's enabled audio output devices. Returns null if no enabled audio output devices are present. See also: Player.Audio.DeviceCount and Player.Audio.GetDefaultDevice.
        /// </summary>
        public AudioDevice[] GetDevices()
        {
            AudioDevice[] audioDevices = null;
            _base._lastError = HResult.MF_E_NO_AUDIO_PLAYBACK_DEVICE;

            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, (uint)DeviceState.Active, out IMMDeviceCollection deviceCollection);
            Marshal.ReleaseComObject(deviceEnumerator);

            if (deviceCollection != null)
            {
                deviceCollection.GetCount(out uint count);
                if (count > 0)
                {
                    audioDevices = new AudioDevice[count];
                    for (int i = 0; i < count; i++)
                    {
                        audioDevices[i] = new AudioDevice();

                        deviceCollection.Item((uint)i, out IMMDevice device);
                        Player.GetDeviceInfo(device, audioDevices[i]);

                        Marshal.ReleaseComObject(device);
                    }
                    _base._lastError = Player.NO_ERROR;
                }
                Marshal.ReleaseComObject(deviceCollection);
            }
            return(audioDevices);
        }
Example #8
0
        public MMDeviceCollection EnumerateAudioEndPoints(EDataFlow dataFlow, EDeviceState dwStateMask)
        {
            IMMDeviceCollection result;

            Marshal.ThrowExceptionForHR(_realEnumerator.EnumAudioEndpoints(dataFlow, dwStateMask, out result));
            return(new MMDeviceCollection(result));
        }
Example #9
0
        /// <summary>
        /// Gets a collection of available devices.
        /// </summary>
        /// <param name="dataFlow">The data flow.</param>
        /// <returns>A collection of available devices matching the supplied role.</returns>
        internal static IMMDeviceCollection GetAvailableDevices(EDataFlow dataFlow)
        {
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();
            IMMDeviceCollection deviceCollection = deviceEnumerator.EnumAudioEndpoints(dataFlow, DeviceStateActive);

            Marshal.ReleaseComObject(deviceEnumerator);

            return(deviceCollection);
        }
Example #10
0
        /// <summary>
        /// Constructor
        /// </summary>

        public Volume()
        {
            const uint CLSCTX_INPROC_SERVER = 1;
            Guid       clsid        = new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E");
            Guid       IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");

            oEnumerator = null;
            uint hResult = CoCreateInstance(ref clsid, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out oEnumerator);

            if (hResult != 0 || oEnumerator == null)
            {
                throw new Exception("CoCreateInstance() pInvoke failed");
            }
            iMde = oEnumerator as IMMDeviceEnumerator;
            if (iMde == null)
            {
                throw new Exception("COM cast failed to IMMDeviceEnumerator");
            }
            IntPtr pDevice = IntPtr.Zero;
            int    retVal  = iMde.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eConsole, ref pDevice);

            if (retVal != 0)
            {
                throw new Exception("IMMDeviceEnumerator.GetDefaultAudioEndpoint()");
            }
            int    dwStateMask = DEVICE_STATE_ACTIVE | DEVICE_STATE_NOTPRESENT | DEVICE_STATE_UNPLUGGED;
            IntPtr pCollection = IntPtr.Zero;

            retVal = iMde.EnumAudioEndpoints(EDataFlow.eRender, dwStateMask, ref pCollection);
            if (retVal != 0)
            {
                throw new Exception("IMMDeviceEnumerator.EnumAudioEndpoints()");
            }
            oDevice = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(pDevice);
            imd     = oDevice as IMMDevice;
            if (imd == null)
            {
                throw new Exception("COM cast failed to IMMDevice");
            }
            Guid   iid               = new Guid("5CDF2C82-841E-4546-9722-0CF74078229A");
            uint   dwClsCtx          = (uint)CLSCTX.CLSCTX_ALL;
            IntPtr pActivationParams = IntPtr.Zero;
            IntPtr pEndPoint         = IntPtr.Zero;

            retVal = imd.Activate(ref iid, dwClsCtx, pActivationParams, ref pEndPoint);
            if (retVal != 0)
            {
                throw new Exception("IMMDevice.Activate()");
            }
            oEndPoint      = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(pEndPoint);
            iAudioEndpoint = oEndPoint as IAudioEndpointVolume;
            if (iAudioEndpoint == null)
            {
                throw new Exception("COM cast failed to IAudioEndpointVolume");
            }
        }
Example #11
0
        // Lists all devices, and for each device all processes that are currently playing sound using that device
        public static List <SoundInfoDevice> getSoundInfo()
        {
            List <SoundInfoDevice> soundInfoDevices = new List <SoundInfoDevice>();

            DeviceEnumerator    enumerator       = new DeviceEnumerator();
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)enumerator;
            IMMDeviceCollection deviceCollection = deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, DeviceStatemask.DEVICE_STATE_ACTIVE);
            uint deviceCount = deviceCollection.GetCount();

            for (uint i = 0; i < deviceCount; i++)
            {
                SoundInfoDevice soundInfoDevice = new SoundInfoDevice();
                soundInfoDevices.Add(soundInfoDevice);

                IMMDevice device   = deviceCollection.Item(i);
                string    deviceId = device.GetId();
                soundInfoDevice.ID = deviceId;
                IMMPropertyStore propertyStore         = device.OpenPropertyStore(ProperyStoreMode.STGM_READ);
                PropertyKey      propertyKeyDeviceDesc = new PropertyKey();
                propertyKeyDeviceDesc.fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0);
                propertyKeyDeviceDesc.pid   = 2;
                PropVariant deviceNamePtr = propertyStore.GetValue(ref propertyKeyDeviceDesc);
                string      deviceName    = Marshal.PtrToStringUni(deviceNamePtr.pszVal);
                soundInfoDevice.name = deviceName;

                Guid guidAudioSessionManager2             = new Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F");
                IAudioSessionManager2 audioSessionManager = (IAudioSessionManager2)device.Activate(ref guidAudioSessionManager2, (int)ClsCtx.CLSCTX_ALL, IntPtr.Zero);


                IAudioSessionEnumerator sessionEnumerator = audioSessionManager.GetSessionEnumerator();

                int sessionCount = sessionEnumerator.GetCount();
                for (int j = 0; j < sessionCount; j++)
                {
                    IAudioSessionControl  audioSessionControl  = sessionEnumerator.GetSession(j);
                    IAudioSessionControl2 audioSessionControl2 = (IAudioSessionControl2)audioSessionControl;
                    AudioSessionState     state = audioSessionControl.GetState();
                    if (state == AudioSessionState.AudioSessionStateActive)
                    {
                        SoundInfoSession soundInfoSession = new SoundInfoSession();
                        soundInfoDevice.sessions.Add(soundInfoSession);

                        string displayName = audioSessionControl.GetDisplayName();
                        string iconPath    = audioSessionControl.GetIconPath();
                        int    processId   = audioSessionControl2.GetProcessId();
                        string processName = Process.GetProcessById(processId).MainWindowTitle;

                        soundInfoSession.pid        = processId;
                        soundInfoSession.windowName = processName;
                    }
                }
            }

            return(soundInfoDevices);
        }
        public AudioDeviceCollection GetAudioDevices(AudioDeviceKind kind, AudioDeviceState state)
        {
            int hr = _deviceEnumerator.EnumAudioEndpoints(kind, state, out IMMDeviceCollection underlyingCollection);

            if (hr == HResult.OK)
            {
                return(new AudioDeviceCollection(underlyingCollection));
            }

            throw Marshal.GetExceptionForHR(hr);
        }
Example #13
0
        public static ISimpleAudioVolume GetVolumeObject(int pid)
        {
            // Get the speakers (1st render + multimedia) device
            // ReSharper disable once SuspiciousTypeConversion.Global
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();

            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.ERender, ERole.EMultimedia, out IMMDevice speakers);

            speakers.GetId(out string defaultDeviceId);

            ISimpleAudioVolume volumeControl = GetVolumeObject(pid, speakers);

            Marshal.ReleaseComObject(speakers);

            if (volumeControl == null)
            {
                // If volumeControl is null, then the process's volume object might be on a different device.
                // This happens if the process doesn't use the default device.
                //
                // As far as Spotify is concerned, if using the "--enable-audio-graph" command line argument,
                // a new option becomes available in the Settings that makes it possible to change the playback device.

                deviceEnumerator.EnumAudioEndpoints(EDataFlow.ERender, EDeviceState.Active, out IMMDeviceCollection deviceCollection);

                deviceCollection.GetCount(out int count);
                for (int i = 0; i < count; i++)
                {
                    deviceCollection.Item(i, out IMMDevice device);
                    device.GetId(out string deviceId);

                    try
                    {
                        if (deviceId == defaultDeviceId)
                        {
                            continue;
                        }

                        volumeControl = GetVolumeObject(pid, device);
                        if (volumeControl != null)
                        {
                            break;
                        }
                    }
                    finally
                    {
                        Marshal.ReleaseComObject(device);
                    }
                }
            }

            Marshal.ReleaseComObject(deviceEnumerator);
            return(volumeControl);
        }
        /// <summary>
        /// Returns true if an active microphone session is found.
        /// </summary>
        public bool IsAnyMicInUse()
        {
            IMMDeviceEnumerator deviceEnumerator     = null;
            IMMDeviceCollection microphoneCollection = null;

            try
            {
                deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
                deviceEnumerator.EnumAudioEndpoints(EDataFlow.eCapture, DEVICE_STATE_XXX.DEVICE_STATE_ACTIVE, out microphoneCollection);

                microphoneCollection.GetCount(out uint microphoneCount);

                for (uint i = 0; i < microphoneCount; i++)
                {
                    IMMDevice microphone = null;

                    try
                    {
                        microphoneCollection.Item(i, out microphone);

                        if (microphoneHasActiveSession(microphone))
                        {
                            return(true);
                        }
                    }
                    finally
                    {
                        if (microphone != null)
                        {
                            Marshal.ReleaseComObject(microphone);
                        }
                    }
                }
            }
            finally
            {
                if (microphoneCollection != null)
                {
                    Marshal.ReleaseComObject(microphoneCollection);
                }
                if (deviceEnumerator != null)
                {
                    Marshal.ReleaseComObject(deviceEnumerator);
                }
            }

            return(false);
        }
Example #15
0
        private void RefreshSystemDevices()
        {
            ComThread.Invoke(() =>
            {
                _deviceCache = new HashSet <CoreAudioDevice>();
                IMMDeviceCollection collection;
                _innerEnumerator.EnumAudioEndpoints(EDataFlow.All, EDeviceState.All, out collection);

                using (var coll = new MMDeviceCollection(collection))
                {
                    foreach (var mDev in coll)
                    {
                        CacheDevice(mDev);
                    }
                }
            });
        }
Example #16
0
        public static IEnumerable <IMMDevice> CreateIMMDeviceCollection(IMMDeviceEnumerator deviceEnumerator, EDataFlow direction = EDataFlow.eAll, DEVICE_STATE stateMasks = DEVICE_STATE.DEVICE_STATEMASK_ALL)
        {
            using var deviceCollection = ComReleaserFactory.Create(deviceEnumerator.EnumAudioEndpoints(direction, stateMasks));
            var deviceList = new List <IMMDevice>();
            var cnt        = deviceCollection.Item.GetCount();

            if (cnt == 0)
            {
                Assert.Inconclusive("No devices were found.");
            }
            for (uint i = 0; i < cnt; i++)
            {
                deviceCollection.Item.Item(i, out var dev).ThrowIfFailed();
                deviceList.Add(dev);
            }
            return(deviceList);
        }
Example #17
0
        /// <summary>
        /// tries to get an IMMDevice by its PKEY_DEVICE_FRIENDLY_NAME
        /// </summary>
        /// <param name="pDeviceFriendlyName">PKEY_DEVICE_FRIENDLY_NAME of sound output device</param>
        /// <returns>true if succesful, false if not</returns>
        private static IMMDevice GetIMMDeviceByName(string pDeviceFriendlyName)
        {
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());

            IMMDeviceCollection deviceCollection;

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, EDeviceState.Active, out deviceCollection);

            IMMDevice targetDevice = null;

            uint deviceCount;

            deviceCollection.GetCount(out deviceCount);
            for (uint i = 0; i < deviceCount; i++)
            {
                IMMDevice device;
                deviceCollection.Item(i, out device);

                IPropertyStore propertyStore;
                device.OpenPropertyStore(StorageAccessMode.Read, out propertyStore);

                PropertyKey propertyKey = PropertyKeys.PKEY_DEVICE_FRIENDLY_NAME;
                PropVariant propVariant;

                propertyStore.GetValue(ref propertyKey, out propVariant);

                object propValue = propVariant.Value;
                if (propValue.ToString() == pDeviceFriendlyName)
                {
                    targetDevice = device;

                    Marshal.ReleaseComObject(propertyStore);
                    break;
                }

                Marshal.ReleaseComObject(device);
                Marshal.ReleaseComObject(propertyStore);
            }

            Marshal.ReleaseComObject(deviceEnumerator);
            Marshal.ReleaseComObject(deviceCollection);
            return(targetDevice);
        }
        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");
        }
Example #19
0
        /// <summary>
        /// Get HID Audio Device UUID
        /// </summary>
        /// <param name="dataFlow"></param>
        /// <param name="pid"></param>
        /// <param name="vid"></param>
        /// <returns></returns>
        private string GetHIDAudioDeviceUUID(AudioDataFlow dataFlow, string pid, string vid)
        {
            COMResult result = COMResult.E_FAIL;

            PropertyKey proKey;
            PropVariant proVar;

            result = _deviceEnumerator.EnumAudioEndpoints(dataFlow, AudioDeviceState.DEVICE_STATE_ACTIVE, out IMMDeviceCollection devCollect);
            result = devCollect.GetCount(out int devCnt);
            for (int i = 0; i < devCnt; i++)
            {
                result = devCollect.Item(i, out IMMDevice tDev);
                tDev.GetId(out string devID);
                tDev.OpenPropertyStore(StorageAccessMode.STGM_READ, out IPropertyStore ppt);
                ppt.GetCount(out int ppCnt);
                for (int j = 0; j < ppCnt; j++)
                {
                    result = ppt.GetAt(j, out proKey);
                    result = ppt.GetValue(ref proKey, out proVar);
                    if (proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPWSTR ||
                        proVar.DataType == System.Runtime.InteropServices.VarEnum.VT_LPSTR)
                    {
                        if (proKey.formatId.ToString().Equals(PKEY_AUDIOENDPOINT_HWID.formatId.ToString()) &&
                            proKey.propertyId == PKEY_AUDIOENDPOINT_HWID.propertyId)
                        {
                            string hwID = proVar.Value.ToString();
                            if (!GetPIDVIDFromHWIDString(hwID, out string hwPid, out string hwVid))
                            {
                                continue;
                            }
                            if (vid.Equals(hwVid, StringComparison.CurrentCultureIgnoreCase) &&
                                pid.Equals(hwPid, StringComparison.CurrentCultureIgnoreCase))
                            {
                                return(devID);
                            }
                        }
                    }
                }
            }
            return(string.Empty);
        }
Example #20
0
        public static IList <AudioDevice> GetAllDevices()
        {
            List <AudioDevice>  list             = new List <AudioDevice>();
            IMMDeviceEnumerator deviceEnumerator = null;

            try
            {
                deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            }
            catch
            {
            }
            if (deviceEnumerator == null)
            {
                return(list);
            }

            IMMDeviceCollection collection;

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eAll, DEVICE_STATE.MASK_ALL, out collection);
            if (collection == null)
            {
                return(list);
            }

            int count;

            collection.GetCount(out count);
            for (int i = 0; i < count; i++)
            {
                IMMDevice dev;
                collection.Item(i, out dev);
                if (dev != null)
                {
                    list.Add(CreateDevice(dev));
                }
            }
            return(list);
        }
        //Get all the playback audio devices
        public static List <AudioDeviceSummary> ListAudioDevices()
        {
            try
            {
                List <AudioDeviceSummary> deviceListSummary = new List <AudioDeviceSummary>();
                IMMDeviceEnumerator       deviceEnumerator  = (IMMDeviceEnumerator) new MMDeviceEnumerator();
                IMMDeviceCollection       deviceCollection  = deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, DeviceState.ACTIVE);

                uint deviceCount = deviceCollection.GetCount();
                for (uint deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
                {
                    IMMDevice.IMMDevice deviceItem = deviceCollection.Item(deviceIndex);

                    //Get the audio device id
                    string deviceId = deviceItem.GetId();

                    //Get the audio device name
                    PropertyVariant propertyVariant = new PropertyVariant();
                    IPropertyStore  propertyStore   = deviceItem.OpenPropertyStore(STGM.STGM_READ);
                    propertyStore.GetValue(ref PKEY_Device_FriendlyName, out propertyVariant);
                    string deviceName = Marshal.PtrToStringUni(propertyVariant.pwszVal);

                    //Add device to summary list
                    deviceListSummary.Add(new AudioDeviceSummary()
                    {
                        Identifier = deviceId, Name = deviceName
                    });
                }

                return(deviceListSummary);
            }
            catch
            {
                Debug.WriteLine("Failed to get audio devices.");
                return(null);
            }
        }
Example #22
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");
        }
        internal WasApiAudioContext(IMMDeviceEnumerator enumerator)
        {
            _enumerator = enumerator;
            int error = _enumerator.EnumAudioEndpoints(DataFlow.Render, DeviceState.Active, out IMMDeviceCollection collection);

            if (error != 0)
            {
                Win32Platform.CheckError("Couldn't detect audio devices.", true);
                return;
            }

            // Get initial devices.
            error = collection.GetCount(out int count);
            if (error != 0)
            {
                Win32Platform.CheckError("Couldn't detect the number of audio devices.", true);
                return;
            }

            for (var i = 0; i < count; i++)
            {
                error = collection.Item(i, out IMMDevice device);
                if (error != 0)
                {
                    Win32Platform.CheckError($"Couldn't retrieve audio device of index {i}.");
                    continue;
                }

                ParseDevice(device);
            }

            // Find the default device.
            SetDefaultDevice();

            // Register to audio device events.
            _enumerator.RegisterEndpointNotificationCallback(this);
        }
Example #24
0
        private void SystemDevicesChangedHandler(object sender, SystemAudioDevicesEventArgs e)
        {
            if (e.IsInputDevice)
            {
                return;
            }

            IMMDeviceCollection deviceCollection;
            uint count;

            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();

            deviceEnumerator.EnumAudioEndpoints(EDataFlow.eRender, (uint)DeviceState.Active, out deviceCollection);
            deviceCollection.GetCount(out count);
            Marshal.ReleaseComObject(deviceEnumerator);
            if (deviceCollection != null)
            {
                Marshal.ReleaseComObject(deviceCollection);
            }

            if (e._notification == SystemAudioDevicesNotification.Activated)
            {
                if (count == 1)
                {
                    if (_playing && !_paused)
                    {
                        // cannot resume playback
                        //if (pm_HasPeakMeter)
                        //{
                        //    PeakMeter_Open(_audioDevice, true);
                        //}
                        // maybe this
                        Control control = _display;
                        if (control == null)
                        {
                            FormCollection forms = Application.OpenForms;
                            if (forms != null && forms.Count > 0)
                            {
                                control = forms[0];
                            }
                        }
                        if (control != null)
                        {
                            control.BeginInvoke(new MethodInvoker(delegate { AV_UpdateTopology(); }));
                        }
                    }
                    if (_mediaAudioDeviceChanged != null)
                    {
                        _mediaAudioDeviceChanged(this, EventArgs.Empty);
                    }
                }
            }
            else if (_audioDevice == null)
            {
                if (pm_HasPeakMeter && e._notification == SystemAudioDevicesNotification.DefaultChanged)
                {
                    if (count != 0)
                    {
                        PeakMeter_Open(_audioDevice, true);
                    }
                    else
                    {
                        pm_PeakMeterChannelCount = 0;
                    }
                    if (_mediaAudioDeviceChanged != null)
                    {
                        _mediaAudioDeviceChanged(this, EventArgs.Empty);
                    }
                }
            }
            else
            {
                if (e._deviceId == _audioDevice.Id && (e._notification == SystemAudioDevicesNotification.Removed || e._notification == SystemAudioDevicesNotification.Disabled))
                {
                    if (count != 0)
                    {
                        _audioDevice = null;
                        if (pm_HasPeakMeter)
                        {
                            PeakMeter_Open(_audioDevice, true);
                        }
                    }
                    else
                    {
                        pm_PeakMeterChannelCount = 0;
                    }
                    if (_mediaAudioDeviceChanged != null)
                    {
                        _mediaAudioDeviceChanged(this, EventArgs.Empty);
                    }
                }
            }
        }
Example #25
0
 /// <summary>
 /// Enumerate Audio Endpoints
 /// </summary>
 /// <param name="dataFlow">Desired DataFlow</param>
 /// <param name="dwStateMask">State Mask</param>
 /// <returns>Device Collection</returns>
 public MMDeviceCollection EnumerateAudioEndPoints(DataFlow dataFlow, DeviceState stateMask)
 {
     Marshal.ThrowExceptionForHR(_mmDeviceEnumerator.EnumAudioEndpoints(dataFlow, stateMask, out var result));
     return(new MMDeviceCollection(result));
 }
Example #26
0
 public void EnumAudioEndpoints(DataFlow dataFlow, DeviceState deviceStates, out IMMDeviceCollection devices)
 {
     _inner.EnumAudioEndpoints(dataFlow, deviceStates, out devices);
 }
        //public event MixerChangedEventHandler MixerChanged;



        #region Class Constructor and Dispose public methods

        /// <summary>

        /// Constructor

        /// </summary>

        public EndpointVolume()
        {

            const uint CLSCTX_INPROC_SERVER = 1;

            Guid clsid = new Guid("BCDE0395-E52F-467C-8E3D-C4579291692E");

            Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");

            oEnumerator = null;

            uint hResult = CoCreateInstance(ref clsid, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out oEnumerator);

            if (hResult != 0 || oEnumerator == null)
            {

                throw new Exception("CoCreateInstance() pInvoke failed");

            }

            iMde = oEnumerator as IMMDeviceEnumerator;

            if (iMde == null)
            {

                throw new Exception("COM cast failed to IMMDeviceEnumerator");

            }

            IntPtr pDevice = IntPtr.Zero;

            int retVal = iMde.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eConsole, ref pDevice);

            if (retVal != 0)
            {

                throw new Exception("IMMDeviceEnumerator.GetDefaultAudioEndpoint()");

            }

            int dwStateMask = DEVICE_STATE_ACTIVE | DEVICE_STATE_NOTPRESENT | DEVICE_STATE_UNPLUGGED;

            IntPtr pCollection = IntPtr.Zero;

            retVal = iMde.EnumAudioEndpoints(EDataFlow.eRender, dwStateMask, ref pCollection);

            if (retVal != 0)
            {

                throw new Exception("IMMDeviceEnumerator.EnumAudioEndpoints()");

            }

            oDevice = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(pDevice);

            imd = oDevice as IMMDevice;

            if (imd == null)
            {

                throw new Exception("COM cast failed to IMMDevice");

            }

            Guid iid = new Guid("5CDF2C82-841E-4546-9722-0CF74078229A");

            uint dwClsCtx = (uint)CLSCTX.CLSCTX_ALL;

            IntPtr pActivationParams = IntPtr.Zero;

            IntPtr pEndPoint = IntPtr.Zero;

            retVal = imd.Activate(ref iid, dwClsCtx, pActivationParams, ref pEndPoint);

            if (retVal != 0)
            {

                throw new Exception("IMMDevice.Activate()");

            }

            oEndPoint = System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(pEndPoint);

            iAudioEndpoint = oEndPoint as IAudioEndpointVolume;

            if (iAudioEndpoint == null)
            {

                throw new Exception("COM cast failed to IAudioEndpointVolume");

            }

            /*

            delMixerChange = new DelegateMixerChange(MixerChange);

            retVal = iAudioEndpoint.RegisterControlChangeNotify(delMixerChange);

            if (retVal != 0)

            {

            throw new Exception("iAudioEndpoint.RegisterControlChangeNotify(delMixerChange)");

            }

            */

        }