コード例 #1
0
        public AudioProcess(AudioDevice audioDevice, IAudioSessionControl2 ctl2)
        {
            // Set device
            AudioDevice = audioDevice;

            Process_AudioSessionControl = ctl2;

            // Set process
            uint processID;

            ctl2.GetProcessId(out processID);
            if (processID != 0)
            {
                try
                {
                    Process = Process.GetProcessById((int)processID);
                }
                catch (Exception e)
                {
                }
            }

            // Set SimpleAudioVolume
            Process_SimpleAudioVolume = ctl2 as ISimpleAudioVolume;

            Update();
        }
コード例 #2
0
        public IList<AudioProcess> GetAllSessions()
        {
            IAudioSessionManager2 mgr = GetDeviceManager();
            IAudioSessionEnumerator sessionEnumerator;
            mgr.GetSessionEnumerator(out sessionEnumerator);

            IList<AudioProcess> processes = new List<AudioProcess>();

            int count;
            sessionEnumerator.GetCount(out count);

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl ctl;
                sessionEnumerator.GetSession(i, out ctl);
                if (ctl == null)
                    continue;

                IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2;
                if (ctl2 != null)
                {
                    processes.Add(new AudioProcess(this, ctl2));
                }
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            return processes;
        }
コード例 #3
0
        private static ISimpleAudioVolume GetVolumeObject(string name)
        {
            IMMDeviceEnumerator devices = (IMMDeviceEnumerator) new MMDeviceEnumerator();
            IMMDevice           device  = devices.GetDefaultAudioEndpoint(EDATAFLOW_RENDER, EROLE_MULTIMEDIA);

            Guid sessionManagerGUID          = typeof(IAudioSessionManager2).GUID;
            IAudioSessionManager2   manager  = (IAudioSessionManager2)device.Activate(ref sessionManagerGUID, 0, IntPtr.Zero);
            IAudioSessionEnumerator sessions = manager.GetSessionEnumerator();

            ISimpleAudioVolume volumeObj = null;

            for (int index = sessions.GetCount() - 1; index >= 0; index--)
            {
                IAudioSessionControl2 ctl = sessions.GetSession(index) as IAudioSessionControl2;

                if (ctl != null)
                {
                    string identifier = ctl.GetSessionIdentifier();

                    if (identifier != null && identifier.Contains(name))
                    {
                        volumeObj = ctl as ISimpleAudioVolume;
                        break;
                    }

                    Marshal.ReleaseComObject(ctl);
                }
            }

            Marshal.ReleaseComObject(devices);
            Marshal.ReleaseComObject(device);
            Marshal.ReleaseComObject(manager);
            Marshal.ReleaseComObject(sessions);
            return(volumeObj);
        }
コード例 #4
0
 internal void FireSessionCreated(IAudioSessionControl2 newSession)
 {
     if (OnSessionCreated != null)
     {
         OnSessionCreated(this, newSession);
     }
 }
コード例 #5
0
        public static void SetApplicationVolume(IAudioSessionControl2 name, float level)
        {
            var volume = name as ISimpleAudioVolume;
            var guid   = Guid.Empty;

            volume?.SetMasterVolume(level / 100, ref guid);
        }
コード例 #6
0
        public static string GetIconpath(string name)
        {
            IAudioSessionControl2 ctl2 = GetVolumeObject(name) as IAudioSessionControl2;
            string path;

            ctl2.GetIconPath(out path);
            return(path);
        }
コード例 #7
0
        public static int GetApplicationVolume(IAudioSessionControl2 name)
        {
            var volume = name as ISimpleAudioVolume;
            var level  = 0f;

            volume?.GetMasterVolume(out level);
            return(Convert.ToInt32(level * 100));
        }
コード例 #8
0
ファイル: VolumeMixer.cs プロジェクト: CID6/D2D-App
 public void Dispose()
 {
     if (_ctl != null)
     {
         Marshal.ReleaseComObject(_ctl);
         _ctl = null;
     }
 }
