コード例 #1
0
        protected override void Decompose()
        {
            if (this.graphBuilder != null)
            {
                int hr = 0;

                OnGraphEnded();

                // Decompose the graph
                if (GetGraphState() != FilterState.Stopped)
                {
                    try { hr = (this.graphBuilder as IMediaControl).StopWhenReady(); }
                    catch { }
                    try { hr = (this.graphBuilder as IMediaControl).Stop(); }
                    catch { }
                }
                RemoveHandlers();


                FilterGraphTools.RemoveAllFilters(this.graphBuilder);


                if (this.filterSource != null)
                {
                    Marshal.ReleaseComObject(this.filterSource);
                }
                this.filterSource = null;
                if (this.mpeg2Demux != null)
                {
                    Marshal.ReleaseComObject(this.mpeg2Demux);
                }
                this.mpeg2Demux = null;

                if (this.audioRenderer != null)
                {
                    Marshal.ReleaseComObject(this.audioRenderer);
                }
                this.audioRenderer = null;
                if (this.videoRenderer != null)
                {
                    Marshal.ReleaseComObject(this.videoRenderer);
                }
                this.videoRenderer = null;

                try { rot.Dispose(); }
                catch { }
                try { Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null; }
                catch { }
            }
        }
コード例 #2
0
        protected override void FreeCodecs()
        {
            // Free all filters from graph
            if (_graphBuilder != null)
            {
                FilterGraphTools.RemoveAllFilters(_graphBuilder, true);
            }

            FilterGraphTools.TryDispose(ref _rot);
            FilterGraphTools.TryRelease(ref _graphBuilder);

            // Free file source
            FilterGraphTools.TryRelease(ref _fileSource);
        }
コード例 #3
0
        /// <summary>
        /// Frees the audio/video codecs.
        /// </summary>
        protected override void FreeCodecs()
        {
            // Release stream selectors
            ReleaseStreamSelectors();

            // Free all filters from graph
            if (_graphBuilder != null)
            {
                FilterGraphTools.RemoveAllFilters(_graphBuilder, true);
            }

            // Free EVR
            EvrDeinit(_presenterInstance);
            FreeEvrCallback();
            FilterGraphTools.TryRelease(ref _evr);

            FilterGraphTools.TryDispose(ref _rot);
            FilterGraphTools.TryRelease(ref _graphBuilder);
        }
コード例 #4
0
        /// <summary>
        /// Frees the audio/video codecs.
        /// </summary>
        protected override void FreeCodecs()
        {
            // Release stream selectors
            ReleaseStreamSelectors();

            // Free EVR
            SafeEvrDeinit();
            FreeEvrCallback();
            FilterGraphTools.TryRelease(ref _evr);

            base.FreeCodecs();

            // Free all filters from graph
            if (_graphBuilder != null)
            {
                FilterGraphTools.RemoveAllFilters(_graphBuilder, true);
            }

            FilterGraphTools.TryDispose(ref _mpcSubsRenderer);
            FilterGraphTools.TryDispose(ref _rot);
            FilterGraphTools.TryRelease(ref _graphBuilder, true);
        }
コード例 #5
0
ファイル: GraphBuilderTV.cs プロジェクト: zhiqiang-li/CodeTV
        protected override void Decompose()
        {
            if (this.graphBuilder != null)
            {
                int hr = 0;

                OnGraphEnded();

                // Decompose the graph
                try { hr = (this.graphBuilder as IMediaControl).StopWhenReady(); }
                catch { }
                try { hr = (this.graphBuilder as IMediaControl).Stop(); }
                catch { }
                RemoveHandlers();

                FilterGraphTools.RemoveAllFilters(this.graphBuilder);

                if (this.audioRenderer != null)
                {
                    Marshal.ReleaseComObject(this.audioRenderer);
                }
                this.audioRenderer = null;
                if (this.videoRenderer != null)
                {
                    Marshal.ReleaseComObject(this.videoRenderer);
                }
                this.videoRenderer = null;
                if (this.captureGraphBuilder != null)
                {
                    Marshal.ReleaseComObject(this.captureGraphBuilder);
                }
                this.captureGraphBuilder = null;

                try { rot.Dispose(); }
                catch { }
                try { Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null; }
                catch { }
            }
        }
コード例 #6
0
        /// <summary>
        /// Decompose the graph and release resources.
        /// </summary>
        public virtual void Dispose()
        {
            FilterState filterState;

            mediaControl.GetState(0, out filterState);
            if (filterState != FilterState.Stopped)
            {
                LogMessage("Stopping graph");
                reply = mediaControl.Stop();
                DsError.ThrowExceptionForHR(reply);
            }

            LogMessage("Removing filters");
            FilterGraphTools.RemoveAllFilters(graphBuilder);

            LogMessage("Releasing Graph Builder");
            Marshal.ReleaseComObject(graphBuilder);
            graphBuilder = null;

            LogMessage("Releasing Capture Builder");
            Marshal.ReleaseComObject(captureBuilder);
            captureBuilder = null;
        }
コード例 #7
0
        private void Decompose()
        {
            int hr = 0;

            // Decompose the graph
            hr = (this.graphBuilder as IMediaControl).StopWhenReady();
            hr = (this.graphBuilder as IMediaControl).Stop();


            FilterGraphTools.RemoveAllFilters(this.graphBuilder);

            Marshal.ReleaseComObject(this.networkProvider); this.networkProvider = null;
            Marshal.ReleaseComObject(this.mpeg2Demux); this.mpeg2Demux           = null;
            Marshal.ReleaseComObject(this.tuner); this.tuner                 = null;
            Marshal.ReleaseComObject(this.capture); this.capture             = null;
            Marshal.ReleaseComObject(this.bdaTIF); this.bdaTIF               = null;
            Marshal.ReleaseComObject(this.bdaSecTab); this.bdaSecTab         = null;
            Marshal.ReleaseComObject(this.audioRenderer); this.audioRenderer = null;
            Marshal.ReleaseComObject(this.videoRenderer); this.videoRenderer = null;

            rot.Dispose();
            Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null;
        }
