private static Interfaces.IAudioEndpointVolume GetMasterVolumeObject()
        {
            Interfaces.IMMDeviceEnumerator deviceEnumerator = null;
            Interfaces.IMMDevice           speakers         = null;
            try
            {
                deviceEnumerator = (Interfaces.IMMDeviceEnumerator)(new Interfaces.MMDeviceEnumerator());
                deviceEnumerator.GetDefaultAudioEndpoint(Interfaces.EDataFlow.eRender, Interfaces.ERole.eMultimedia, out speakers);

                Guid   IID_IAudioEndpointVolume = typeof(Interfaces.IAudioEndpointVolume).GUID;
                object o;
                speakers.Activate(IID_IAudioEndpointVolume, 0, IntPtr.Zero, out o);
                Interfaces.IAudioEndpointVolume masterVol = (Interfaces.IAudioEndpointVolume)o;

                return(masterVol);
            }
            finally
            {
                if (speakers != null)
                {
                    Marshal.ReleaseComObject(speakers);
                }
                if (deviceEnumerator != null)
                {
                    Marshal.ReleaseComObject(deviceEnumerator);
                }
            }
        }
 private static Interfaces.IMMDevice GetSpeakers()
 {
     // get the speakers (1st render + multimedia) device
     try
     {
         Interfaces.IMMDeviceEnumerator deviceEnumerator = (Interfaces.IMMDeviceEnumerator)(new Interfaces.MMDeviceEnumerator());
         Interfaces.IMMDevice           speakers;
         deviceEnumerator.GetDefaultAudioEndpoint(Interfaces.EDataFlow.eRender, Interfaces.ERole.eMultimedia, out speakers);
         return(speakers);
     }
     catch
     {
         return(null);
     }
 }
        public static IList <AudioDevice> GetAllDevices()
        {
            List <AudioDevice> list = new List <AudioDevice>();

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

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

            int count;

            collection.GetCount(out count);
            for (int i = 0; i < count; i++)
            {
                Interfaces.IMMDevice dev;
                collection.Item(i, out dev);
                if (dev != null)
                {
                    list.Add(CreateDevice(dev));
                }
            }
            return(list);
        }
        private static Interfaces.ISimpleAudioVolume GetSystemSoundsVolumeObject()
        {
            Interfaces.IMMDeviceEnumerator     deviceEnumerator  = null;
            Interfaces.IAudioSessionEnumerator sessionEnumerator = null;
            Interfaces.IAudioSessionManager2   mgr = null;
            Interfaces.IMMDevice speakers          = null;
            try
            {
                // get the speakers (1st render + multimedia) device
                deviceEnumerator = (Interfaces.IMMDeviceEnumerator)(new Interfaces.MMDeviceEnumerator());
                deviceEnumerator.GetDefaultAudioEndpoint(Interfaces.EDataFlow.eRender, Interfaces.ERole.eMultimedia, out speakers);

                // activate the session manager. we need the enumerator
                Guid   IID_IAudioSessionManager2 = typeof(Interfaces.IAudioSessionManager2).GUID;
                object o;
                speakers.Activate(IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
                mgr = (Interfaces.IAudioSessionManager2)o;

                // enumerate sessions for on this device
                mgr.GetSessionEnumerator(out sessionEnumerator);
                int count;
                sessionEnumerator.GetCount(out count);

                // search for an audio session with the required process-id
                Interfaces.ISimpleAudioVolume volumeControl = null;
                for (int i = 0; i < count; ++i)
                {
                    Interfaces.IAudioSessionControl2 ctl = null;
                    try
                    {
                        sessionEnumerator.GetSession(i, out ctl);
                        ctl.GetDisplayName(out string val);
                        if (val.ToLower().Contains("@%systemroot%\\system32\\audiosrv.dll"))
                        {
                            volumeControl = ctl as Interfaces.ISimpleAudioVolume;
                            break;
                        }
                    }
                    finally
                    {
                    }
                }

                return(volumeControl);
            }
            finally
            {
                if (sessionEnumerator != null)
                {
                    Marshal.ReleaseComObject(sessionEnumerator);
                }
                if (mgr != null)
                {
                    Marshal.ReleaseComObject(mgr);
                }
                if (speakers != null)
                {
                    Marshal.ReleaseComObject(speakers);
                }
                if (deviceEnumerator != null)
                {
                    Marshal.ReleaseComObject(deviceEnumerator);
                }
            }
        }