상속: ModelBase, IDisposable
        void AudioManager_NewSession(object sender, AudioSessionCreatedEventArgs e)
        {
            if (e.Session.IsSystemSoundsSession)
            {
                return;
            }

            var rHostProcessID = Process.GetCurrentProcess().Id;
            int?rProcessID     = e.Session.ProcessID;

            var rIsBrowserProcess = false;

            while (rProcessID.HasValue)
            {
                using (var rManagementObject = new ManagementObject($"Win32_Process.Handle='{rProcessID.Value}'"))
                    try
                    {
                        rManagementObject.Get();
                        rProcessID = Convert.ToInt32(rManagementObject["ParentProcessId"]);

                        if (rProcessID == rHostProcessID)
                        {
                            rIsBrowserProcess = true;
                            break;
                        }
                    }
                    catch (ManagementException rException) when(rException.ErrorCode == ManagementStatus.NotFound)
                    {
                        rProcessID = null;
                    }
            }

            if (!rIsBrowserProcess)
            {
                return;
            }

            e.Release = false;

            AudioSession?.Dispose();
            AudioSession = new BrowserAudioSession(e.Session);

            AudioManager.Instance.NewSession -= AudioManager_NewSession;
            AudioManager.Instance.StopSessionNotification();
        }
        void AudioManager_NewSession(AudioSessionCreatedEventArgs e)
        {
            if (e.Session.IsSystemSoundsSession || !IsDescendantOfHost(e.Session.ProcessID))
                return;

            e.Release = false;

            AudioSession?.Dispose();
            AudioSession = new BrowserAudioSession(e.Session);

            AudioManager.NewSession -= AudioManager_NewSession;
            AudioManager.StopSessionNotification();
        }