コード例 #8
0
        private void HandleGraphEvent()
        {
            EventCode evCode;
            IntPtr    evParam1, evParam2;

            if (mediaEventEx == null)
            {
                return;
            }

            while (mediaEventEx.GetEvent(out evCode, out evParam1, out evParam2, 0) == 0)
            {
                mediaEventEx.FreeEventParams(evCode, evParam1, evParam2);

                if (evCode == EventCode.Complete)
                {
                    mediaControl.Stop();
                    FilterGraphTools.RemoveAllFilters(graphBuilder);
                    CloseInterfaces();

                    OnPlayerCompleted();
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Clean up, dispose, release.
        /// </summary>
        public void Dispose()
        {
            Stop();

            if (_rwsTuner != null)
            {
                _rwsTuner.Dispose();
                _rwsTuner = null;
            }
            if (_rotEntry != null)
            {
                _rotEntry.Dispose();
            }
            if (_graphBuilder != null)
            {
                FilterGraphTools.RemoveAllFilters(_graphBuilder);
                Release.ComObject("device detection graph builder", _graphBuilder);
            }
            Release.ComObject("device detection ATSC network provider", _atscNp);
            Release.ComObject("device detection DVB-C network provider", _dvbcNp);
            Release.ComObject("device detection DVB-S network provider", _dvbsNp);
            Release.ComObject("device detection DVB-T network provider", _dvbtNp);
            Release.ComObject("device detection MediaPortal network provider", _mpNp);
        }
コード例 #10
0
 public virtual void Dispose(bool disposing)
 {
     lock (_graphStateLock)
     {
         GC.SuppressFinalize(this);
         if (disposing)
         {
             FilterGraphTools.RemoveAllFilters(_graphBuilder);
             if (_graphBuilder != null)
             {
                 int refCount;
                 do
                 {
                     refCount = Marshal.ReleaseComObject(_graphBuilder);
                 } while (refCount > 0);
                 _graphBuilder = null;
                 _mediaControl = null;
             }
             if (_captureGraphBuilder != null)
             {
                 int refCount;
                 do
                 {
                     refCount = Marshal.ReleaseComObject(_captureGraphBuilder);
                 } while (refCount > 0);
                 _captureGraphBuilder = null;
             }
             if (_abortTimer != null)
             {
                 _abortTimer.Elapsed -= new System.Timers.ElapsedEventHandler(AbortTimer_Elapsed);
                 _abortTimer.Dispose();
                 _abortTimer = null;
             }
         }
     }
 }
コード例 #11
0
        /// <summary>
        /// Enumerate all tvcard devices and add them to the list
        /// </summary>
        private void DetectCards()
        {
            ITunerCap _providerType;
            bool      genericNP = false;

            //SkyStar 2 & IP Streaming
            DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.LegacyAmFilterCategory);
            for (int i = 0; i < devices.Length; ++i)
            {
                if (String.Compare(devices[i].Name, "B2C2 MPEG-2 Source", true) == 0)
                {
                    Log.Log.WriteFile("Detected SkyStar 2 card");
                    TvCardDvbSS2 card = new TvCardDvbSS2(_epgEvents, devices[i]);
                    _cards.Add(card);
                    //break;  maybe more than one B2C2 card ?
                }
                else if (String.Compare(devices[i].Name, "Elecard NWSource-Plus", true) == 0)
                {
                    TvBusinessLayer layer = new TvBusinessLayer();
                    Setting         setting;
                    setting = layer.GetSetting("iptvCardCount", "1");
                    int iptvCardCount = Convert.ToInt32(setting.Value);
                    for (int cardNum = 0; cardNum < iptvCardCount; cardNum++)
                    {
                        Log.Log.WriteFile("Detected IP TV Card " + cardNum);
                        TvCardDVBIP card = new TvCardDVBIPElecard(_epgEvents, devices[i], cardNum);
                        _cards.Add(card);
                    }
                }
                else if (String.Compare(devices[i].Name, "MediaPortal IPTV Source Filter", true) == 0)
                {
                    TvBusinessLayer layer = new TvBusinessLayer();
                    Setting         setting;
                    setting = layer.GetSetting("iptvCardCount", "1");
                    int iptvCardCount = Convert.ToInt32(setting.Value);
                    for (int cardNum = 0; cardNum < iptvCardCount; cardNum++)
                    {
                        Log.Log.WriteFile("Detected IP TV Card " + cardNum);
                        TvCardDVBIP card = new TvCardDVBIPBuiltIn(_epgEvents, devices[i], cardNum);
                        _cards.Add(card);
                    }
                }
            }
            //Hauppauge HD PVR & Colossus
            devices = DsDevice.GetDevicesOfCat(FilterCategory.AMKSCrossbar);
            for (int i = 0; i < devices.Length; ++i)
            {
                if (devices[i].Name == null)
                {
                    continue;
                }
                if (devices[i].Name.Equals("Hauppauge HD PVR Crossbar"))
                {
                    Log.Log.WriteFile("Detected Hauppauge HD PVR");
                    TvCardHDPVR card = new TvCardHDPVR(devices[i]);
                    _cards.Add(card);
                }
                else if (devices[i].Name.Contains("Hauppauge Colossus Crossbar"))
                {
                    Log.Log.WriteFile("Detected Hauppauge Colossus");
                    TvCardHDPVR card = new TvCardHDPVR(devices[i]);
                    _cards.Add(card);
                }
            }
            //BDA TV devices
            devices = DsDevice.GetDevicesOfCat(FilterCategory.BDASourceFiltersCategory);
            if (devices.Length > 0)
            {
                IFilterGraph2 graphBuilder = (IFilterGraph2) new FilterGraph();
                DsROTEntry    rotEntry     = new DsROTEntry(graphBuilder);

                Guid networkProviderClsId = new Guid("{D7D42E5C-EB36-4aad-933B-B4C419429C98}");
                if (FilterGraphTools.IsThisComObjectInstalled(networkProviderClsId))
                {
                    handleInternalNetworkProviderFilter(devices, graphBuilder, networkProviderClsId, rotEntry);
                }
                else
                {
                    ITuningSpace tuningSpace = null;
                    ILocator     locator     = null;

                    //DVBT
                    IBaseFilter networkDVBT = null;
                    try
                    {
                        networkProviderClsId = typeof(DVBTNetworkProvider).GUID;
                        networkDVBT          = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                                   "DVBT Network Provider");
                        tuningSpace = (ITuningSpace) new DVBTuningSpace();
                        tuningSpace.put_UniqueName("DVBT TuningSpace");
                        tuningSpace.put_FriendlyName("DVBT TuningSpace");
                        tuningSpace.put__NetworkType(typeof(DVBTNetworkProvider).GUID);
                        ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Terrestrial);
                        locator = (ILocator) new DVBTLocator();
                        locator.put_CarrierFrequency(-1);
                        locator.put_InnerFEC(FECMethod.MethodNotSet);
                        locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
                        locator.put_Modulation(ModulationType.ModNotSet);
                        locator.put_OuterFEC(FECMethod.MethodNotSet);
                        locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
                        locator.put_SymbolRate(-1);
                        tuningSpace.put_DefaultLocator(locator);
                        ((ITuner)networkDVBT).put_TuningSpace(tuningSpace);
                    }
                    catch (Exception ex)
                    {
                        Log.Log.Error("DVBT card detection error: {0}", ex.ToString());
                    }

                    //DVBS
                    networkProviderClsId = typeof(DVBSNetworkProvider).GUID;
                    IBaseFilter networkDVBS = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                                  "DVBS Network Provider");
                    tuningSpace = (ITuningSpace) new DVBSTuningSpace();
                    tuningSpace.put_UniqueName("DVBS TuningSpace");
                    tuningSpace.put_FriendlyName("DVBS TuningSpace");
                    tuningSpace.put__NetworkType(typeof(DVBSNetworkProvider).GUID);
                    ((IDVBSTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Satellite);
                    locator = (ILocator) new DVBTLocator();
                    locator.put_CarrierFrequency(-1);
                    locator.put_InnerFEC(FECMethod.MethodNotSet);
                    locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_Modulation(ModulationType.ModNotSet);
                    locator.put_OuterFEC(FECMethod.MethodNotSet);
                    locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_SymbolRate(-1);
                    tuningSpace.put_DefaultLocator(locator);
                    ((ITuner)networkDVBS).put_TuningSpace(tuningSpace);

                    //ATSC
                    networkProviderClsId = typeof(ATSCNetworkProvider).GUID;
                    IBaseFilter networkATSC = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                                  "ATSC Network Provider");
                    tuningSpace = (ITuningSpace) new ATSCTuningSpace();
                    tuningSpace.put_UniqueName("ATSC TuningSpace");
                    tuningSpace.put_FriendlyName("ATSC TuningSpace");
                    ((IATSCTuningSpace)tuningSpace).put_MaxChannel(10000);
                    ((IATSCTuningSpace)tuningSpace).put_MaxMinorChannel(10000);
                    ((IATSCTuningSpace)tuningSpace).put_MinChannel(0);
                    ((IATSCTuningSpace)tuningSpace).put_MinMinorChannel(0);
                    ((IATSCTuningSpace)tuningSpace).put_MinPhysicalChannel(0);
                    ((IATSCTuningSpace)tuningSpace).put_InputType(TunerInputType.Antenna);
                    locator = (IATSCLocator) new ATSCLocator();
                    locator.put_CarrierFrequency(-1);
                    locator.put_InnerFEC(FECMethod.MethodNotSet);
                    locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_Modulation(ModulationType.ModNotSet);
                    locator.put_OuterFEC(FECMethod.MethodNotSet);
                    locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_SymbolRate(-1);
                    locator.put_CarrierFrequency(-1);
                    ((IATSCLocator)locator).put_PhysicalChannel(-1);
                    ((IATSCLocator)locator).put_TSID(-1);
                    tuningSpace.put_DefaultLocator(locator);
                    ((ITuner)networkATSC).put_TuningSpace(tuningSpace);

                    //DVBC
                    networkProviderClsId = typeof(DVBCNetworkProvider).GUID;
                    IBaseFilter networkDVBC = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                                  "DVBC Network Provider");
                    tuningSpace = (ITuningSpace) new DVBTuningSpace();
                    tuningSpace.put_UniqueName("DVBC TuningSpace");
                    tuningSpace.put_FriendlyName("DVBC TuningSpace");
                    tuningSpace.put__NetworkType(typeof(DVBCNetworkProvider).GUID);
                    ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Cable);
                    locator = (ILocator) new DVBCLocator();
                    locator.put_CarrierFrequency(-1);
                    locator.put_InnerFEC(FECMethod.MethodNotSet);
                    locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_Modulation(ModulationType.ModNotSet);
                    locator.put_OuterFEC(FECMethod.MethodNotSet);
                    locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
                    locator.put_SymbolRate(-1);
                    tuningSpace.put_DefaultLocator(locator);
                    ((ITuner)networkDVBC).put_TuningSpace(tuningSpace);

                    //MS Network Provider - MCE Roll-up 2 or better
                    networkProviderClsId = typeof(NetworkProvider).GUID;
                    // First test if the Generic Network Provider is available (only on MCE 2005 + Update Rollup 2)
                    if (FilterGraphTools.IsThisComObjectInstalled(networkProviderClsId))
                    {
                        genericNP = true;
                    }
                    for (int i = 0; i < devices.Length; i++)
                    {
                        bool   connected        = false;
                        bool   isCablePreferred = false;
                        string name             = devices[i].Name ?? "unknown";
                        name = name.ToLowerInvariant();
                        Log.Log.WriteFile("Found card:{0}", name);
                        //silicondust work-around for dvb type detection issue. generic provider would always use dvb-t
                        if (name.Contains("silicondust hdhomerun tuner"))
                        {
                            isCablePreferred = CheckHDHomerunCablePrefered(name);
                            Log.Log.WriteFile("silicondust hdhomerun detected - prefer cable mode: {0}", isCablePreferred);
                        }
                        IBaseFilter tmp;
                        try
                        {
                            graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, name, out tmp);
                        }
                        catch (InvalidComObjectException)
                        {
                            //ignore bad card
                            Log.Log.WriteFile("cannot add filter {0} to graph", devices[i].Name);
                            continue;
                        }
                        //Use the Microsoft Network Provider method first but only if available
                        if (genericNP)
                        {
                            IBaseFilter networkDVB = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                                         "Microsoft Network Provider");
                            if (ConnectFilter(graphBuilder, networkDVB, tmp))
                            {
                                Log.Log.WriteFile("Detected DVB card:{0}", name);
                                // determine the DVB card supported GUIDs here!
                                _providerType = networkDVB as ITunerCap;
                                int    ulcNetworkTypesMax = 5;
                                int    pulcNetworkTypes;
                                Guid[] pguidNetworkTypes = new Guid[ulcNetworkTypesMax];
                                int    hr = _providerType.get_SupportedNetworkTypes(ulcNetworkTypesMax, out pulcNetworkTypes,
                                                                                    pguidNetworkTypes);
                                for (int n = 0; n < pulcNetworkTypes; n++)
                                {
                                    Log.Log.Debug("Detecting type by MSNP {0}: {1}", n, pguidNetworkTypes[n]);
                                    //test the first found guid to determine the DVB card type
                                    if (pguidNetworkTypes[n] == (typeof(DVBTNetworkProvider).GUID) && !isCablePreferred)
                                    {
                                        Log.Log.WriteFile("Detected DVB-T* card:{0}", name);
                                        TvCardDVBT dvbtCard = new TvCardDVBT(_epgEvents, devices[i]);
                                        _cards.Add(dvbtCard);
                                        connected = true;
                                    }
                                    else if (pguidNetworkTypes[n] == (typeof(DVBSNetworkProvider).GUID) && !isCablePreferred)
                                    {
                                        Log.Log.WriteFile("Detected DVB-S* card:{0}", name);
                                        TvCardDVBS dvbsCard = new TvCardDVBS(_epgEvents, devices[i]);
                                        _cards.Add(dvbsCard);
                                        connected = true;
                                    }
                                    else if (pguidNetworkTypes[n] == (typeof(DVBCNetworkProvider).GUID))
                                    {
                                        Log.Log.WriteFile("Detected DVB-C* card:{0}", name);
                                        TvCardDVBC dvbcCard = new TvCardDVBC(_epgEvents, devices[i]);
                                        _cards.Add(dvbcCard);
                                        connected = true;
                                    }
                                    else if (pguidNetworkTypes[n] == (typeof(ATSCNetworkProvider).GUID))
                                    {
                                        Log.Log.WriteFile("Detected ATSC* card:{0}", name);
                                        TvCardATSC dvbsCard = new TvCardATSC(_epgEvents, devices[i]);
                                        _cards.Add(dvbsCard);
                                        connected = true;
                                    }
                                    if (connected)
                                    {
                                        graphBuilder.RemoveFilter(tmp);
                                        Release.ComObject("tmp filter", tmp);
                                        break; // already found one, no need to continue
                                    }
                                    else if (n == (pulcNetworkTypes - 1))
                                    {
                                        Log.Log.WriteFile("Connected with generic MS Network Provider however network types don't match, using the original method");
                                    }
                                }
                            }
                            else
                            {
                                Log.Log.WriteFile("Not connected with generic MS Network Provider, using the original method");
                                connected = false;
                            }
                            graphBuilder.RemoveFilter(networkDVB);
                            Release.ComObject("ms provider", networkDVB);
                        }
                        if (!genericNP || !connected)
                        {
                            if (ConnectFilter(graphBuilder, networkDVBT, tmp))
                            {
                                Log.Log.WriteFile("Detected DVB-T card:{0}", name);
                                TvCardDVBT dvbtCard = new TvCardDVBT(_epgEvents, devices[i]);
                                _cards.Add(dvbtCard);
                            }
                            else if (ConnectFilter(graphBuilder, networkDVBC, tmp))
                            {
                                Log.Log.WriteFile("Detected DVB-C card:{0}", name);
                                TvCardDVBC dvbcCard = new TvCardDVBC(_epgEvents, devices[i]);
                                _cards.Add(dvbcCard);
                            }
                            else if (ConnectFilter(graphBuilder, networkDVBS, tmp))
                            {
                                Log.Log.WriteFile("Detected DVB-S card:{0}", name);
                                TvCardDVBS dvbsCard = new TvCardDVBS(_epgEvents, devices[i]);
                                _cards.Add(dvbsCard);
                            }
                            else if (ConnectFilter(graphBuilder, networkATSC, tmp))
                            {
                                Log.Log.WriteFile("Detected ATSC card:{0}", name);
                                TvCardATSC dvbsCard = new TvCardATSC(_epgEvents, devices[i]);
                                _cards.Add(dvbsCard);
                            }
                            graphBuilder.RemoveFilter(tmp);
                            Release.ComObject("tmp filter", tmp);
                        }
                    }
                    FilterGraphTools.RemoveAllFilters(graphBuilder);
                    Release.ComObject("dvbc provider", networkDVBC);
                    Release.ComObject("atsc provider", networkATSC);
                    Release.ComObject("dvbs provider", networkDVBS);
                    Release.ComObject("dvbt provider", networkDVBT);
                    rotEntry.Dispose();
                    Release.ComObject("graph builder", graphBuilder);
                }
            }
            //Analogue TV devices
            devices = DsDevice.GetDevicesOfCat(FilterCategory.AMKSTVTuner);
            for (int i = 0; i < devices.Length; i++)
            {
                string name = devices[i].Name ?? "unknown";
                name = name.ToLowerInvariant();
                Log.Log.WriteFile("Detected analog card:{0}", name);
                TvCardAnalog analogCard = new TvCardAnalog(devices[i]);
                _cards.Add(analogCard);
            }
            _cards.Add(new RadioWebStreamCard());
        }