コード例 #9
0
        public VolumeMaster()
        {
            // get the speakers (1st render + multimedia) device
            List <AudioSession> list             = new List <AudioSession>();
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();
            IMMDevice           speakers;
            IMMDevice           SPDIF;

            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);
            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out SPDIF);

            Guid   GUID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
            Guid   GUID_IAudioEndpointVolume  = typeof(IAudioEndpointVolume).GUID;
            object o;
            object o2;
            int    i1 = speakers.Activate(ref GUID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
            int    i2 = SPDIF.Activate(ref GUID_IAudioEndpointVolume, 0, IntPtr.Zero, out o2);
            IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

            audioEndpointVolume = (IAudioEndpointVolume)o2;


            if (mgr == null)
            {
                Sessions = list;
                return;
            }

            IAudioSessionEnumerator sessionEnumerator;

            mgr.GetSessionEnumerator(out sessionEnumerator);

            int count;

            sessionEnumerator.GetCount(out count);

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl ctl;
                sessionEnumerator.GetSession(i, out ctl);
                if (ctl == null)
                {
                    continue;
                }

                IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2;
                if (ctl2 != null)
                {
                    list.Add(new AudioSession(ctl2));
                }
            }
            Marshal.ReleaseComObject(speakers);
            Marshal.ReleaseComObject(deviceEnumerator);
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);

            Sessions = list;
        }
コード例 #10
0
        public static bool AppMuteState(IAudioSessionControl2 name)
        {
            var app = name as ISimpleAudioVolume;

            var muteState = false;

            app?.GetMute(out muteState);
            return(muteState);
        }
コード例 #11
0
 internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
 {
     //IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
     //ISimpleAudioVolume _volume = realAudioSessionControl as ISimpleAudioVolume;
     //if (_meters != null)
     //    _AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(_meters);
     //if (_volume != null)
     //     _SimpleAudioVolume = new SimpleAudioVolume(_volume);
     _AudioSessionControl = realAudioSessionControl;
 }
コード例 #12
0
 internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
 {
     IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
     ISimpleAudioVolume _volume = realAudioSessionControl as ISimpleAudioVolume;
     if (_meters != null)
         _AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(_meters);
     if (_volume != null)
         _SimpleAudioVolume = new SimpleAudioVolume(_volume);
     _AudioSessionControl = realAudioSessionControl;
 }
コード例 #13
0
        public static void MuteApp(IAudioSessionControl2 name)
        {
            var app = name as ISimpleAudioVolume;

            var guid      = Guid.Empty;
            var muteState = false;

            app?.GetMute(out muteState);
            app?.SetMute(!muteState, ref guid);
        }
コード例 #14
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);
        }
コード例 #15
0
        private static ISimpleAudioVolume GetVolumeObject(int pid)
        {
            // get the speakers (1st render + multimedia) device
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            IMMDevice           speakers;

            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);

            // activate the session manager. we need the enumerator
            Guid   IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
            object o;

            speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
            IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

            // enumerate sessions for on this device
            IAudioSessionEnumerator sessionEnumerator;

            mgr.GetSessionEnumerator(out sessionEnumerator);
            int count;

            sessionEnumerator.GetCount(out count);

            // search for an audio session with the required pid

            ISimpleAudioVolume volumeControl = null;

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl ctl;


                sessionEnumerator.GetSession(i, out ctl);
                IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2;
                //uint pid;
                //ctl2.GetProcessId(out pid);
                //Process p = Process.GetProcessById((int)pid);
                // ctl2.SetDisplayName(p.ProcessName, Guid.Empty);
                uint npid;
                ctl2.GetProcessId(out npid);
                if (pid == npid)
                {
                    volumeControl = ctl2 as ISimpleAudioVolume;
                    break;
                }
                Marshal.ReleaseComObject(ctl);
                Marshal.ReleaseComObject(ctl2);
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            Marshal.ReleaseComObject(speakers);
            Marshal.ReleaseComObject(deviceEnumerator);
            return(volumeControl);
        }
