public AudioDeviceSessionCollection(IAudioDevice parent, IMMDevice device)
        {
            Trace.WriteLine($"AudioDeviceSessionCollection Create dev={device.GetId()}");

            _parent     = new WeakReference <IAudioDevice>(parent);
            _dispatcher = App.Current.Dispatcher;

            Task.Factory.StartNew(() =>
            {
                try
                {
                    _sessionManager = device.Activate <IAudioSessionManager2>();
                    _sessionManager.RegisterSessionNotification(this);
                    var enumerator = _sessionManager.GetSessionEnumerator();
                    int count      = enumerator.GetCount();
                    for (int i = 0; i < count; i++)
                    {
                        CreateAndAddSession(enumerator.GetSession(i));
                    }
                }
                catch (Exception ex)
                {
                    Trace.TraceError($"{ex}");
                }
            });
        }
示例#2
0
        private void RegisterNotifications()
        {
            UnregisterNotifications();

            _audioSessionNotification = new AudioSessionNotification();
            Marshal.ThrowExceptionForHR(_audioSessionManager2.RegisterSessionNotification(_audioSessionNotification));
        }
示例#3
0
        public void RefreshSessions()
        {
            UnregisterNotifications();

            Marshal.ThrowExceptionForHR(_AudioSessionManager2.GetSessionEnumerator(out IAudioSessionEnumerator _SessionEnum));
            _Sessions = new SessionCollection(_SessionEnum);

            _AudioSessionNotification = new AudioSessionNotification(this);
            Marshal.ThrowExceptionForHR(_AudioSessionManager2.RegisterSessionNotification(_AudioSessionNotification));
        }
示例#4
0
        /// <summary>
        /// Refresh session of current device.
        /// </summary>
        public void RefreshSessions()
        {
            UnregisterNotifications();

            if (audioSessionInterface2 != null)
            {
                Marshal.ThrowExceptionForHR(audioSessionInterface2.GetSessionEnumerator(out var sessionEnum));
                sessions = new SessionCollection(sessionEnum);

                audioSessionNotification = new AudioSessionNotification(this);
                Marshal.ThrowExceptionForHR(audioSessionInterface2.RegisterSessionNotification(audioSessionNotification));
            }
        }
        void InitializeAudioSessions()
        {
            if (_audioDataFlow == AudioDataFlow.eCapture)
            {
                return;
            }

            //Get Session manager
            var result = _audioDevice.Activate(typeof(IAudioSessionManager2).GUID, ClsCtx.ALL, IntPtr.Zero, out object obj);

            _audioSessionManager2 = (IAudioSessionManager2)obj;
            //Register event for get session creation
            sessionNotify = new AudioSessionNotification();
            _audioSessionManager2.RegisterSessionNotification(sessionNotify);
            InitializeAudioSessionDict();
        }
        public AudioDeviceSessionCollection(IAudioDevice parent, IMMDevice device, Dispatcher foregroundDispatcher)
        {
            _parent     = new WeakReference <IAudioDevice>(parent);
            _dispatcher = foregroundDispatcher;

            try
            {
                _sessionManager = device.Activate <IAudioSessionManager2>();
                _sessionManager.RegisterSessionNotification(this);
                var enumerator = _sessionManager.GetSessionEnumerator();
                int count      = enumerator.GetCount();
                for (int i = 0; i < count; i++)
                {
                    CreateAndAddSession(enumerator.GetSession(i));
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine($"AudioDeviceSessionCollection Create dev={device.GetId()} {ex}");
            }
        }
        public CoreAudioSessionController(CoreAudioDevice device, IAudioSessionManager2 audioSessionManager)
        {
            if (audioSessionManager == null)
            {
                throw new ArgumentNullException(nameof(audioSessionManager));
            }

            ComThread.Assert();

            _device = device;
            _audioSessionManager = audioSessionManager;
            _audioSessionManager.RegisterSessionNotification(this);
            _sessionCache = new List <CoreAudioSession>(0);

            _sessionCreated      = new Broadcaster <IAudioSession>();
            _sessionDisconnected = new Broadcaster <string>();

            RefreshSessions();

            _processTerminatedSubscription = ProcessMonitor.ProcessTerminated.Subscribe(processId =>
            {
                RemoveSessions(_sessionCache.Where(x => x.ProcessId == processId));
            });
        }