コード例 #12
0
        private void handleInternalNetworkProviderFilter(DsDevice[] devices, IFilterGraph2 graphBuilder,
                                                         Guid networkProviderClsId, DsROTEntry rotEntry)
        {
            IDvbNetworkProvider interfaceNetworkProvider;
            TuningType          tuningTypes;

            for (int i = 0; i < devices.Length; i++)
            {
                bool   isCablePreferred = false;
                string name             = devices[i].Name ?? "unknown";
                name = name.ToLowerInvariant();
                Log.Log.WriteFile("Found card:{0}", name);
                //silicondust work-around for dvb type detection issue. generic provider would always use dvb-t
                if (name.Contains("silicondust hdhomerun tuner"))
                {
                    isCablePreferred = CheckHDHomerunCablePrefered(name);
                    Log.Log.WriteFile("silicondust hdhomerun detected - prefer cable mode: {0}", isCablePreferred);
                }
                IBaseFilter tmp;
                graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, name, out tmp);
                //Use the Microsoft Network Provider method first but only if available
                IBaseFilter networkDVB = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
                                                                             "MediaPortal Network Provider");
                interfaceNetworkProvider = (IDvbNetworkProvider)networkDVB;
                string hash = GetHash(devices[i].DevicePath);
                interfaceNetworkProvider.ConfigureLogging(GetFileName(devices[i].DevicePath), hash, LogLevelOption.Debug);
                if (ConnectFilter(graphBuilder, networkDVB, tmp))
                {
                    Log.Log.WriteFile("Detected DVB card:{0}- Hash: {1}", name, hash);
                    interfaceNetworkProvider.GetAvailableTuningTypes(out tuningTypes);
                    Log.Log.WriteFile("TuningTypes: " + tuningTypes);
                    // determine the DVB card supported GUIDs here!
                    if ((tuningTypes & TuningType.DvbT) != 0 && !isCablePreferred)
                    {
                        Log.Log.WriteFile("Detected DVB-T* card:{0}", name);
                        TvCardDVBT dvbtCard = new TvCardDVBT(_epgEvents, devices[i]);
                        _cards.Add(dvbtCard);
                    }
                    if ((tuningTypes & TuningType.DvbS) != 0 && !isCablePreferred)
                    {
                        Log.Log.WriteFile("Detected DVB-S* card:{0}", name);
                        TvCardDVBS dvbsCard = new TvCardDVBS(_epgEvents, devices[i]);
                        _cards.Add(dvbsCard);
                    }
                    if ((tuningTypes & TuningType.DvbC) != 0)
                    {
                        Log.Log.WriteFile("Detected DVB-C* card:{0}", name);
                        TvCardDVBC dvbcCard = new TvCardDVBC(_epgEvents, devices[i]);
                        _cards.Add(dvbcCard);
                    }
                    if ((tuningTypes & TuningType.Atsc) != 0 && !isCablePreferred)
                    {
                        Log.Log.WriteFile("Detected ATSC* card:{0}", name);
                        TvCardATSC dvbsCard = new TvCardATSC(_epgEvents, devices[i]);
                        _cards.Add(dvbsCard);
                    }
                }
                graphBuilder.RemoveFilter(tmp);
                Release.ComObject("tmp filter", tmp);
                graphBuilder.RemoveFilter(networkDVB);
                Release.ComObject("ms provider", networkDVB);
            }
            FilterGraphTools.RemoveAllFilters(graphBuilder);
            rotEntry.Dispose();
            Release.ComObject("graph builder", graphBuilder);
        }