コード例 #16
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="audioSessionControl"></param>
        public AudioSessionControl(IAudioSessionControl audioSessionControl)
        {
            audioSessionControlInterface = audioSessionControl;
            audioSessionControlInterface2 = audioSessionControl as IAudioSessionControl2;

            var meters = audioSessionControlInterface as IAudioMeterInformation;
            var volume = audioSessionControlInterface as ISimpleAudioVolume;
            if (meters != null)
                audioMeterInformation = new AudioMeterInformation(meters);
            if (volume != null)
                simpleAudioVolume = new SimpleAudioVolume(volume);
        }
コード例 #17
0
        internal AudioSessionControl2(IAudioSessionControl2 realAudioSessionControl2)
        {
            _AudioSessionControl2 = realAudioSessionControl2;

            IAudioMeterInformation _meters = _AudioSessionControl2 as IAudioMeterInformation;
            ISimpleAudioVolume _volume = _AudioSessionControl2 as ISimpleAudioVolume;
            if (_meters != null) _AudioMeterInformation = new CoreAudio.AudioMeterInformation(_meters);
            if (_volume != null) _SimpleAudioVolume = new SimpleAudioVolume(_volume);

            _AudioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl2.RegisterAudioSessionNotification(_AudioSessionEvents));
        }
コード例 #18
0
        /* added -> */
        public AudioSessionControl GetAudioSessionControl(Guid AudioSessionGuid, bool CrossProcessSession)
        {
            IAudioSessionControl2 result = null;
            int hr = _AudioSessionManager.GetAudioSessionControl(ref AudioSessionGuid, (uint)(CrossProcessSession ? 1 : 0), out result);

            Marshal.ThrowExceptionForHR(hr);
            if (result == null)
            {
                return(null);
            }
            return(new AudioSessionControl(result));
        }
コード例 #19
0
        // getting IAudioSessionControl2 out of IAudioSessionControl via QueryInterface
        private static IAudioSessionControl2 GetAudioControl2(IAudioSessionControl ctl)
        {
            IntPtr pUnk = Marshal.GetIUnknownForObject(ctl);
            IntPtr pI;
            Guid   baseGuid = typeof(IAudioSessionControl).GUID;

            Marshal.QueryInterface(pUnk, ref baseGuid, out pI);
            object asc = Marshal.GetObjectForIUnknown(pI);
            IAudioSessionControl2 asc2 = (IAudioSessionControl2)asc;

            return(asc2);
        }
コード例 #20
0
        public AudioSessionControl(IAudioSessionControl audioSessionControl)
        {
            _audioSessionControl  = audioSessionControl;
            _audioSessionControl2 = audioSessionControl as IAudioSessionControl2;

            //if (_audioSessionControl2 == null)
            //    throw new InvalidOperationException("Not supported on this version of Windows");

            if (_audioSessionControl is ISimpleAudioVolume simpleVolume)
            {
                _simpleAudioVolume = new SimpleAudioVolume(simpleVolume);
            }
        }
コード例 #21
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="audioSessionControl"></param>
        public AudioSessionControl(IAudioSessionControl audioSessionControl)
        {
            audioSessionControlInterface  = audioSessionControl;
            audioSessionControlInterface2 = audioSessionControl as IAudioSessionControl2;

            if (audioSessionControlInterface is IAudioMeterInformation meters)
            {
                AudioMeterInformation = new AudioMeterInformation(meters);
            }
            if (audioSessionControlInterface is ISimpleAudioVolume volume)
            {
                SimpleAudioVolume = new SimpleAudioVolume(volume);
            }
        }
