示例#1
0
        private void Cleanup()
        {
            if (_graphBuilder == null || (VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9.isCurrentStopping))
            {
                return;
            }
            int hr;

            using (Settings xmlreader = new MPSettings())
            {
                int    codecValue = 0;
                string codecType  = "";
                codecType = xmlreader.GetValueAsString("dvdplayer", "videocodec", "");
                if (codecType == "InterVideo Video Decoder")
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "intervideo", 1);
                    Log.Info("DVDPlayer9:Resetting InterVideo DXVA to {0}", codecValue);
                    using (
                        RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"Software\InterVideo\Common\VideoDec\MediaPortal"))
                    {
                        subkey.SetValue("DXVA", codecValue);
                    }
                }
                if (codecType.StartsWith("CyberLink Video/SP Decoder"))
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "cyberlink", 1);
                    Log.Info("DVDPlayer9:Resetting CyberLink DXVA to {0}", codecValue);
                    using (RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"Software\Cyberlink\Common\CLVSD\MediaPortal"))
                    {
                        subkey.SetValue("UIUseHVA", codecValue);
                    }
                }
                if (codecType == "NVIDIA Video Decoder")
                {
                    codecValue = xmlreader.GetValueAsInt("videocodec", "nvidia", 1);
                    Log.Info("DVDPlayer9:Resetting NVIDIA DXVA to {0}", codecValue);
                    using (RegistryKey subkey = Registry.LocalMachine.CreateSubKey(@"Software\NVIDIA Corporation\Filters\Video"))
                    {
                        subkey.SetValue("EnableDXVA", codecValue);
                    }
                }
            }
            try
            {
                Log.Info("DVDPlayer9: cleanup DShow graph");

                _state = PlayState.Stopped;
                VMR9Util.g_vmr9.EVRSetDVDMenuState(false);

                if (VMR9Util.g_vmr9 != null)
                {
                    VMR9Util.g_vmr9.Vmr9MediaCtrl(_mediaCtrl);
                    VMR9Util.g_vmr9.Enable(false);
                }

                if (_mediaEvt != null)
                {
                    hr = _mediaEvt.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
                }

                if (VMR9Util.g_vmr9 != null && VMR9Util.g_vmr9._vmr9Filter != null)
                {
                    MadvrInterface.EnableExclusiveMode(false, VMR9Util.g_vmr9._vmr9Filter);
                    DirectShowUtil.DisconnectAllPins(_graphBuilder, VMR9Util.g_vmr9._vmr9Filter);
                    Log.Info("DVDPlayer9: Cleanup VMR9");
                }

                // Clean post process
                PostProcessingEngine.GetInstance().FreePostProcess();
                AudioPostEngine.GetInstance().FreePostProcess();

                if (_videoWin != null && GUIGraphicsContext.VideoRenderer != GUIGraphicsContext.VideoRendererType.madVR)
                {
                    _videoWin.put_Owner(IntPtr.Zero);
                    _videoWin.put_Visible(OABool.False);
                }

                _mediaCtrl  = null;
                _visible    = false;
                _dvdCtrl    = null;
                _dvdInfo    = null;
                _videoWin   = null;
                _basicVideo = null;
                _basicAudio = null;
                _mediaPos   = null;
                _pendingCmd = false;

                if (_cmdOption != null)
                {
                    DirectShowUtil.FinalReleaseComObject(_cmdOption);
                    _cmdOption = null;
                }

                if (_dvdbasefilter != null)
                {
                    DirectShowUtil.FinalReleaseComObject(_dvdbasefilter);
                    _dvdbasefilter = null;
                }

                if (_dvdGraph != null)
                {
                    DirectShowUtil.FinalReleaseComObject(_dvdGraph);
                    _dvdGraph = null;
                }

                if (_line21Decoder != null)
                {
                    DirectShowUtil.FinalReleaseComObject(_line21Decoder);
                    _line21Decoder = null;
                }

                if (_graphBuilder != null)
                {
                    DirectShowUtil.RemoveFilters(_graphBuilder);
                    // _rotEntry has a reference to _graphBuilder (see _rotEntry ctor)
                    // so, release of _rotEntry must be before _graphBuilder is released
                    if (_rotEntry != null)
                    {
                        _rotEntry.SafeDispose();
                        _rotEntry = null;
                    }
                    DirectShowUtil.FinalReleaseComObject(_graphBuilder);
                    _graphBuilder = null;
                }

                if (VMR9Util.g_vmr9 != null)
                {
                    VMR9Util.g_vmr9.SafeDispose();
                    VMR9Util.g_vmr9 = null;
                }

                _state = PlayState.Init;
            }
            catch (Exception ex)
            {
                if (VMR9Util.g_vmr9 != null)
                {
                    VMR9Util.g_vmr9.RestoreGuiForMadVr();
                    VMR9Util.g_vmr9.SafeDispose();
                }
                Log.Error("DVDPlayer9: Exception while cleanuping DShow graph - {0} {1}", ex.Message, ex.StackTrace);
            }
            Log.Info("DVDPlayer9: Disabling DX9 exclusive mode");
            GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_SWITCH_FULL_WINDOWED, 0, 0, 0, 0, 0, null);

            GUIWindowManager.SendMessage(msg);
        }