コード例 #13
0
        /// <summary>
        /// Builds the graph.
        /// </summary>
        public override void BuildGraph()
        {
            try
            {
                Log.Log.WriteFile("b2c2: build graph");
                if (_graphState != GraphState.Idle)
                {
                    Log.Log.Error("b2c2: Graph already built");
                    throw new TvException("Graph already built");
                }
                DevicesInUse.Instance.Add(_tunerDevice);
                _managedThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
                _graphBuilder    = (IFilterGraph2) new FilterGraph();
                _rotEntry        = new DsROTEntry(_graphBuilder);
                _capBuilder      = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
                _capBuilder.SetFiltergraph(_graphBuilder);
                //=========================================================================================================
                // add the B2C2 specific filters
                //=========================================================================================================
                Log.Log.WriteFile("b2c2:CreateGraph() create B2C2 adapter");
                _filterB2C2Adapter =
                    Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_B2C2Adapter, false)) as IBaseFilter;
                Log.Log.WriteFile("b2c2: Filter instance: " + _filterB2C2Adapter);
                if (_filterB2C2Adapter == null)
                {
                    Log.Log.Error("b2c2:creategraph() _filterB2C2Adapter not found");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                Log.Log.WriteFile("b2c2:creategraph() add filters to graph");
                int hr = _graphBuilder.AddFilter(_filterB2C2Adapter, "B2C2-Source");
                if (hr != 0)
                {
                    Log.Log.Error("b2c2: FAILED to add B2C2-Adapter");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                // get interfaces
                _interfaceB2C2TunerCtrl = _filterB2C2Adapter as IB2C2MPEG2TunerCtrl4;
                if (_interfaceB2C2TunerCtrl == null)
                {
                    Log.Log.Error("b2c2: cannot get IB2C2MPEG2TunerCtrl4");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                _interfaceB2C2DataCtrl = _filterB2C2Adapter as IB2C2MPEG2DataCtrl6;
                if (_interfaceB2C2DataCtrl == null)
                {
                    Log.Log.Error("b2c2: cannot get IB2C2MPEG2DataCtrl6");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                hr = _interfaceB2C2DataCtrl.SelectDevice(_deviceInfo.DeviceId);
                if (hr != 0)
                {
                    Log.Log.Error("b2c2: select device failed: {0:X}", hr);
                }
                //=========================================================================================================
                // initialize B2C2 tuner
                //=========================================================================================================
                Log.Log.WriteFile("b2c2: Initialize Tuner()");
                hr = _interfaceB2C2TunerCtrl.Initialize();
                if (hr != 0)
                {
                    //System.Diagnostics.Debugger.Launch();
                    Log.Log.Error("b2c2: Tuner initialize failed:0x{0:X}", hr);
                    // if the B2C2 card is detected as analogue, it needs a device reset

                    ((IMediaControl)_graphBuilder).Stop();
                    FreeAllSubChannels();
                    FilterGraphTools.RemoveAllFilters(_graphBuilder);

                    if (_graphBuilder != null)
                    {
                        Release.ComObject("graph builder", _graphBuilder);
                        _graphBuilder = null;
                    }

                    if (_capBuilder != null)
                    {
                        Release.ComObject("capBuilder", _capBuilder);
                        _capBuilder = null;
                    }

                    DevicesInUse.Instance.Remove(_tunerDevice);

                    CardPresent = false;
                    return;
                }
                // call checklock once, the return value dont matter
                hr = _interfaceB2C2TunerCtrl.CheckLock();
                AddTsWriterFilterToGraph();
                IBaseFilter lastFilter;
                ConnectInfTeeToB2C2(out lastFilter);
                AddMdPlugs(ref lastFilter);
                if (!ConnectTsWriter(lastFilter))
                {
                    throw new TvExceptionGraphBuildingFailed("Graph building failed");
                }
                SendHwPids(new List <ushort>());
                _graphState = GraphState.Created;
            }
            catch (Exception ex)
            {
                Log.Log.Write(ex);
                Dispose();
                _graphState = GraphState.Idle;
                throw new TvExceptionGraphBuildingFailed("Graph building failed", ex);
            }
        }
コード例 #14
0
        /// <summary>
        /// Disposes this instance.
        /// </summary>
        public virtual void Dispose()
        {
            if (_graphBuilder == null)
            {
                return;
            }
            Log.Log.WriteFile("HDPVR:  Dispose()");
            if (_graphState == GraphState.TimeShifting || _graphState == GraphState.Recording)
            {
                // Stop the graph first. To ensure that the timeshift files are no longer blocked
                StopGraph();
            }
            FreeAllSubChannels();
            // Decompose the graph
            IMediaControl mediaCtl = (_graphBuilder as IMediaControl);

            if (mediaCtl == null)
            {
                throw new TvException("Can not convert graphBuilder to IMediaControl");
            }
            // Decompose the graph
            mediaCtl.Stop();
            FilterGraphTools.RemoveAllFilters(_graphBuilder);
            Log.Log.WriteFile("HDPVR:  All filters removed");
            if (_filterCrossBar != null)
            {
                while (Release.ComObject(_filterCrossBar) > 0)
                {
                }
                _filterCrossBar = null;
            }
            if (_filterCapture != null)
            {
                while (Release.ComObject(_filterCapture) > 0)
                {
                }
                _filterCapture = null;
            }
            if (_filterEncoder != null)
            {
                while (Release.ComObject(_filterEncoder) > 0)
                {
                }
                _filterEncoder = null;
            }
            if (_filterTsWriter != null)
            {
                while (Release.ComObject(_filterTsWriter) > 0)
                {
                }
                _filterTsWriter = null;
            }
            _rotEntry.Dispose();
            Release.ComObject("Graphbuilder", _graphBuilder);
            _graphBuilder = null;
            DevicesInUse.Instance.Remove(_tunerDevice);
            _graphState = GraphState.Idle;
            if (_crossBarDevice != null)
            {
                DevicesInUse.Instance.Remove(_crossBarDevice);
                _crossBarDevice = null;
            }
            if (_captureDevice != null)
            {
                DevicesInUse.Instance.Remove(_captureDevice);
                _captureDevice = null;
            }
            if (_encoderDevice != null)
            {
                DevicesInUse.Instance.Remove(_encoderDevice);
                _encoderDevice = null;
            }
            _graphState = GraphState.Idle;
            Log.Log.WriteFile("HDPVR:  dispose completed");
        }
コード例 #15
0
        /// <summary>
        /// Disposes this instance.
        /// </summary>
        public virtual void Dispose()
        {
            if (_graphBuilder == null)
            {
                return;
            }
            Log.Log.WriteFile("analog:Dispose()");
            if (!CheckThreadId())
            {
                return;
            }

            if (_graphState == GraphState.TimeShifting || _graphState == GraphState.Recording)
            {
                // Stop the graph first. To ensure that the timeshift files are no longer blocked
                StopGraph();
            }
            FreeAllSubChannels();
            IMediaControl mediaCtl = (_graphBuilder as IMediaControl);

            if (mediaCtl == null)
            {
                throw new TvException("Can not convert graphBuilder to IMediaControl");
            }
            // Decompose the graph
            mediaCtl.Stop();
            FilterGraphTools.RemoveAllFilters(_graphBuilder);
            Log.Log.WriteFile("analog:All filters removed");
            if (_tuner != null)
            {
                _tuner.Dispose();
                _tuner       = null;
                _tunerDevice = null;
            }
            if (_crossbar != null)
            {
                _crossbar.Dispose();
                _crossbar = null;
            }
            if (_tvAudio != null)
            {
                _tvAudio.Dispose();
                _tvAudio = null;
            }
            if (_capture != null)
            {
                _capture.Dispose();
                _capture = null;
            }
            if (_encoder != null)
            {
                _encoder.Dispose();
                _encoder = null;
            }
            if (_teletext != null)
            {
                _teletext.Dispose();
                _teletext = null;
            }
            if (_tsFileSink != null)
            {
                Release.ComObject("tsFileSink filter", _tsFileSink);
                _tsFileSink = null;
            }
            _rotEntry.Dispose();
            _rotEntry = null;
            Release.ComObject("Graphbuilder", _graphBuilder);
            _graphBuilder = null;
            _graphState   = GraphState.Idle;
            Log.Log.WriteFile("analog: dispose completed");
        }
コード例 #16
0
        /// <summary>
        /// Builds the graph.
        /// </summary>
        public override void BuildGraph()
        {
            try
            {
                Log.Log.WriteFile("ss2: build graph");
                if (_graphState != GraphState.Idle)
                {
                    Log.Log.Error("ss2: Graph already built");
                    throw new TvException("Graph already built");
                }
                DevicesInUse.Instance.Add(_tunerDevice);
                _managedThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
                _graphBuilder    = (IFilterGraph2) new FilterGraph();
                _rotEntry        = new DsROTEntry(_graphBuilder);
                _capBuilder      = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
                _capBuilder.SetFiltergraph(_graphBuilder);
                //=========================================================================================================
                // add the skystar 2 specific filters
                //=========================================================================================================
                Log.Log.WriteFile("ss2:CreateGraph() create B2C2 adapter");
                _filterB2C2Adapter =
                    (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(DVBSkyStar2Helper.CLSID_B2C2Adapter, false));
                if (_filterB2C2Adapter == null)
                {
                    Log.Log.Error("ss2:creategraph() _filterB2C2Adapter not found");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                Log.Log.WriteFile("ss2:creategraph() add filters to graph");
                int hr = _graphBuilder.AddFilter(_filterB2C2Adapter, "B2C2-Source");
                if (hr != 0)
                {
                    Log.Log.Error("ss2: FAILED to add B2C2-Adapter");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                // get interfaces
                _interfaceB2C2DataCtrl = _filterB2C2Adapter as DVBSkyStar2Helper.IB2C2MPEG2DataCtrl3;
                if (_interfaceB2C2DataCtrl == null)
                {
                    Log.Log.Error("ss2: cannot get IB2C2MPEG2DataCtrl3");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                _interfaceB2C2TunerCtrl = _filterB2C2Adapter as DVBSkyStar2Helper.IB2C2MPEG2TunerCtrl2;
                if (_interfaceB2C2TunerCtrl == null)
                {
                    Log.Log.Error("ss2: cannot get IB2C2MPEG2TunerCtrl3");
                    DevicesInUse.Instance.Remove(_tunerDevice);
                    return;
                }
                //=========================================================================================================
                // initialize skystar 2 tuner
                //=========================================================================================================
                Log.Log.WriteFile("ss2: Initialize Tuner()");
                hr = _interfaceB2C2TunerCtrl.Initialize();
                if (hr != 0)
                {
                    //System.Diagnostics.Debugger.Launch();
                    Log.Log.Error("ss2: Tuner initialize failed:0x{0:X}", hr);
                    // if the skystar2 card is detected as analogue, it needs a device reset

                    ((IMediaControl)_graphBuilder).Stop();
                    FreeAllSubChannels();
                    FilterGraphTools.RemoveAllFilters(_graphBuilder);

                    if (_graphBuilder != null)
                    {
                        Release.ComObject("graph builder", _graphBuilder);
                        _graphBuilder = null;
                    }

                    if (_capBuilder != null)
                    {
                        Release.ComObject("capBuilder", _capBuilder);
                        _capBuilder = null;
                    }

                    DevicesInUse.Instance.Remove(_tunerDevice);

                    /*
                     * if (initResetTries == 0)
                     * {
                     * Log.Log.Error("ss2: resetting driver");
                     * HardwareHelperLib.HH_Lib hwHelper = new HardwareHelperLib.HH_Lib();
                     * string[] deviceDriverName = new string[1];
                     * deviceDriverName[0] = DEVICE_DRIVER_NAME;
                     * hwHelper.SetDeviceState(deviceDriverName, false);
                     * hwHelper.SetDeviceState(deviceDriverName, true);
                     * initResetTries++;
                     *
                     * BuildGraph();
                     * }
                     * else
                     * {
                     * Log.Log.Error("ss2: resetting driver did not help");
                     * CardPresent = false;
                     * }
                     */
                    CardPresent = false;
                    return;
                }
                // call checklock once, the return value dont matter
                _interfaceB2C2TunerCtrl.CheckLock();
                AddTsWriterFilterToGraph();
                IBaseFilter lastFilter;
                ConnectInfTeeToSS2(out lastFilter);
                AddMdPlugs(ref lastFilter);
                if (!ConnectTsWriter(lastFilter))
                {
                    throw new TvExceptionGraphBuildingFailed("Graph building failed");
                }
                SendHwPids(new List <ushort>());
                _graphState = GraphState.Created;
            }
            catch (Exception ex)
            {
                Log.Log.Write(ex);
                Dispose();
                _graphState = GraphState.Idle;
                throw new TvExceptionGraphBuildingFailed("Graph building failed", ex);
            }
        }
コード例 #17
0
        protected override void Decompose()
        {
            if (this.graphBuilder != null)
            {
                int hr = 0;

                OnGraphEnded();

                this.epg.UnRegisterEvent();

                // Decompose the graph
                try { hr = (this.graphBuilder as IMediaControl).StopWhenReady(); }
                catch { }
                try { hr = (this.graphBuilder as IMediaControl).Stop(); }
                catch { }

                try { hr = (this.graphBuilder2 as IMediaControl).StopWhenReady(); }
                catch { }
                try { hr = (this.graphBuilder2 as IMediaControl).Stop(); }
                catch { }
                RemoveHandlers();


                FilterGraphTools.RemoveAllFilters(this.graphBuilder);
                FilterGraphTools.RemoveAllFilters(this.graphBuilder2);


                if (this.networkProvider != null)
                {
                    Marshal.ReleaseComObject(this.networkProvider);
                }
                this.networkProvider = null;
                if (this.mpeg2Demux != null)
                {
                    Marshal.ReleaseComObject(this.mpeg2Demux);
                }
                this.mpeg2Demux = null;
                if (this.mpeg2VideoStreamAnalyzer != null)
                {
                    Marshal.ReleaseComObject(this.mpeg2VideoStreamAnalyzer);
                }
                this.mpeg2VideoStreamAnalyzer = null;
                if (this.tuner != null)
                {
                    Marshal.ReleaseComObject(this.tuner);
                }
                this.tuner = null;
                if (this.capture != null)
                {
                    Marshal.ReleaseComObject(this.capture);
                }
                this.capture = null;
                if (this.bdaTIF != null)
                {
                    Marshal.ReleaseComObject(this.bdaTIF);
                }
                this.bdaTIF = null;
                if (this.bdaSecTab != null)
                {
                    Marshal.ReleaseComObject(this.bdaSecTab);
                }
                this.bdaSecTab = null;
                if (this.audioDecoderFilter != null)
                {
                    Marshal.ReleaseComObject(this.audioDecoderFilter);
                }
                this.audioDecoderFilter = null;
                if (this.videoH264DecoderFilter != null)
                {
                    Marshal.ReleaseComObject(this.videoH264DecoderFilter);
                }
                this.videoH264DecoderFilter = null;
                if (this.videoMpeg2DecoderFilter != null)
                {
                    Marshal.ReleaseComObject(this.videoMpeg2DecoderFilter);
                }
                this.videoMpeg2DecoderFilter = null;
                if (this.audioRenderer != null)
                {
                    Marshal.ReleaseComObject(this.audioRenderer);
                }
                this.audioRenderer = null;
                if (this.videoRenderer != null)
                {
                    Marshal.ReleaseComObject(this.videoRenderer);
                }
                this.videoRenderer = null;
                if (this.captureGraphBuilder != null)
                {
                    Marshal.ReleaseComObject(this.captureGraphBuilder);
                }
                this.captureGraphBuilder = null;
                if (this.streamBufferSink != null)
                {
                    Marshal.ReleaseComObject(this.streamBufferSink);
                }
                this.streamBufferSink = null;
                if (this.streamBufferSource != null)
                {
                    Marshal.ReleaseComObject(this.streamBufferSource);
                }
                this.streamBufferSource = null;

                if (streamBufferConfigHKey != IntPtr.Zero)
                {
                    RegCloseKey(streamBufferConfigHKey);
                    streamBufferConfigHKey = IntPtr.Zero;
                }

                try { rot.Dispose(); }
                catch { }
                try { Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null; }
                catch { }

                try { rot2.Dispose(); }
                catch { }
                try { Marshal.ReleaseComObject(this.graphBuilder2); this.graphBuilder2 = null; }
                catch { }
            }
        }