コード例 #22
0
        private static ISimpleAudioVolume GetVolumeObject(int pid)
        {
            IMMDeviceEnumerator     iMMDeviceEnumerator = null;
            IAudioSessionEnumerator SessionEnum         = null;
            IAudioSessionManager2   audioSessionManager = null;
            IMMDevice ppDevice = null;

            try
            {
                iMMDeviceEnumerator = (IMMDeviceEnumerator) new MMDeviceEnumerator();
                iMMDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out ppDevice);
                Guid iid = typeof(IAudioSessionManager2).GUID;
                ppDevice.Activate(ref iid, 0, IntPtr.Zero, out object ppInterface);
                audioSessionManager = (IAudioSessionManager2)ppInterface;
                audioSessionManager.GetSessionEnumerator(out SessionEnum);
                SessionEnum.GetCount(out int SessionCount);
                ISimpleAudioVolume result = null;
                for (int i = 0; i < SessionCount; i++)
                {
                    IAudioSessionControl2 Session = null;
                    SessionEnum.GetSession(i, out Session);
                    Session.GetProcessId(out int pRetVal);
                    if (pRetVal == pid)
                    {
                        result = (Session as ISimpleAudioVolume);
                        break;
                    }
                }
                return(result);
            }
            finally
            {
                if (SessionEnum != null)
                {
                    Marshal.ReleaseComObject(SessionEnum);
                }
                if (audioSessionManager != null)
                {
                    Marshal.ReleaseComObject(audioSessionManager);
                }
                if (ppDevice != null)
                {
                    Marshal.ReleaseComObject(ppDevice);
                }
                if (iMMDeviceEnumerator != null)
                {
                    Marshal.ReleaseComObject(iMMDeviceEnumerator);
                }
            }
        }
コード例 #23
0
        // gets volume object needed for public methods to operate
        private static ISimpleAudioVolume GetVolumeObject(uint processId)
        {
            MMDeviceEnumerator      deviceEnumerator;
            IMMDeviceEnumerator     iDeviceEnumerator;
            IMMDevice               speakers;
            IAudioSessionManager2   mgr;
            IAudioSessionEnumerator sessionEnumerator;
            int count;

            //GetVolumeControls(out deviceEnumerator, out speakers, out mgr, out sessionEnumerator, out count);
            deviceEnumerator  = new MMDeviceEnumerator();
            iDeviceEnumerator = (IMMDeviceEnumerator)deviceEnumerator;
            iDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);
            Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;

            speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out object o);
            mgr = (IAudioSessionManager2)o;
            mgr.GetSessionEnumerator(out sessionEnumerator);
            sessionEnumerator.GetCount(out count);

            ISimpleAudioVolume volumeControl = null;

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl asc;
                sessionEnumerator.GetSession(i, out asc);

                IAudioSessionControl2 asc2 = GetAudioControl2(asc);

                uint currentProcessId;

                asc2.GetProcessId(out currentProcessId);

                if (currentProcessId == processId)
                {
                    volumeControl = asc as ISimpleAudioVolume;
                    Marshal.ReleaseComObject(asc2);
                    break;
                }
                Marshal.ReleaseComObject(asc2);
                Marshal.ReleaseComObject(asc);
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            Marshal.ReleaseComObject(o);
            Marshal.ReleaseComObject(speakers);
            Marshal.ReleaseComObject(iDeviceEnumerator);
            Marshal.ReleaseComObject(deviceEnumerator);
            return(volumeControl);
        }
コード例 #24
0
        private static ISimpleAudioVolume GetVolumeObject(int pid)
        {
            // get the speakers (1st render + multimedia) device
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            IMMDevice           speakers;

            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);

            // activate the session manager. we need the enumerator
            Guid   IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
            object o;

            speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
            IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

            // enumerate sessions for on this device
            IAudioSessionEnumerator sessionEnumerator;

            mgr.GetSessionEnumerator(out sessionEnumerator);
            int count;

            sessionEnumerator.GetCount(out count);

            uint val;

            ISimpleAudioVolume volumeControl = null;

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl ctl;
                sessionEnumerator.GetSession(i, out ctl);

                IAudioSessionControl2 ctl2 = (IAudioSessionControl2)ctl;
                ctl2.GetProcessId(out val);

                if (val == pid)
                {
                    volumeControl = ctl as ISimpleAudioVolume;
                    break;
                }
                Marshal.ReleaseComObject(ctl);
                Marshal.ReleaseComObject(ctl2);
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            Marshal.ReleaseComObject(speakers);
            Marshal.ReleaseComObject(deviceEnumerator);
            return(volumeControl);
        }
