Exemplo n.º 1
0
        /// <summary>
        /// Registers the event client for callbacks
        /// </summary>
        private void RegisterEventClient()
        {
            UnregisterEventClient();

            _sessionEvents = new AudioSessionEvents();
            Marshal.ThrowExceptionForHR(_audioSessionControl.RegisterAudioSessionNotification(_sessionEvents));
        }
 /// <summary>
 /// Registers an even client for callbacks
 /// </summary>
 /// <param name="eventClient"></param>
 public void RegisterEventClient(IAudioSessionEventsHandler eventClient)
 {
     // we could have an array or list of listeners if we like
     audioSessionEventCallback = new AudioSessionEventsCallback(eventClient);
     Marshal.ThrowExceptionForHR(
         audioSessionControlInterface.RegisterAudioSessionNotification(audioSessionEventCallback));
 }
        internal AudioSessionControl(IAudioSessionControl realAudioSessionControl)
        {
            IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume _volume = realAudioSessionControl as ISimpleAudioVolume;
            if (_meters != null)
                _AudioMeterInformation = new CoreAudio.AudioMeterInformation(_meters);
            if (_volume != null)
                _SimpleAudioVolume = new SimpleAudioVolume(_volume);
            _AudioSessionControl = realAudioSessionControl;

            _AudioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl.RegisterAudioSessionNotification(_AudioSessionEvents));
        }
        internal AudioSessionControl(IAudioSessionControl realAudioSessionControl)
        {
            IAudioMeterInformation _meters = realAudioSessionControl as IAudioMeterInformation;
            ISimpleAudioVolume     _volume = realAudioSessionControl as ISimpleAudioVolume;

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

            //_AudioSessionEvents = new AudioSessionEvents(this);
            Marshal.ThrowExceptionForHR(_AudioSessionControl.RegisterAudioSessionNotification(_AudioSessionEvents));
        }
        /// <summary>
        /// refers
        /// https://docs.microsoft.com/en-us/windows/win32/coreaudio/volume-controls <= windows mixer theory
        /// https://docs.microsoft.com/en-us/windows/win32/medfound/managing-the-audio-session
        /// </summary>
        public void InitializeAudioSessionDict()
        {
            _audioSessionEventDict.Clear();
            AudioSessionsPid.Clear();

            //Get all session process IDs
            //refer https://gist.github.com/sverrirs/d099b34b7f72bb4fb386
            // enumerate sessions for on this device
            _audioSessionManager2.GetSessionEnumerator(out IAudioSessionEnumerator sessionEnumerator);
            sessionEnumerator.GetCount(out int count);
            // search for an audio session with the required process-id
            JoshAudioSessionStruct audioStruc;
            AudioSessionEvents     ssEvent = null;
            string iconSaveDir             = $@"C:\Users\JoshOMEN\Documents\";

            string[] fileEntries = System.IO.Directory.GetFiles(iconSaveDir);
            foreach (var iconStr in fileEntries)
            {
                if (iconStr.Contains("ico"))
                {
                    System.IO.File.Delete(iconStr);
                }
            }
            for (int i = 0; i < count; ++i)
            {
                try
                {
                    IAudioSessionControl  ctl  = null;
                    IAudioSessionControl2 ctl2 = null;

                    var revv = sessionEnumerator.GetSession(i, out ctl);
                    ssEvent    = new AudioSessionEvents();
                    audioStruc = new JoshAudioSessionStruct();
                    revv       = ctl.RegisterAudioSessionNotification(ssEvent);
                    ctl2       = ctl as IAudioSessionControl2;
                    // NOTE: we could also use the app name from ctl.GetDisplayName()
                    revv = ctl2.GetProcessId(out uint cpid);
                    ssEvent.ProcessID = cpid;

                    var pos = System.Diagnostics.Process.GetProcessById((int)cpid);
                    ssEvent.DisplayName = pos.ProcessName;
                    string fullPath      = pos.MainModule.FileName;
                    var    icon          = System.Drawing.Icon.ExtractAssociatedIcon(fullPath);
                    string iconSavedPath = $"{iconSaveDir}{ssEvent.DisplayName}.ico";
                    // Save it to disk, or do whatever you want with it.
                    using (var stream = new System.IO.FileStream(iconSavedPath, System.IO.FileMode.CreateNew))
                    {
                        icon.Save(stream);
                    }
                    ssEvent.RegisterSessionVolumeCallBack(OnSessionChangeCallBack);
                    ssEvent.RegisterSessionStateCallBack(OnSessionStateChange);
                    AudioSessionsPid.Add(new AudioSessionDataStruct()
                    {
                        SeesionPid = cpid, SessionIconPath = iconSavedPath
                    });

                    audioStruc.AudioSessionEventClass = ssEvent;
                    audioStruc.SimpleAudioControl     = ctl2 as ISimpleAudioVolume;
                    //revv = ctl2.GetDisplayName(out string names);
                    //Keep session in memory for opreation it later
                    _audioSessionEventDict.Add(ctl, audioStruc);
                }
                catch (Exception ex)
                {
                }
            }
        }