public static IList <AudioSession> GetAllSessions()
        {
            List <AudioSession> list = new List <AudioSession>();

            Interfaces.IAudioSessionManager2 mgr = GetAudioSessionManager();
            if (mgr == null)
            {
                return(list);
            }

            Interfaces.IAudioSessionEnumerator sessionEnumerator;
            mgr.GetSessionEnumerator(out sessionEnumerator);
            int count;

            sessionEnumerator.GetCount(out count);

            for (int i = 0; i < count; i++)
            {
                Interfaces.IAudioSessionControl2 ctl2;
                sessionEnumerator.GetSession(i, out ctl2);
                if (ctl2 != null)
                {
                    list.Add(new AudioSession(ctl2));
                }
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            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);
                }
            }
        }