コード例 #25
0
        internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
        {
            IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume     _volume = realAudioSessionControl as ISimpleAudioVolume;

            if (_meters != null)
            {
                _AudioMeterInformation = new AxVolume.AudioMeterInformation(_meters);
            }
            if (_volume != null)
            {
                _SimpleAudioVolume = new SimpleAudioVolume(_volume);
            }
            _AudioSessionControl = realAudioSessionControl;
        }
コード例 #26
0
        internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
        {
            IAudioMeterInformation realInterface    = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume     realSimpleVolume = realAudioSessionControl as ISimpleAudioVolume;

            if (realInterface != null)
            {
                this._AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(realInterface);
            }
            if (realSimpleVolume != null)
            {
                this._SimpleAudioVolume = new CoreAudioApi.SimpleAudioVolume(realSimpleVolume);
            }
            this._AudioSessionControl = realAudioSessionControl;
        }
コード例 #27
0
        internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
        {
            IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume _volume = realAudioSessionControl as ISimpleAudioVolume; 
            if (_meters != null)
                _AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(_meters);
            if (_volume != null)
                _SimpleAudioVolume = new SimpleAudioVolume(_volume);
            _AudioSessionControl = realAudioSessionControl;

            /* added -> */
            _audioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl.RegisterAudioSessionNotification(_audioSessionEvents));
            /* <- added */
        }
コード例 #28
0
 public AudioSession(IAudioSessionControl2 control)
 {
     _control = control;
     control.GetState(out var state);
     State = state;
     control.GetGroupingParam(out var guid);
     GroupingParam = guid;
     IconPath = GetString(control.GetIconPath);
     DisplayName = GetString(control.GetDisplayName);
     _icon = new Lazy<Icon>(GetIcon, true);
     _process = new Lazy<Process>(() => Process.GetProcessById(ProcessId), true);
     Id = GetString(control.GetSessionIdentifier);
     InstanceId = GetString(control.GetSessionInstanceIdentifier);
     control.GetProcessId(out var pid);
     ProcessId = pid;
     IsSystemSounds = control.IsSystemSoundsSession() == 0;
 }
コード例 #29
0
ファイル: AudioSessionControl.cs プロジェクト: wxbjs/NAudio
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="audioSessionControl"></param>
        public AudioSessionControl(IAudioSessionControl audioSessionControl)
        {
            audioSessionControlInterface  = audioSessionControl;
            audioSessionControlInterface2 = audioSessionControl as IAudioSessionControl2;

            var meters = audioSessionControlInterface as IAudioMeterInformation;
            var volume = audioSessionControlInterface as ISimpleAudioVolume;

            if (meters != null)
            {
                audioMeterInformation = new AudioMeterInformation(meters);
            }
            if (volume != null)
            {
                simpleAudioVolume = new SimpleAudioVolume(volume);
            }
        }
コード例 #30
0
        internal AudioSessionControl2(IAudioSessionControl2 realAudioSessionControl2)
        {
            _AudioSessionControl2 = realAudioSessionControl2;

            IAudioMeterInformation _meters = _AudioSessionControl2 as IAudioMeterInformation;
            ISimpleAudioVolume     _volume = _AudioSessionControl2 as ISimpleAudioVolume;

            if (_meters != null)
            {
                _AudioMeterInformation = new CoreAudio.AudioMeterInformation(_meters);
            }
            if (_volume != null)
            {
                _SimpleAudioVolume = new SimpleAudioVolume(_volume);
            }

            _AudioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl2.RegisterAudioSessionNotification(_AudioSessionEvents));
        }
コード例 #31
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="audioSessionControl"></param>
        public AudioSessionControl(IAudioSessionControl audioSessionControl)
        {
            audioSessionControlInterface  = audioSessionControl;
            audioSessionControlInterface2 = audioSessionControl as IAudioSessionControl2;

            // ReSharper disable once SuspiciousTypeConversion.Global
            var meters = audioSessionControlInterface as IAudioMeterInformation;
            // ReSharper disable once SuspiciousTypeConversion.Global
            var volume = audioSessionControlInterface as ISimpleAudioVolume;

            if (meters != null)
            {
                AudioMeterInformation = new AudioMeterInformation(meters);
            }
            if (volume != null)
            {
                SimpleAudioVolume = new SimpleAudioVolume(volume);
            }
        }
コード例 #32
0
        public AudioSessionControl2(IAudioSessionControl2 realAudioSessionControl2)
        {
            _AudioSessionControl2 = realAudioSessionControl2;

            if (_AudioSessionControl2 is IAudioMeterInformation _meters)
            {
                _AudioMeterInformation = new AudioMeterInformation(_meters);
            }

            if (_AudioSessionControl2 is ISimpleAudioVolume _volume1)
            {
                _SimpleAudioVolume = new SimpleAudioVolume(_volume1);
            }

            //IAudioVolumeLevel _volume2 = _AudioSessionControl2 as IAudioVolumeLevel;
            //if (_volume2 != null) _AudioVolumeLevel = new AudioVolumeLevel(_volume2);

            _AudioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl2.RegisterAudioSessionNotification(_AudioSessionEvents));
        }
コード例 #33
0
        internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
        {
            IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume     _volume = realAudioSessionControl as ISimpleAudioVolume;

            if (_meters != null)
            {
                _AudioMeterInformation = new CoreAudioApi.AudioMeterInformation(_meters);
            }
            if (_volume != null)
            {
                _SimpleAudioVolume = new SimpleAudioVolume(_volume);
            }
            _AudioSessionControl = realAudioSessionControl;

            /* added -> */
            _audioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl.RegisterAudioSessionNotification(_audioSessionEvents));
            /* <- added */
        }
コード例 #34
0
        public static IEnumerable <int> EnumerateApplicationPIDs()
        {
            // get the speakers (1st render + multimedia) device
            IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
            IMMDevice           speakers;

            deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);

            // activate the session manager. we need the enumerator
            Guid   IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
            object o;

            speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
            IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

            // enumerate sessions for on this device
            IAudioSessionEnumerator sessionEnumerator;

            mgr.GetSessionEnumerator(out sessionEnumerator);
            int count;

            sessionEnumerator.GetCount(out count);

            for (int i = 0; i < count; i++)
            {
                IAudioSessionControl ctl;
                sessionEnumerator.GetSession(i, out ctl);
                IAudioSessionControl2 ctl2 = ctl as IAudioSessionControl2;
                uint upid;
                ctl2.GetProcessId(out upid);
                int pid = (int)upid;
                yield return(pid);

                Marshal.ReleaseComObject(ctl);
                Marshal.ReleaseComObject(ctl2);
            }
            Marshal.ReleaseComObject(sessionEnumerator);
            Marshal.ReleaseComObject(mgr);
            Marshal.ReleaseComObject(speakers);
            Marshal.ReleaseComObject(deviceEnumerator);
        }
コード例 #35
0
 internal AudioSessionControl(IAudioSessionControl2 realAudioSessionControl)
 {
     _AudioSessionControl = realAudioSessionControl;
 }
コード例 #36
0
 internal void FireSessionCreated(IAudioSessionControl2 newSession)
 {
     if (OnSessionCreated != null) OnSessionCreated(this, newSession);
 }
コード例 #37
0
 public int OnSessionCreated(IAudioSessionControl2 NewSession)
 {
     _Parent.FireSessionCreated(NewSession);
     return 0;
 }