Example #1
0
        private void TestNext()
        {
            int hr = 0;

            ITuningSpace[] ts = new ITuningSpace[5];
            int            fetched;
            int            validObj = 0;
            IntPtr         ip       = Marshal.AllocCoTaskMem(4);

            hr      = enumTS.Next(ts.Length, ts, ip);
            fetched = Marshal.ReadInt32(ip);
            Marshal.FreeCoTaskMem(ip);

            DsError.ThrowExceptionForHR(hr);

            for (int i = 0; i < fetched; i++)
            {
                if (ts[i] != null)
                {
                    validObj++;
                    Marshal.ReleaseComObject(ts[i]);
                }
            }

            Debug.Assert(validObj == fetched, "IEnumTuningSpaces.Next");
        }
        public void BuildGraph(ITuningSpace tuningSpace)
        {
            this.graphBuilder = (IFilterGraph2) new FilterGraph();
              rot = new DsROTEntry(this.graphBuilder);

              // Method names should be self explanatory
              AddNetworkProviderFilter(tuningSpace);
              AddMPEG2DemuxFilter();
              AddAndConnectBDABoardFilters();
              AddTransportStreamFiltersToGraph();
              AddRenderers();
              ConfigureVMR9InWindowlessMode();
              ConnectFilters();
        }
Example #3
0
        public void BuildGraph(ITuningSpace tuningSpace)
        {
            this.graphBuilder = (IFilterGraph2) new FilterGraph();
            rot = new DsROTEntry(this.graphBuilder);

            // Method names should be self explanatory
            AddNetworkProviderFilter(tuningSpace);
            AddMPEG2DemuxFilter();
            AddAndConnectBDABoardFilters();
            AddTransportStreamFiltersToGraph();
            AddRenderers();
            ConfigureVMR9InWindowlessMode();
            ConnectFilters();
        }
Example #4
0
        public static ITuningSpace GetTuningSpace(BDANetworkType type)
        {
            int          hr = 0;
            ITuningSpace ts = null;

            switch (type)
            {
            case BDANetworkType.ATSC:
            {
                ts = (ITuningSpace) new ATSCTuningSpace();
                hr = ts.put_UniqueName(type.ToString() + "TuningSpace");
                hr = ts.put_FriendlyName(type.ToString() + "TuningSpace");
                hr = ts.put__NetworkType(typeof(ATSCNetworkProvider).GUID);
                break;
            }

            case BDANetworkType.DVBT:
            {
                ts = (ITuningSpace) new DVBTuningSpace();
                hr = ts.put_UniqueName(type.ToString() + "TuningSpace");
                hr = ts.put_FriendlyName(type.ToString() + "TuningSpace");
                hr = ts.put__NetworkType(typeof(DVBTNetworkProvider).GUID);
                hr = (ts as IDVBTuningSpace).put_SystemType(DVBSystemType.Terrestrial);
                break;
            }

            case BDANetworkType.DVBS:
            {
                ts = (ITuningSpace) new DVBSTuningSpace();
                hr = ts.put_UniqueName(type.ToString() + "TuningSpace");
                hr = ts.put_FriendlyName(type.ToString() + "TuningSpace");
                hr = ts.put__NetworkType(typeof(DVBSNetworkProvider).GUID);
                hr = (ts as IDVBTuningSpace).put_SystemType(DVBSystemType.Satellite);
                break;
            }

            case BDANetworkType.DVBC:
            {
                throw new NotImplementedException();
            }

            case BDANetworkType.OpenCable:
            {
                throw new NotImplementedException();
            }
            }

            return(ts);
        }
Example #5
0
        private void Config()
        {
            int hr = 0;
            ITuningSpaceContainer tsContainer = (ITuningSpaceContainer) new SystemTuningSpaces();
            ITuningSpace          ts          = null;

            // The third System TuningSpace is an ATSC one...
            // see HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Tuning Spaces\3
            hr = tsContainer.get_Item(3, out ts);
            DsError.ThrowExceptionForHR(hr);

            tuningSpace = (IATSCTuningSpace)ts;

            Marshal.ReleaseComObject(tsContainer);
        }
Example #6
0
        public static ITuneRequest CreateTuneRequest(ITuningSpace ts)
        {
            int          hr = 0;
            ITuneRequest tr = null;
            Guid         networkType;

            hr = ts.CreateTuneRequest(out tr);
            DsError.ThrowExceptionForHR(hr);

            hr = ts.get__NetworkType(out networkType);

            if (networkType == typeof(ATSCNetworkProvider).GUID)
            {
                // I know nothing about ATSC so thoses lines are pure speculation
                hr = (tr as IATSCChannelTuneRequest).put_Channel(-1);

                IATSCLocator locator = (IATSCLocator) new ATSCLocator();
                hr = locator.put_CarrierFrequency(-1);
                hr = tr.put_Locator(locator as ILocator);
            }
            else if (networkType == typeof(DVBTNetworkProvider).GUID)
            {
                hr = (tr as IDVBTuneRequest).put_ONID(-1);
                hr = (tr as IDVBTuneRequest).put_TSID(-1);
                hr = (tr as IDVBTuneRequest).put_SID(-1);

                IDVBTLocator locator = (IDVBTLocator) new DVBTLocator();
                hr = locator.put_CarrierFrequency(-1);
                hr = tr.put_Locator(locator as ILocator);
            }
            else if (networkType == typeof(DVBSNetworkProvider).GUID)
            {
                hr = (tr as IDVBTuneRequest).put_ONID(-1);
                hr = (tr as IDVBTuneRequest).put_TSID(-1);
                hr = (tr as IDVBTuneRequest).put_SID(-1);

                IDVBSLocator locator = (IDVBSLocator) new DVBSLocator();
                hr = locator.put_CarrierFrequency(-1);
                hr = locator.put_SymbolRate(-1);
                hr = tr.put_Locator(locator as ILocator);
            }

            return(tr);
        }
Example #7
0
        /// <summary>
        /// Finds the ATSC Tuning space in the System Tuning Spaces and returns it
        /// </summary>
        /// <returns>an ITuningSpace, which is the System Tuning Spaces</returns>
        private ITuningSpace GetTuningSpace()
        {
            ITuningSpaceContainer system = (ITuningSpaceContainer) new SystemTuningSpaces();

            try
            {
                IEnumTuningSpaces systemEnum;
                int hr = system.get_EnumTuningSpaces(out systemEnum);
                DsError.ThrowExceptionForHR(hr);

                IntPtr retreivedSpaceCount = Marshal.AllocCoTaskMem(4);
                try
                {
                    ITuningSpace[] retreivedSpaces = new ITuningSpace[1];
                    do
                    {
                        hr = systemEnum.Next(1, retreivedSpaces, retreivedSpaceCount);
                        DsError.ThrowExceptionForHR(hr);

                        if (Marshal.ReadInt32(retreivedSpaceCount) > 0)
                        {
                            Guid networkType;
                            hr = retreivedSpaces[0].get__NetworkType(out networkType);
                            DsError.ThrowExceptionForHR(hr);
                            if (networkType.Equals(CLSID_ATSCNetworkProvider))
                            {
                                return(retreivedSpaces[0]);
                            }
                        }
                    } while (Marshal.ReadInt32(retreivedSpaceCount) > 0);
                }
                finally
                {
                    Marshal.FreeCoTaskMem(retreivedSpaceCount);
                }

                throw new Exception("Could not locate ATSC Tuning Space!");
            }
            finally
            {
                Marshal.ReleaseComObject(system);
            }
        }
Example #8
0
        private void AddNetworkProviderFilter(ITuningSpace tuningSpace)
        {
            int  hr = 0;
            Guid genProviderClsId = new Guid("{B2F3A67C-29DA-4C78-8831-091ED509A475}");
            Guid networkProviderClsId;

            // First test if the Generic Network Provider is available (only on MCE 2005 + Update Rollup 2)
            if (FilterGraphTools.IsThisComObjectInstalled(genProviderClsId))
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, genProviderClsId, "Generic Network Provider");

                hr = (this.networkProvider as ITuner).put_TuningSpace(tuningSpace);
                return;
            }

            // Get the network type of the requested Tuning Space
            hr = tuningSpace.get__NetworkType(out networkProviderClsId);

            // Get the network type of the requested Tuning Space
            if (networkProviderClsId == typeof(DVBTNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBT Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBSNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBS Network Provider");
            }
            else if (networkProviderClsId == typeof(ATSCNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "ATSC Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBCNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBC Network Provider");
            }
            else
            {
                // Tuning Space can also describe Analog TV but this application don't support them
                throw new ArgumentException("This application doesn't support this Tuning Space");
            }

            hr = (this.networkProvider as ITuner).put_TuningSpace(tuningSpace);
        }
Example #9
0
        protected override ITuningSpace GetTuningSpace()
        {
            ITuningSpaceContainer system = (ITuningSpaceContainer) new SystemTuningSpaces();

            IntPtr retreivedSpaceCount = Marshal.AllocCoTaskMem(4);

            try
            {
                IEnumTuningSpaces systemEnum;
                int hr = system.get_EnumTuningSpaces(out systemEnum);
                DsError.ThrowExceptionForHR(hr);

                ITuningSpace[] retreivedSpaces = new ITuningSpace[1];
                do
                {
                    hr = systemEnum.Next(1, retreivedSpaces, retreivedSpaceCount);
                    DsError.ThrowExceptionForHR(hr);

                    if (Marshal.ReadInt32(retreivedSpaceCount) > 0)
                    {
                        Guid networkType;
                        hr = retreivedSpaces[0].get__NetworkType(out networkType);
                        //string name;
                        //retreivedSpaces[0].get_FriendlyName(out name);
                        //Debug.WriteLine("  found \"" + name + "\", network type: " + networkType.ToString());
                        DsError.ThrowExceptionForHR(hr);
                        if (networkType.Equals(CLSID_ATSCNetworkProvider))
                        {
                            return(retreivedSpaces[0]);
                        }
                    }
                } while (Marshal.ReadInt32(retreivedSpaceCount) > 0);

                throw new Exception("Could not locate ATSC Tuning Space!");
            }
            finally
            {
                ReleaseComObject(system);
                Marshal.FreeCoTaskMem(retreivedSpaceCount);
            }
        }
        private void BuildSinkGraph(ITuningSpace tuningSpace)
        {
            this.graphBuilder = (IFilterGraph2) new FilterGraph();
            this.rot          = new DsROTEntry(this.graphBuilder);

            this.epg = new EPG(this.hostingControl);

            this.cookiesSink = this.hostingControl.SubscribeEvents(this as VideoControl.IVideoEventHandler, this.graphBuilder as IMediaEventEx);

            AddNetworkProviderFilter(this.objTuningSpace);
            AddMPEG2DemuxFilter();
            AddMpeg2VideoStreamAnalyzerFilter();
            CreateMPEG2DemuxPins();

            AddAndConnectBDABoardFilters();
            if (this.tuner == null && this.capture == null)
            {
                throw new ApplicationException("No BDA devices found!");
            }

            if (this.H264DecoderDevice != null || !isH264ElecardSpecialMode)
            {
                //+++ This order is to avoid a bug from the DirectShow
                AddAndConnectSectionsAndTablesFilterToGraph();

                IMpeg2Data   mpeg2Data = this.bdaSecTab as IMpeg2Data;
                ISectionList ppSectionList;
                int          hr2 = mpeg2Data.GetTable(0, 0, null, 0, out ppSectionList);

                AddAndConnectTIFToGraph();
                //---
            }

            ConfigureTimeShiftingRegistry();

            AddStreamBufferSinkFilter();
            ConnectStreamBufferSinkFilter();

            this.epg.RegisterEvent(TransportInformationFilter as IConnectionPointContainer);
        }
Example #11
0
        public void UpdateService(string serviceId, ITuningSpace tuningSpace, IGuideData guideData)
        {
            Trace.WriteLineIf(trace.TraceInfo, "EPG.UpdateService(" + serviceId + ")");
            if (serviceId == null)
            {
                UpdateAllService(guideData);
            }
            else if (tuningSpace != null && NeedServiceUpdate(serviceId))
            {
                // serviceId = "ONID:TSID:SID"
                string[] serviceIds = serviceId.Split(new char[] { ':' });
                int      onid       = int.Parse(serviceIds[0]);
                int      tsid       = int.Parse(serviceIds[1]);
                int      sid        = int.Parse(serviceIds[2]);

                ITuneRequest tr;
                tuningSpace.CreateTuneRequest(out tr);
                IDVBTuneRequest tuneRequest = (IDVBTuneRequest)tr;
                tuneRequest.put_ONID(onid);
                tuneRequest.put_TSID(tsid);
                tuneRequest.put_SID(sid);
                UpdateService(tuneRequest, guideData);
            }
        }
Example #12
0
        private void createTuneRequest(ITuningSpace tuningSpace, TuningSpec tuningSpec)
        {
            reply = tuningSpace.CreateTuneRequest(out tuneRequest);
            DsError.ThrowExceptionForHR(reply);

            if (tuningSpec.Frequency.TunerType == TunerType.Satellite ||
                tuningSpec.Frequency.TunerType == TunerType.Terrestrial ||
                tuningSpec.Frequency.TunerType == TunerType.Cable)
            {
                LogMessage("Creating DVB tune request");

                reply = ((IDVBTuneRequest)tuneRequest).put_ONID(-1);
                DsError.ThrowExceptionForHR(reply);

                reply = ((IDVBTuneRequest)tuneRequest).put_TSID(-1);
                DsError.ThrowExceptionForHR(reply);

                reply = ((IDVBTuneRequest)tuneRequest).put_SID(-1);
                DsError.ThrowExceptionForHR(reply);
            }
            else
            {
                if (tuningSpec.Frequency.TunerType == TunerType.ATSC || tuningSpec.Frequency.TunerType == TunerType.ATSCCable)
                {
                    LogMessage("Creating ATSC tune request");

                    reply = ((IATSCChannelTuneRequest)tuneRequest).put_Channel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCChannelTuneRequest)tuneRequest).put_MinorChannel(-1);
                    DsError.ThrowExceptionForHR(reply);
                }
                else
                {
                    if (tuningSpec.Frequency.TunerType == TunerType.ClearQAM)
                    {
                        LogMessage("Creating Clear QAM tune request");

                        reply = ((IDigitalCableTuneRequest)tuneRequest).put_Channel(-1);
                        DsError.ThrowExceptionForHR(reply);

                        reply = ((IDigitalCableTuneRequest)tuneRequest).put_MinorChannel(-1);
                        DsError.ThrowExceptionForHR(reply);
                    }
                    else
                    {
                        if (tuningSpec.Frequency.TunerType == TunerType.ISDBS ||
                            tuningSpec.Frequency.TunerType == TunerType.ISDBT)
                        {
                            LogMessage("Creating ISDB tune request");

                            reply = ((IDVBTuneRequest)tuneRequest).put_ONID(-1);
                            DsError.ThrowExceptionForHR(reply);

                            reply = ((IDVBTuneRequest)tuneRequest).put_TSID(-1);
                            DsError.ThrowExceptionForHR(reply);

                            reply = ((IDVBTuneRequest)tuneRequest).put_SID(-1);
                            DsError.ThrowExceptionForHR(reply);
                        }
                    }
                }
            }

            reply = tuneRequest.put_Locator(getLocator(tuningSpec));
            DsError.ThrowExceptionForHR(reply);
        }
Example #13
0
        private void createTuningSpace(TuningSpec tuningSpec)
        {
            switch (tuningSpec.Frequency.TunerType)
            {
                case TunerType.Satellite:
                {
                    LogMessage("Creating DVB Satellite tuning space");

                    tuningSpace = (ITuningSpace)new DVBSTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector DVB-S Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector DVB-S Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_HighOscillator(((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBHighBandFrequency);
                    DsError.ThrowExceptionForHR(reply);

                    if (((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency != 0)
                        reply = ((IDVBSTuningSpace)tuningSpace).put_LNBSwitch(((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency);
                    else
                        reply = ((IDVBSTuningSpace)tuningSpace).put_LNBSwitch(20000000);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_LowOscillator(((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBLowBandFrequency);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_NetworkID(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(new Guid("fa4b375a-45b4-4d45-8440-263957b11623"));
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_SpectralInversion(SpectralInversion.NotSet);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Satellite);
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Tuning Space LNB Low: " + ((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBLowBandFrequency.ToString());
                    LogMessage("Tuning Space LNB High: " + ((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBHighBandFrequency.ToString());
                    LogMessage("Tuning Space LNB Switch: " + ((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency.ToString());

                    reply = ((IDVBSTuningSpace)tuningSpace).put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    break;
                }
                case TunerType.Terrestrial:
                {
                    LogMessage("Creating DVB Terrestrial tuning space");

                    tuningSpace = (IDVBTuningSpace)new DVBTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector DVB-T Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector DVB-T Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(new Guid("216c62df-6d7f-4e9a-8571-05f14edb766a"));
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Terrestrial);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    break;
                }
                case TunerType.Cable:
                {
                    LogMessage("Creating DVB Cable tuning space");

                    tuningSpace = (IDVBTuningSpace)new DVBTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector DVB-C Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector DVB-C Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(typeof(DVBCNetworkProvider).GUID);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.Cable);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    break;
                }
                case TunerType.ATSC:
                {
                    LogMessage("Creating ATSC Terrestrial tuning space");

                    tuningSpace = (IATSCTuningSpace)new ATSCTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector ATSC Terrestrial Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector ATSC Terrestrial Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(typeof(ATSCNetworkProvider).GUID);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_InputType(TunerInputType.Antenna);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxMinorChannel(999);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxPhysicalChannel(69);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxChannel(99);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinMinorChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinPhysicalChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxPhysicalChannel(999);
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Tuning Space Max Physical Channel: 69");

                    break;
                }
                case TunerType.ATSCCable:
                {
                    LogMessage("Creating ATSC Cable tuning space");

                    tuningSpace = (IATSCTuningSpace)new ATSCTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector ATSC Cable Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector ATSC Cable Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_InputType(TunerInputType.Cable);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxMinorChannel(999);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxPhysicalChannel(158);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MaxChannel(9999);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinMinorChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinPhysicalChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IATSCTuningSpace)tuningSpace).put_MinChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(typeof(ATSCNetworkProvider).GUID);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Tuning Space Max Physical Channel: 158");

                    break;
                }
                case TunerType.ClearQAM:
                {
                    LogMessage("Creating Clear QAM tuning space");

                    tuningSpace = (IDigitalCableTuningSpace)new DigitalCableTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector Clear QAM Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector Clear QAM Tuning Space");
                        DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_InputType(TunerInputType.Cable);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MaxChannel(9999);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MaxMajorChannel(99);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MaxMinorChannel(999);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MaxPhysicalChannel(158);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MaxSourceID(0x7fffffff);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MinChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MinMajorChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MinMinorChannel(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MinPhysicalChannel(2);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDigitalCableTuningSpace)tuningSpace).put_MinSourceID(0);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(new Guid("143827ab-f77b-498d-81ca-5a007aec28bf"));
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Tuning Space Max Physical Channel: 158");

                    break;
                }
                case TunerType.ISDBS:
                {
                    LogMessage("Creating ISDB Satellite tuning space");

                    tuningSpace = (ITuningSpace)new DVBSTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector ISDB-S Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector ISDB-S Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_HighOscillator(((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBHighBandFrequency);
                    DsError.ThrowExceptionForHR(reply);

                    if (((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency != 0)
                        reply = ((IDVBSTuningSpace)tuningSpace).put_LNBSwitch(((SatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency);
                    else
                        reply = ((IDVBSTuningSpace)tuningSpace).put_LNBSwitch(20000000);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_LowOscillator(((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBLowBandFrequency);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_NetworkID(-1);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(new Guid("b0a4e6a0-6a1a-4b83-bb5b-903e1d90e6b6"));
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBSTuningSpace)tuningSpace).put_SpectralInversion(SpectralInversion.NotSet);
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.ISDBS);
                    DsError.ThrowExceptionForHR(reply);

                    LogMessage("Tuning Space LNB Low: " + ((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBLowBandFrequency.ToString());
                    LogMessage("Tuning Space LNB High: " + ((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBHighBandFrequency.ToString());
                    LogMessage("Tuning Space LNB Switch: " + ((ISDBSatelliteFrequency)tuningSpec.Frequency).SatelliteDish.LNBSwitchFrequency.ToString());

                    reply = ((IDVBSTuningSpace)tuningSpace).put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    break;
                }
                case TunerType.ISDBT:
                {
                    LogMessage("Creating ISDB Terrestrial tuning space");

                    tuningSpace = (IDVBTuningSpace)new DVBTuningSpace();

                    reply = tuningSpace.put_UniqueName("EPG Collector ISDB-T Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_FriendlyName("EPG Collector ISDB-T Tuning Space");
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put__NetworkType(new Guid("95037f6f-3ac7-4452-b6c4-45a9ce9292a2"));
                    DsError.ThrowExceptionForHR(reply);

                    reply = ((IDVBTuningSpace)tuningSpace).put_SystemType(DVBSystemType.ISDBT);
                    DsError.ThrowExceptionForHR(reply);

                    reply = tuningSpace.put_DefaultLocator(getLocator(tuningSpec));
                    DsError.ThrowExceptionForHR(reply);

                    break;
                }
            }
        }
Example #14
0
        /// <summary>
        /// Dispose of the filters created by this graph.
        /// </summary>
        public override void Dispose()
        {
            if (CaptureGraphBuilder == null)
            {
                LogMessage("No graph components exist for disposal");
                return;
            }

            base.Dispose();

            LogMessage("Releasing Network Provider");
            Marshal.ReleaseComObject(networkProviderFilter);
            networkProviderFilter = null;

            LogMessage("Releasing MPEG2 Demux");
            Marshal.ReleaseComObject(mpeg2DemuxFilter);
            mpeg2DemuxFilter = null;

            LogMessage("Releasing Tuner");
            Marshal.ReleaseComObject(tunerFilter);
            tunerFilter = null;

            if (captureFilter != null)
            {
                LogMessage("Releasing Capture Filter");
                Marshal.ReleaseComObject(captureFilter);
                captureFilter = null;
            }

            if (demodulatorFilter != null)
            {
                LogMessage("Releasing Demodulator");
                Marshal.ReleaseComObject(demodulatorFilter);
                demodulatorFilter = null;
            }

            if (tifFilter != null)
            {
                LogMessage("Releasing TIF Filter");
                Marshal.ReleaseComObject(tifFilter);
                tifFilter = null;
            }

            if (secTabFilter != null)
            {
                LogMessage("Releasing Sections And Tables Filter");
                Marshal.ReleaseComObject(secTabFilter);
                secTabFilter = null;
            }

            if (infiniteTeeFilter != null)
            {
                LogMessage("Releasing Infinite Tee Filter");
                Marshal.ReleaseComObject(infiniteTeeFilter);
                infiniteTeeFilter = null;
            }

            if (psiMemoryFilter != null)
            {
                LogMessage("Releasing PSI Memory Filter");

                IntPtr pointer = Marshal.GetIUnknownForObject(psiMemoryFilter);

                Marshal.ReleaseComObject(psiMemoryFilter);
                Marshal.Release(pointer);

                psiMemoryFilter = null;
            }

            if (tuningSpace != null)
            {
                LogMessage("Releasing Tuning Space");
                Marshal.ReleaseComObject(tuningSpace);
                tuningSpace = null;
            }

            if (tuneRequest != null)
            {
                LogMessage("Releasing Tune Request");
                Marshal.ReleaseComObject(tuneRequest);
                tuneRequest = null;
            }

            if (currentLocator != null)
            {
                LogMessage("Releasing Locator");
                Marshal.ReleaseComObject(currentLocator);
                currentLocator = null;
            }
        }
Example #15
0
        private void BuildGraph()
        {
            int hr = 0;

            graphBuilder = (IFilterGraph2) new FilterGraph();
            rot          = new DsROTEntry(graphBuilder);

            ICaptureGraphBuilder2 capBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

            capBuilder.SetFiltergraph(graphBuilder);

            // Get the BDA network provider specific for this given network type
            networkProvider = BDAUtils.GetNetworkProvider(networkType);

            hr = graphBuilder.AddFilter(networkProvider, "BDA Network Provider");
            DsError.ThrowExceptionForHR(hr);

            tuner = (ITuner)networkProvider;

            // Get a tuning space for this network type
            tuningSpace = BDAUtils.GetTuningSpace(networkType);

            hr = tuner.put_TuningSpace(tuningSpace);
            DsError.ThrowExceptionForHR(hr);

            // Create a tune request from this tuning space
            tuneRequest = BDAUtils.CreateTuneRequest(tuningSpace);

            // Is it okay ?
            hr = tuner.Validate(tuneRequest);
            if (hr == 0)
            {
                // Set it
                hr = tuner.put_TuneRequest(tuneRequest);
                DsError.ThrowExceptionForHR(hr);

                // found a BDA Tuner and a BDA Capture that can connect to this network provider
                BDAUtils.AddBDATunerAndDemodulatorToGraph(graphBuilder, networkProvider, out bdaTuner, out bdaCapture);

                if ((bdaTuner != null) && (bdaCapture != null))
                {
                    // Create and add the mpeg2 demux
                    mpeg2Demux = (IBaseFilter) new MPEG2Demultiplexer();

                    hr = graphBuilder.AddFilter(mpeg2Demux, "MPEG2 Demultiplexer");
                    DsError.ThrowExceptionForHR(hr);

                    // connect it to the BDA Capture
                    hr = capBuilder.RenderStream(null, null, bdaCapture, null, mpeg2Demux);
                    DsError.ThrowExceptionForHR(hr);

                    // Add the two mpeg2 transport stream helper filters
                    BDAUtils.AddTransportStreamFiltersToGraph(graphBuilder, out bdaTIF, out bdaSecTab);

                    if ((bdaTIF != null) && (bdaSecTab != null))
                    {
                        // Render all the output pins of the demux (missing filters are added)
                        for (int i = 0; i < 5; i++)
                        {
                            IPin pin = DsFindPin.ByDirection(mpeg2Demux, PinDirection.Output, i);

                            hr = graphBuilder.Render(pin);
                            Marshal.ReleaseComObject(pin);
                        }
                    }

                    IBDA_Topology topo      = (IBDA_Topology)bdaTuner;
                    int[]         nodeTypes = new int[10];
                    int           nodeTypesCount;

                    // Get all nodes in the BDA Tuner
                    hr = topo.GetNodeTypes(out nodeTypesCount, nodeTypes.Length, nodeTypes);
                    DsError.ThrowExceptionForHR(hr);

                    // For each nodes types
                    for (int i = 0; i < nodeTypesCount; i++)
                    {
                        Guid[] nodeGuid = new Guid[10];
                        int    nodeGuidCount;

                        // Get its exposed interfaces
                        hr = topo.GetNodeInterfaces(nodeTypes[i], out nodeGuidCount, nodeGuid.Length, nodeGuid);
                        DsError.ThrowExceptionForHR(hr);

                        // For each exposed interfaces
                        for (int j = 0; j < nodeGuidCount; j++)
                        {
                            Debug.WriteLine(string.Format("node {0}/{1} : {2}", i, j, nodeGuid[j]));
                            Console.WriteLine(string.Format("node {0}/{1} : {2}", i, j, nodeGuid[j]));

                            // Is IBDA_LNBInfo supported by this node ?
                            if (nodeGuid[j] == typeof(IBDA_LNBInfo).GUID)
                            {
                                // Yes, retrieve this node
                                object ctrlNode;
                                hr = topo.GetControlNode(0, 1, nodeTypes[i], out ctrlNode);
                                DsError.ThrowExceptionForHR(hr);

                                // Do the cast (it should not fail)
                                lnbInfo = ctrlNode as IBDA_LNBInfo;

                                // Exit the for j loop if found a SignalStatistics object
                                if (lnbInfo != null)
                                {
                                    break;
                                }
                            }
                        }

                        // If already found a SignalStatistics object, exit the for i loop
                        if (lnbInfo != null)
                        {
                            break;
                        }
                    }
                }
            }
        }
Example #16
0
        private void BuildMosaicGraph(ITuningSpace tuningSpace, ArrayList programs)
        {
            this.graphBuilder = (IFilterGraph2)new FilterGraph();
            rot = new DsROTEntry(this.graphBuilder);

            // Method names should be self explanatory
            AddNetworkProviderFilter(tuningSpace);
            AddMPEG2DemuxFilter();

            AddAndConnectBDABoardFilters();
            AddTransportStreamFiltersToGraph();
            AddRenderers();

            //unsafe
            //{
                IntPtr formatPtr = Marshal.AllocHGlobal(g_Mpeg2ProgramVideo.Length);
                Marshal.Copy(g_Mpeg2ProgramVideo, 0, formatPtr, g_Mpeg2ProgramVideo.Length);

                IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer;

                for(int p = 1; p < programs.Count; p++)
                {
                    PSI.PSIPMT pmt = (PSI.PSIPMT)programs[p];
                    PSI.PSIPMT.Data stream = (PSI.PSIPMT.Data)pmt.GetStreamByType(CodeTV.PSI.STREAM_TYPES.STREAMTYPE_13818_VIDEO);

                    AMMediaType mediaType = new AMMediaType();
                    mediaType.majorType = MediaType.Video;
                    mediaType.subType = MediaSubType.Mpeg2Video;
                    mediaType.fixedSizeSamples = false;
                    mediaType.temporalCompression = false;
                    mediaType.sampleSize = 0;
                    mediaType.formatType = FormatType.Mpeg2Video;
                    mediaType.unkPtr = IntPtr.Zero;

                    mediaType.formatSize = g_Mpeg2ProgramVideo.Length;
                    mediaType.formatPtr = formatPtr;

                    //mediaType.formatType = FormatType.Mpeg2Video;
                    //mediaType.formatSize = 0;
                    //mediaType.formatPtr = IntPtr.Zero;

                    string pinName = "video" + p;
                    IPin outputPin;
                    int hr = mpeg2Demultiplexer.CreateOutputPin(mediaType, pinName, out outputPin);
                    if (outputPin != null)
                    {
                        IMPEG2PIDMap mpeg2PIDMap = outputPin as IMPEG2PIDMap;
                        if (mpeg2PIDMap != null)
                            hr = mpeg2PIDMap.MapPID(1, new int[] { stream.Pid }, MediaSampleContent.ElementaryStream);
                        Marshal.ReleaseComObject(outputPin);
                    }
                }
                Marshal.FreeHGlobal(formatPtr);
            //}

            ConfigureVMR9InWindowlessMode(programs.Count);
            ConnectAllOutputFilters();

            int numberColumn = 4;
            int numberRow = 4;
            float widthPadding = 0.01f;
            float heightPadding = 0.01f;

            float width = (1.0f / numberColumn) - 2.0f * widthPadding;
            float height = (1.0f / numberRow) - 2.0f * heightPadding;

            IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9;
            for (int p = 1; p < programs.Count; p++)
            {
                int column, row = Math.DivRem(p - 1, numberColumn, out column);
                NormalizedRect rect = new NormalizedRect();
                rect.left = (float)column / (float)numberColumn + widthPadding;
                rect.top = (float)row / (float)numberRow + heightPadding;
                rect.right = rect.left + width;
                rect.bottom = rect.top + height;
                vmrMixerControl9.SetOutputRect(p, ref rect);
            }
        }
Example #17
0
        private void buildGraph(ITuningSpace tuningSpace, Tuner tuner, TuningSpec tuningSpec)
        {
            base.BuildGraph();

            addNetworkProviderFilter(tuningSpace);
            infiniteTeeFilter = addInfiniteTeeFilter();
            mpeg2DemuxFilter = addMPEG2DemuxFilter();

            addBoardFilters(tuner);
            insertInfiniteTee();
            addTransportStreamFilters();
            addPSIMemoryFilter();

            if (tuningSpec.Frequency.TunerType == TunerType.ATSC ||
                tuningSpec.Frequency.TunerType == TunerType.ATSCCable ||
                tuningSpec.Frequency.TunerType == TunerType.ClearQAM)
                connectDownStreamFilters(mpeg2DemuxFilter, MediaSubType.AtscSI);
            else
                connectDownStreamFilters(mpeg2DemuxFilter, MediaSubType.DvbSI);
        }
Example #18
0
        /// <summary>
        /// Creates the tuning space.
        /// </summary>
        protected void CreateTuningSpace()
        {
            Log.Log.WriteFile("dvbt:CreateTuningSpace()");
            ITuner                tuner = (ITuner)_filterNetworkProvider;
            SystemTuningSpaces    systemTuningSpaces = new SystemTuningSpaces();
            ITuningSpaceContainer container          = systemTuningSpaces as ITuningSpaceContainer;

            if (container == null)
            {
                Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
                return;
            }
            IEnumTuningSpaces enumTuning;

            ITuningSpace[] spaces = new ITuningSpace[2];
            ITuneRequest   request;

            container.get_EnumTuningSpaces(out enumTuning);
            while (true)
            {
                int fetched;
                enumTuning.Next(1, spaces, out fetched);
                if (fetched != 1)
                {
                    break;
                }
                string name;
                spaces[0].get_UniqueName(out name);
                if (name == "MediaPortal DVBT TuningSpace")
                {
                    Log.Log.WriteFile("dvbt:found correct tuningspace {0}", name);
                    _tuningSpace = (IDVBTuningSpace)spaces[0];
                    tuner.put_TuningSpace(_tuningSpace);
                    _tuningSpace.CreateTuneRequest(out request);
                    _tuneRequest = (IDVBTuneRequest)request;
                    return;
                }
                Release.ComObject("ITuningSpace", spaces[0]);
            }
            Release.ComObject("IEnumTuningSpaces", enumTuning);
            Log.Log.WriteFile("dvbt:Create new tuningspace");
            _tuningSpace = (IDVBTuningSpace) new DVBTuningSpace();
            IDVBTuningSpace tuningSpace = (IDVBTuningSpace)_tuningSpace;

            tuningSpace.put_UniqueName("MediaPortal DVBT TuningSpace");
            tuningSpace.put_FriendlyName("MediaPortal DVBT TuningSpace");
            tuningSpace.put__NetworkType(typeof(DVBTNetworkProvider).GUID);
            tuningSpace.put_SystemType(DVBSystemType.Terrestrial);

            IDVBTLocator locator = (IDVBTLocator) 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);
            object newIndex;

            _tuningSpace.put_DefaultLocator(locator);
            container.Add(_tuningSpace, out newIndex);
            tuner.put_TuningSpace(_tuningSpace);
            Release.ComObject("ITuningSpaceContainer", container);
            _tuningSpace.CreateTuneRequest(out request);
            _tuneRequest = request;
        }
Example #19
0
        private void addNetworkProviderFilter(ITuningSpace dvbTuningSpace)
        {
            Guid genProviderClsId = new Guid("{B2F3A67C-29DA-4C78-8831-091ED509A475}");
            Guid networkProviderClsId;
            reply = dvbTuningSpace.get__NetworkType(out networkProviderClsId);

            LogMessage("Adding Network Provider");

            LogMessage("Trying Generic Network Provider");

            if (FilterGraphTools.IsThisComObjectInstalled(genProviderClsId))
            {
                LogMessage("Adding Generic Network Provider");
                this.networkProviderFilter = FilterGraphTools.AddFilterFromClsid(GraphBuilder, genProviderClsId, "Generic Network Provider");
                LogMessage("Generic Provider added - setting tuning space");
                reply = (this.networkProviderFilter as ITuner).put_TuningSpace(dvbTuningSpace);
                LogMessage("Tuning space set");
                return;
            }

            LogMessage("Adding Network Specific Provider");

            if (networkProviderClsId == typeof(DVBTNetworkProvider).GUID)
            {
                this.networkProviderFilter = FilterGraphTools.AddFilterFromClsid(GraphBuilder, networkProviderClsId, "DVBT Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBSNetworkProvider).GUID)
            {
                this.networkProviderFilter = FilterGraphTools.AddFilterFromClsid(GraphBuilder, networkProviderClsId, "DVBS Network Provider");
            }
            else if (networkProviderClsId == typeof(ATSCNetworkProvider).GUID)
            {
                this.networkProviderFilter = FilterGraphTools.AddFilterFromClsid(GraphBuilder, networkProviderClsId, "ATSC Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBCNetworkProvider).GUID)
            {
                this.networkProviderFilter = FilterGraphTools.AddFilterFromClsid(GraphBuilder, networkProviderClsId, "DVBC Network Provider");
            }
            else
                throw new ArgumentException("Tuning Space not supported");

            LogMessage("Network Specific Provider added - setting tuning space");
            reply = (this.networkProviderFilter as ITuner).put_TuningSpace(dvbTuningSpace);
            LogMessage("Tuning space set");
        }
Example #20
0
    /// <summary>
    /// Creates the tuning space.
    /// </summary>
    protected void CreateTuningSpace()
    {
      Log.Log.WriteFile("atsc:CreateTuningSpace()");
      ITuner tuner = (ITuner)_filterNetworkProvider;
      SystemTuningSpaces systemTuningSpaces = new SystemTuningSpaces();
      ITuningSpaceContainer container = systemTuningSpaces as ITuningSpaceContainer;
      if (container == null)
      {
        Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
        return;
      }
      IEnumTuningSpaces enumTuning;
      ITuningSpace[] spaces = new ITuningSpace[2];
      ITuneRequest request;
      container.get_EnumTuningSpaces(out enumTuning);
      while (true)
      {
        int fetched;
        enumTuning.Next(1, spaces, out fetched);
        if (fetched != 1)
          break;
        string name;
        spaces[0].get_UniqueName(out name);
        if (name == "MediaPortal ATSC TuningSpace")
        {
          Log.Log.WriteFile("atsc:found correct tuningspace {0}", name);
          _tuningSpace = (IATSCTuningSpace)spaces[0];
          tuner.put_TuningSpace(_tuningSpace);
          _tuningSpace.CreateTuneRequest(out request);
          _tuneRequest = (IATSCChannelTuneRequest)request;
          return;
        }
        Release.ComObject("ITuningSpace", spaces[0]);
      }
      Release.ComObject("IEnumTuningSpaces", enumTuning);
      Log.Log.WriteFile("atsc:Create new tuningspace");
      _tuningSpace = (IATSCTuningSpace)new ATSCTuningSpace();
      IATSCTuningSpace tuningSpace = (IATSCTuningSpace)_tuningSpace;

      tuningSpace.put_UniqueName("MediaPortal ATSC TuningSpace");
      tuningSpace.put_FriendlyName("MediaPortal ATSC TuningSpace");
      tuningSpace.put__NetworkType(typeof (ATSCNetworkProvider).GUID);
      tuningSpace.put_CountryCode(0);
      tuningSpace.put_InputType(TunerInputType.Antenna);
      tuningSpace.put_MaxMinorChannel(999); //minor channels per major
      tuningSpace.put_MaxPhysicalChannel(158); //69 for OTA 158 for QAM
      tuningSpace.put_MaxChannel(99); //major channels
      tuningSpace.put_MinMinorChannel(0);
      tuningSpace.put_MinPhysicalChannel(1); //OTA 1, QAM 2
      tuningSpace.put_MinChannel(1);

      IATSCLocator locator = (IATSCLocator)new ATSCLocator();
      locator.put_CarrierFrequency(-1);
      locator.put_InnerFEC(FECMethod.MethodNotSet);
      locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
      locator.put_Modulation(ModulationType.Mod8Vsb); //OTA modultation, QAM = .Mod256Qam
      locator.put_OuterFEC(FECMethod.MethodNotSet);
      locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
      locator.put_PhysicalChannel(-1);
      locator.put_SymbolRate(-1);
      locator.put_TSID(-1);
      object newIndex;
      _tuningSpace.put_DefaultLocator(locator);
      container.Add(_tuningSpace, out newIndex);
      tuner.put_TuningSpace(_tuningSpace);
      Release.ComObject("TuningSpaceContainer", container);
      _tuningSpace.CreateTuneRequest(out request);
      _tuneRequest = (IATSCChannelTuneRequest)request;
    }
Example #21
0
    /// <summary>
    /// Creates the tuning space.
    /// </summary>
    protected void CreateTuningSpace()
    {
      Log.Log.WriteFile("dvbs:CreateTuningSpace()");
      ITuner tuner = (ITuner)_filterNetworkProvider;
      SystemTuningSpaces systemTuningSpaces = new SystemTuningSpaces();
      ITuningSpaceContainer container = systemTuningSpaces as ITuningSpaceContainer;
      if (container == null)
      {
        Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
        return;
      }
      IEnumTuningSpaces enumTuning;
      ITuningSpace[] spaces = new ITuningSpace[2];
      int lowOsc;
      int hiOsc;
      int lnbSwitch;
      if (_parameters.UseDefaultLnbFrequencies)
      {
        lowOsc = 9750;
        hiOsc = 10600;
        lnbSwitch = 11700;
      }
      else
      {
        lowOsc = _parameters.LnbLowFrequency;
        hiOsc = _parameters.LnbHighFrequency;
        lnbSwitch = _parameters.LnbSwitchFrequency;
      }
      ITuneRequest request;
      container.get_EnumTuningSpaces(out enumTuning);
      IDVBSTuningSpace tuningSpace;
      while (true)
      {
        int fetched;
        enumTuning.Next(1, spaces, out fetched);
        if (fetched != 1)
          break;
        string name;
        spaces[0].get_UniqueName(out name);
        if (name == "MediaPortal DVBS TuningSpace")
        {
          Log.Log.WriteFile("dvbs:found correct tuningspace {0}", name);

          _tuningSpace = (IDVBSTuningSpace)spaces[0];
          tuningSpace = (IDVBSTuningSpace)_tuningSpace;
          tuningSpace.put_LNBSwitch(lnbSwitch * 1000);
          tuningSpace.put_SpectralInversion(SpectralInversion.Automatic);
          tuningSpace.put_LowOscillator(lowOsc * 1000);
          tuningSpace.put_HighOscillator(hiOsc * 1000);
          tuner.put_TuningSpace(tuningSpace);
          tuningSpace.CreateTuneRequest(out request);
          _tuneRequest = (IDVBTuneRequest)request;
          return;
        }
        Release.ComObject("ITuningSpace", spaces[0]);
      }
      Release.ComObject("IEnumTuningSpaces", enumTuning);
      Log.Log.WriteFile("dvbs:Create new tuningspace");
      _tuningSpace = (IDVBSTuningSpace)new DVBSTuningSpace();
      tuningSpace = (IDVBSTuningSpace)_tuningSpace;
      tuningSpace.put_UniqueName("MediaPortal DVBS TuningSpace");
      tuningSpace.put_FriendlyName("MediaPortal DVBS TuningSpace");
      tuningSpace.put__NetworkType(typeof (DVBSNetworkProvider).GUID);
      tuningSpace.put_SystemType(DVBSystemType.Satellite);
      tuningSpace.put_LNBSwitch(lnbSwitch * 1000);
      tuningSpace.put_LowOscillator(lowOsc * 1000);
      tuningSpace.put_HighOscillator(hiOsc * 1000);
      IDVBSLocator locator = (IDVBSLocator)new DVBSLocator();
      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);
      object newIndex;
      _tuningSpace.put_DefaultLocator(locator);
      container.Add(_tuningSpace, out newIndex);
      tuner.put_TuningSpace(_tuningSpace);
      Release.ComObject("TuningSpaceContainer", container);
      _tuningSpace.CreateTuneRequest(out request);
      _tuneRequest = (IDVBTuneRequest)request;
    }
Example #22
0
File: EPG.cs Project: dgis/CodeTV
        public void UpdateService(string serviceId, ITuningSpace tuningSpace, IGuideData guideData)
        {
            Trace.WriteLineIf(trace.TraceInfo, "EPG.UpdateService(" + serviceId + ")");
            if (serviceId == null)
                UpdateAllService(guideData);
            else if (tuningSpace != null && NeedServiceUpdate(serviceId))
            {
                // serviceId = "ONID:TSID:SID"
                string[] serviceIds = serviceId.Split(new char[] { ':' });
                int onid = int.Parse(serviceIds[0]);
                int tsid = int.Parse(serviceIds[1]);
                int sid = int.Parse(serviceIds[2]);

                ITuneRequest tr;
                tuningSpace.CreateTuneRequest(out tr);
                IDVBTuneRequest tuneRequest = (IDVBTuneRequest)tr;
                tuneRequest.put_ONID(onid);
                tuneRequest.put_TSID(tsid);
                tuneRequest.put_SID(sid);
                UpdateService(tuneRequest, guideData);
            }
        }
        private void BuildSinkGraph(ITuningSpace tuningSpace)
        {
            this.graphBuilder = (IFilterGraph2)new FilterGraph();
            this.rot = new DsROTEntry(this.graphBuilder);

            this.epg = new EPG(this.hostingControl);

            this.cookiesSink = this.hostingControl.SubscribeEvents(this as VideoControl.IVideoEventHandler, this.graphBuilder as IMediaEventEx);

            AddNetworkProviderFilter(this.objTuningSpace);
            AddMPEG2DemuxFilter();
            AddMpeg2VideoStreamAnalyzerFilter();
            CreateMPEG2DemuxPins();

            AddAndConnectBDABoardFilters();
            if (this.tuner == null && this.capture == null)
                throw new ApplicationException("No BDA devices found!");

            if (this.H264DecoderDevice != null || !isH264ElecardSpecialMode)
            {
                //+++ This order is to avoid a bug from the DirectShow
                AddAndConnectSectionsAndTablesFilterToGraph();

                IMpeg2Data mpeg2Data = this.bdaSecTab as IMpeg2Data;
                ISectionList ppSectionList;
                int hr2 = mpeg2Data.GetTable(0, 0, null, 0, out ppSectionList);

                AddAndConnectTIFToGraph();
                //---
            }

            ConfigureTimeShiftingRegistry();

            AddStreamBufferSinkFilter();
            ConnectStreamBufferSinkFilter();

            this.epg.RegisterEvent(TransportInformationFilter as IConnectionPointContainer);
        }
Example #24
0
        private void BuildMosaicGraph(ITuningSpace tuningSpace, ArrayList programs)
        {
            this.graphBuilder = (IFilterGraph2) new FilterGraph();
            rot = new DsROTEntry(this.graphBuilder);

            // Method names should be self explanatory
            AddNetworkProviderFilter(tuningSpace);
            AddMPEG2DemuxFilter();

            AddAndConnectBDABoardFilters();
            AddTransportStreamFiltersToGraph();
            AddRenderers();

            //unsafe
            //{
            IntPtr formatPtr = Marshal.AllocHGlobal(g_Mpeg2ProgramVideo.Length);

            Marshal.Copy(g_Mpeg2ProgramVideo, 0, formatPtr, g_Mpeg2ProgramVideo.Length);

            IMpeg2Demultiplexer mpeg2Demultiplexer = this.mpeg2Demux as IMpeg2Demultiplexer;

            for (int p = 1; p < programs.Count; p++)
            {
                PSI.PSIPMT      pmt    = (PSI.PSIPMT)programs[p];
                PSI.PSIPMT.Data stream = (PSI.PSIPMT.Data)pmt.GetStreamByType(CodeTV.PSI.STREAM_TYPES.STREAMTYPE_13818_VIDEO);

                AMMediaType mediaType = new AMMediaType();
                mediaType.majorType           = MediaType.Video;
                mediaType.subType             = MediaSubType.Mpeg2Video;
                mediaType.fixedSizeSamples    = false;
                mediaType.temporalCompression = false;
                mediaType.sampleSize          = 0;
                mediaType.formatType          = FormatType.Mpeg2Video;
                mediaType.unkPtr = IntPtr.Zero;

                mediaType.formatSize = g_Mpeg2ProgramVideo.Length;
                mediaType.formatPtr  = formatPtr;

                //mediaType.formatType = FormatType.Mpeg2Video;
                //mediaType.formatSize = 0;
                //mediaType.formatPtr = IntPtr.Zero;

                string pinName = "video" + p;
                IPin   outputPin;
                int    hr = mpeg2Demultiplexer.CreateOutputPin(mediaType, pinName, out outputPin);
                if (outputPin != null)
                {
                    IMPEG2PIDMap mpeg2PIDMap = outputPin as IMPEG2PIDMap;
                    if (mpeg2PIDMap != null)
                    {
                        hr = mpeg2PIDMap.MapPID(1, new int[] { stream.Pid }, MediaSampleContent.ElementaryStream);
                    }
                    Marshal.ReleaseComObject(outputPin);
                }
            }
            Marshal.FreeHGlobal(formatPtr);
            //}

            ConfigureVMR9InWindowlessMode(programs.Count);
            ConnectAllOutputFilters();

            int   numberColumn  = 4;
            int   numberRow     = 4;
            float widthPadding  = 0.01f;
            float heightPadding = 0.01f;

            float width  = (1.0f / numberColumn) - 2.0f * widthPadding;
            float height = (1.0f / numberRow) - 2.0f * heightPadding;

            IVMRMixerControl9 vmrMixerControl9 = this.videoRenderer as IVMRMixerControl9;

            for (int p = 1; p < programs.Count; p++)
            {
                int            column, row = Math.DivRem(p - 1, numberColumn, out column);
                NormalizedRect rect = new NormalizedRect();
                rect.left   = (float)column / (float)numberColumn + widthPadding;
                rect.top    = (float)row / (float)numberRow + heightPadding;
                rect.right  = rect.left + width;
                rect.bottom = rect.top + height;
                vmrMixerControl9.SetOutputRect(p, ref rect);
            }
        }
Example #25
0
        public void MakeTuneRequest()
        {
            int      hr = 0;
            ILocator locator;

            // Get a tuning space for this network type
            tuningSpace = BDAUtils.GetTuningSpace(networkType);

            hr = tuner.put_TuningSpace(tuningSpace);
            DsError.ThrowExceptionForHR(hr);

            // Create a tune request from this tuning space
            tuneRequest = BDAUtils.CreateTuneRequest(tuningSpace);

            // Is it okay ?
            hr = tuner.Validate(tuneRequest);
            //DsError.ThrowExceptionForHR(hr);

            if (networkType == BDANetworkType.DVBT)
            {
                // Those values are valid for me but must be modified to be valid depending on your location
                hr = tuneRequest.get_Locator(out locator);
                DsError.ThrowExceptionForHR(hr);

                hr = locator.put_CarrierFrequency(586166);
                DsError.ThrowExceptionForHR(hr);

                hr = tuneRequest.put_Locator(locator);
                DsError.ThrowExceptionForHR(hr);

                Marshal.ReleaseComObject(locator);

                hr = (tuneRequest as IDVBTuneRequest).put_ONID(8442);
                DsError.ThrowExceptionForHR(hr);
                hr = (tuneRequest as IDVBTuneRequest).put_TSID(1);
                DsError.ThrowExceptionForHR(hr);
                hr = (tuneRequest as IDVBTuneRequest).put_SID(259);
                DsError.ThrowExceptionForHR(hr);

/*
 *      hr = locator.put_CarrierFrequency(522166);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = tuneRequest.put_Locator(locator);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      Marshal.ReleaseComObject(locator);
 *
 *      hr = (tuneRequest as IDVBTuneRequest).put_ONID(8442);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_TSID(3);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_SID(769);
 *      DsError.ThrowExceptionForHR(hr);
 */
/*
 *      hr = locator.put_CarrierFrequency(562166);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = tuneRequest.put_Locator(locator);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      Marshal.ReleaseComObject(locator);
 *
 *      hr = (tuneRequest as IDVBTuneRequest).put_ONID(8442);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_TSID(6);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_SID(1537);
 *      DsError.ThrowExceptionForHR(hr);
 */
            }

            if (networkType == BDANetworkType.DVBS)
            {
                // Those values are valid for me but must be modified to be valid depending on your Satellite dish

/*
 *      hr = tuneRequest.get_Locator(out locator);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = locator.put_CarrierFrequency(11591000);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = (locator as IDVBSLocator).put_SignalPolarisation(Polarisation.LinearV);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = locator.put_SymbolRate(20000);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      hr = tuneRequest.put_Locator(locator);
 *      DsError.ThrowExceptionForHR(hr);
 *
 *      Marshal.ReleaseComObject(locator);
 *
 *      hr = (tuneRequest as IDVBTuneRequest).put_ONID(8442);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_TSID(1);
 *      DsError.ThrowExceptionForHR(hr);
 *      hr = (tuneRequest as IDVBTuneRequest).put_SID(260);
 *      DsError.ThrowExceptionForHR(hr);
 */

                hr = tuneRequest.get_Locator(out locator);
                DsError.ThrowExceptionForHR(hr);

                hr = locator.put_CarrierFrequency(11607000);
                DsError.ThrowExceptionForHR(hr);

                hr = (locator as IDVBSLocator).put_SignalPolarisation(Polarisation.LinearV);
                DsError.ThrowExceptionForHR(hr);

                hr = locator.put_SymbolRate(6944);
                DsError.ThrowExceptionForHR(hr);

                hr = tuneRequest.put_Locator(locator);
                DsError.ThrowExceptionForHR(hr);

                Marshal.ReleaseComObject(locator);

                hr = (tuneRequest as IDVBTuneRequest).put_ONID(144);
                DsError.ThrowExceptionForHR(hr);
                hr = (tuneRequest as IDVBTuneRequest).put_TSID(100);
                DsError.ThrowExceptionForHR(hr);
                hr = (tuneRequest as IDVBTuneRequest).put_SID(289);
                DsError.ThrowExceptionForHR(hr);
            }

            hr = tuner.put_TuneRequest(tuneRequest);
            if (hr < 0)
            {
                Debug.Fail("TuneRequest is not valid");
            }
        }
Example #26
0
        private void BuildGraph()
        {
            int hr = 0;

            graphBuilder = (IFilterGraph2) new FilterGraph();
            rot          = new DsROTEntry(graphBuilder);

            ICaptureGraphBuilder2 capBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

            capBuilder.SetFiltergraph(graphBuilder);

            // Get the BDA network provider specific for this given network type
            networkProvider = BDAUtils.GetNetworkProvider(networkType);

            hr = graphBuilder.AddFilter(networkProvider, "BDA Network Provider");
            DsError.ThrowExceptionForHR(hr);

            tuner = (ITuner)networkProvider;

            // Get a tuning space for this network type
            tuningSpace = BDAUtils.GetTuningSpace(networkType);

            hr = tuner.put_TuningSpace(tuningSpace);
            DsError.ThrowExceptionForHR(hr);

            // Create a tune request from this tuning space
            tuneRequest = BDAUtils.CreateTuneRequest(tuningSpace);

            // Is it okay ?
            hr = tuner.Validate(tuneRequest);
            if (hr == 0)
            {
                // Set it
                hr = tuner.put_TuneRequest(tuneRequest);
                DsError.ThrowExceptionForHR(hr);

                // found a BDA Tuner and a BDA Capture that can connect to this network provider
                BDAUtils.AddBDATunerAndDemodulatorToGraph(graphBuilder, networkProvider, out bdaTuner, out bdaCapture);

                if ((bdaTuner != null) && (bdaCapture != null))
                {
                    // Create and add the mpeg2 demux
                    mpeg2Demux = (IBaseFilter) new MPEG2Demultiplexer();

                    hr = graphBuilder.AddFilter(mpeg2Demux, "MPEG2 Demultiplexer");
                    DsError.ThrowExceptionForHR(hr);

                    // connect it to the BDA Capture
                    hr = capBuilder.RenderStream(null, null, bdaCapture, null, mpeg2Demux);
                    DsError.ThrowExceptionForHR(hr);

                    // Add the two mpeg2 transport stream helper filters
                    BDAUtils.AddTransportStreamFiltersToGraph(graphBuilder, out bdaTIF, out bdaSecTab);

                    if ((bdaTIF != null) && (bdaSecTab != null))
                    {
                        // Render all the output pins of the demux (missing filters are added)
                        for (int i = 0; i < 5; i++)
                        {
                            IPin pin = DsFindPin.ByDirection(mpeg2Demux, PinDirection.Output, i);

                            hr = graphBuilder.Render(pin);
                            Marshal.ReleaseComObject(pin);
                        }
                    }
                }
            }
        }
Example #27
0
        protected void AddNetworkProviderFilter(ITuningSpace tuningSpace)
        {
            int hr = 0;
            Guid genProviderClsId = new Guid("{B2F3A67C-29DA-4C78-8831-091ED509A475}");
            Guid networkProviderClsId;

            // First test if the Generic Network Provider is available (only on MCE 2005 + Update Rollup 2)
            //if (FilterGraphTools.IsThisComObjectInstalled(genProviderClsId))
            //{
            //    this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, genProviderClsId, "Generic Network Provider");

            //    hr = (this.networkProvider as ITuner).put_TuningSpace(tuningSpace);
            //    return;
            //}

            // Get the network type of the requested Tuning Space
            hr = tuningSpace.get__NetworkType(out networkProviderClsId);

            // Get the network type of the requested Tuning Space
            if (networkProviderClsId == typeof(DVBTNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBT Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBSNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBS Network Provider");
            }
            else if (networkProviderClsId == typeof(ATSCNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "ATSC Network Provider");
            }
            else if (networkProviderClsId == typeof(DVBCNetworkProvider).GUID)
            {
                this.networkProvider = FilterGraphTools.AddFilterFromClsid(this.graphBuilder, networkProviderClsId, "DVBC Network Provider");
            }
            else
                // Tuning Space can also describe Analog TV but this application don't support them
                throw new ArgumentException("This application doesn't support this Tuning Space");

            hr = (this.networkProvider as ITuner).put_TuningSpace(tuningSpace);
        }
Example #28
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());
        }
Example #29
0
        private void InitBdaDetectionGraph()
        {
            Log.Log.Debug("Initialise BDA device detection graph");
            _graphBuilder = (IFilterGraph2) new FilterGraph();
            _rotEntry     = new DsROTEntry(_graphBuilder);

            Guid mpNetworkProviderClsId = new Guid("{D7D42E5C-EB36-4aad-933B-B4C419429C98}");

            if (FilterGraphTools.IsThisComObjectInstalled(mpNetworkProviderClsId))
            {
                _mpNp = FilterGraphTools.AddFilterFromClsid(_graphBuilder, mpNetworkProviderClsId, "MediaPortal Network Provider");
                return;
            }

            ITuningSpace tuningSpace = null;
            ILocator     locator     = null;

            // ATSC
            _atscNp     = FilterGraphTools.AddFilterFromClsid(_graphBuilder, typeof(ATSCNetworkProvider).GUID, "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)_atscNp).put_TuningSpace(tuningSpace);

            // DVB-C
            _dvbcNp     = FilterGraphTools.AddFilterFromClsid(_graphBuilder, typeof(DVBCNetworkProvider).GUID, "DVB-C Network Provider");
            tuningSpace = (ITuningSpace) new DVBTuningSpace();
            tuningSpace.put_UniqueName("DVB-C TuningSpace");
            tuningSpace.put_FriendlyName("DVB-C 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)_dvbcNp).put_TuningSpace(tuningSpace);

            // DVB-S
            _dvbsNp     = FilterGraphTools.AddFilterFromClsid(_graphBuilder, typeof(DVBSNetworkProvider).GUID, "DVB-S Network Provider");
            tuningSpace = (ITuningSpace) new DVBSTuningSpace();
            tuningSpace.put_UniqueName("DVB-S TuningSpace");
            tuningSpace.put_FriendlyName("DVB-S 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)_dvbsNp).put_TuningSpace(tuningSpace);

            // DVB-T
            _dvbtNp     = FilterGraphTools.AddFilterFromClsid(_graphBuilder, typeof(DVBTNetworkProvider).GUID, "DVB-T Network Provider");
            tuningSpace = (ITuningSpace) new DVBTuningSpace();
            tuningSpace.put_UniqueName("DVB-T TuningSpace");
            tuningSpace.put_FriendlyName("DVB-T 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)_dvbtNp).put_TuningSpace(tuningSpace);
        }
Example #30
0
        /// <summary>
        /// Creates the tuning space.
        /// </summary>
        protected void CreateTuningSpace()
        {
            Log.Log.WriteFile("atsc:CreateTuningSpace()");
            ITuner                tuner = (ITuner)_filterNetworkProvider;
            SystemTuningSpaces    systemTuningSpaces = new SystemTuningSpaces();
            ITuningSpaceContainer container          = systemTuningSpaces as ITuningSpaceContainer;

            if (container == null)
            {
                Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
                return;
            }
            IEnumTuningSpaces enumTuning;

            ITuningSpace[] spaces = new ITuningSpace[2];
            ITuneRequest   request;

            container.get_EnumTuningSpaces(out enumTuning);
            while (true)
            {
                int fetched;
                enumTuning.Next(1, spaces, out fetched);
                if (fetched != 1)
                {
                    break;
                }
                string name;
                spaces[0].get_UniqueName(out name);
                if (name == "MediaPortal ATSC TuningSpace")
                {
                    Log.Log.WriteFile("atsc:found correct tuningspace {0}", name);
                    _tuningSpace = (IATSCTuningSpace)spaces[0];
                    tuner.put_TuningSpace(_tuningSpace);
                    _tuningSpace.CreateTuneRequest(out request);
                    _tuneRequest = (IATSCChannelTuneRequest)request;
                    return;
                }
                Release.ComObject("ITuningSpace", spaces[0]);
            }
            Release.ComObject("IEnumTuningSpaces", enumTuning);
            Log.Log.WriteFile("atsc:Create new tuningspace");
            _tuningSpace = (IATSCTuningSpace) new ATSCTuningSpace();
            IATSCTuningSpace tuningSpace = (IATSCTuningSpace)_tuningSpace;

            tuningSpace.put_UniqueName("MediaPortal ATSC TuningSpace");
            tuningSpace.put_FriendlyName("MediaPortal ATSC TuningSpace");
            tuningSpace.put__NetworkType(typeof(ATSCNetworkProvider).GUID);
            tuningSpace.put_CountryCode(0);
            tuningSpace.put_InputType(TunerInputType.Antenna);
            tuningSpace.put_MaxMinorChannel(999);    //minor channels per major
            tuningSpace.put_MaxPhysicalChannel(158); //69 for OTA 158 for QAM
            tuningSpace.put_MaxChannel(99);          //major channels
            tuningSpace.put_MinMinorChannel(0);
            tuningSpace.put_MinPhysicalChannel(1);   //OTA 1, QAM 2
            tuningSpace.put_MinChannel(1);

            IATSCLocator locator = (IATSCLocator) new ATSCLocator();

            locator.put_CarrierFrequency(-1);
            locator.put_InnerFEC(FECMethod.MethodNotSet);
            locator.put_InnerFECRate(BinaryConvolutionCodeRate.RateNotSet);
            locator.put_Modulation(ModulationType.Mod8Vsb); //OTA modultation, QAM = .Mod256Qam
            locator.put_OuterFEC(FECMethod.MethodNotSet);
            locator.put_OuterFECRate(BinaryConvolutionCodeRate.RateNotSet);
            locator.put_PhysicalChannel(-1);
            locator.put_SymbolRate(-1);
            locator.put_TSID(-1);
            object newIndex;

            _tuningSpace.put_DefaultLocator(locator);
            container.Add(_tuningSpace, out newIndex);
            tuner.put_TuningSpace(_tuningSpace);
            Release.ComObject("TuningSpaceContainer", container);
            _tuningSpace.CreateTuneRequest(out request);
            _tuneRequest = (IATSCChannelTuneRequest)request;
        }
Example #31
0
        /// <summary>
        /// Creates the tuning space.
        /// </summary>
        protected void CreateTuningSpace()
        {
            Log.Log.WriteFile("dvbs:CreateTuningSpace()");
            ITuner                tuner = (ITuner)_filterNetworkProvider;
            SystemTuningSpaces    systemTuningSpaces = new SystemTuningSpaces();
            ITuningSpaceContainer container          = systemTuningSpaces as ITuningSpaceContainer;

            if (container == null)
            {
                Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
                return;
            }
            IEnumTuningSpaces enumTuning;

            ITuningSpace[] spaces = new ITuningSpace[2];
            int            lowOsc;
            int            hiOsc;
            int            lnbSwitch;

            if (_parameters.UseDefaultLnbFrequencies)
            {
                lowOsc    = 9750;
                hiOsc     = 10600;
                lnbSwitch = 11700;
            }
            else
            {
                lowOsc    = _parameters.LnbLowFrequency;
                hiOsc     = _parameters.LnbHighFrequency;
                lnbSwitch = _parameters.LnbSwitchFrequency;
            }
            ITuneRequest request;

            container.get_EnumTuningSpaces(out enumTuning);
            IDVBSTuningSpace tuningSpace;

            while (true)
            {
                int fetched;
                enumTuning.Next(1, spaces, out fetched);
                if (fetched != 1)
                {
                    break;
                }
                string name;
                spaces[0].get_UniqueName(out name);
                if (name == "MediaPortal DVBS TuningSpace")
                {
                    Log.Log.WriteFile("dvbs:found correct tuningspace {0}", name);

                    _tuningSpace = (IDVBSTuningSpace)spaces[0];
                    tuningSpace  = (IDVBSTuningSpace)_tuningSpace;
                    tuningSpace.put_LNBSwitch(lnbSwitch * 1000);
                    tuningSpace.put_SpectralInversion(SpectralInversion.Automatic);
                    tuningSpace.put_LowOscillator(lowOsc * 1000);
                    tuningSpace.put_HighOscillator(hiOsc * 1000);
                    tuner.put_TuningSpace(tuningSpace);
                    tuningSpace.CreateTuneRequest(out request);
                    _tuneRequest = (IDVBTuneRequest)request;
                    return;
                }
                Release.ComObject("ITuningSpace", spaces[0]);
            }
            Release.ComObject("IEnumTuningSpaces", enumTuning);
            Log.Log.WriteFile("dvbs:Create new tuningspace");
            _tuningSpace = (IDVBSTuningSpace) new DVBSTuningSpace();
            tuningSpace  = (IDVBSTuningSpace)_tuningSpace;
            tuningSpace.put_UniqueName("MediaPortal DVBS TuningSpace");
            tuningSpace.put_FriendlyName("MediaPortal DVBS TuningSpace");
            tuningSpace.put__NetworkType(typeof(DVBSNetworkProvider).GUID);
            tuningSpace.put_SystemType(DVBSystemType.Satellite);
            tuningSpace.put_LNBSwitch(lnbSwitch * 1000);
            tuningSpace.put_LowOscillator(lowOsc * 1000);
            tuningSpace.put_HighOscillator(hiOsc * 1000);
            IDVBSLocator locator = (IDVBSLocator) new DVBSLocator();

            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);
            object newIndex;

            _tuningSpace.put_DefaultLocator(locator);
            container.Add(_tuningSpace, out newIndex);
            tuner.put_TuningSpace(_tuningSpace);
            Release.ComObject("TuningSpaceContainer", container);
            _tuningSpace.CreateTuneRequest(out request);
            _tuneRequest = (IDVBTuneRequest)request;
        }
Example #32
0
        public WinTV418ATSC(StreamSourceInfo sourceConfig, OpenGraphRequest openGraphRequest)
            : base(sourceConfig, openGraphRequest)
        {
            if (SourceConfig.TVTuner == null)
            {
                throw new SourceConfigException("TVTuner config section not found!");
            }

            _deviceIndex = sourceConfig.TVTuner.DeviceIndex;

            tuningSpace = GetTuningSpace();

            Guid networkType;

            tuningSpace.get__NetworkType(out networkType);
            if (networkType.Equals(Guid.Empty))
            {
                throw new Exception("Not a digital Network Type!");
            }

            networkProvider = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(networkType));
            int hr = _graphBuilder.AddFilter(networkProvider, "Network Provider");

            DsError.ThrowExceptionForHR(hr);
            tuner = (ITuner)networkProvider;

            //add MPEG2 Demux
            mpeg2Demux = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, "MPEG-2 Demultiplexer");

            //add BDA MPEG-2 Transport Information Filter
            bdaTransportInfo = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDATransportInformationRenderersCategory, "BDA MPEG2 Transport Information Filter");
            //add MPEG-2 Sections and Tables Filter
            mpeg2SectionsAndTables = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDATransportInformationRenderersCategory, "MPEG-2 Sections and Tables");

            //tunerFilter = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDASourceFiltersCategory, "Hauppauge WinTV 418 BDA Tuner");
            DsDevice tunerDevice = FindDevice(FilterCategory.BDASourceFiltersCategory, "Hauppauge WinTV 418 BDA Tuner");

            tunerFilter = FilterGraphTools.AddFilterByDevicePath(_graphBuilder, tunerDevice.DevicePath, tunerDevice.Name);
            //captureFilter = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDAReceiverComponentsCategory, "Hauppauge WinTV 418 TS Capture");
            DsDevice captureDevice = FindDevice(FilterCategory.BDAReceiverComponentsCategory, "Hauppauge WinTV 418 TS Capture");

            captureFilter = FilterGraphTools.AddFilterByDevicePath(_graphBuilder, captureDevice.DevicePath, captureDevice.Name);

            //connect network provider to BDA tuner
            ConnectFilters(networkProvider, "Antenna Out", (IBaseFilter)tunerFilter, "Input0", false);
            ConnectFilters((IBaseFilter)tunerFilter, "MPEG2 Transport", captureFilter, "MPEG2 Transport", false);

            //These filters need to be connected via their explicit pins,
            //  because Hauppauge saw fit to name all the pins on the capture filter the same name.
            IPin captureFilterOut = DsFindPin.ByDirection(captureFilter, PinDirection.Output, 0);
            IPin mpeg2DemuxIn     = DsFindPin.ByDirection(mpeg2Demux, PinDirection.Input, 0);

            FilterGraphTools.ConnectFilters(_graphBuilder, captureFilterOut, mpeg2DemuxIn, false);
            //clean up the two pins
            Marshal.ReleaseComObject(captureFilterOut);
            Marshal.ReleaseComObject(mpeg2DemuxIn);

            //add and connect meta data filters and connect them to the Demux
            ConnectFilters(mpeg2Demux, "1", bdaTransportInfo, "Input", false);
            ConnectFilters(mpeg2Demux, "5", mpeg2SectionsAndTables, "In", false);

            //this interface must be queried after the S&T filter has been connected.
            mpeg2Data  = (IMpeg2Data)mpeg2SectionsAndTables;
            _vctParser = new Parser(mpeg2Data);

            //build out the rest of the graph for the given source config / profile
            BuildForProfile();

            ConnectNetMuxToNetSnk();

            if (KnownChannels.Count > 0)
            {
                this.Channel = KnownChannels.Items[0];
            }

            SaveGraphFile("WinTV418ATSC.grf");
        }
Example #33
0
    /// <summary>
    /// Creates the tuning space.
    /// </summary>
    protected void CreateTuningSpace()
    {
      Log.Log.WriteFile("dvbt:CreateTuningSpace()");
      ITuner tuner = (ITuner)_filterNetworkProvider;
      SystemTuningSpaces systemTuningSpaces = new SystemTuningSpaces();
      ITuningSpaceContainer container = systemTuningSpaces as ITuningSpaceContainer;
      if (container == null)
      {
        Log.Log.Error("CreateTuningSpace() Failed to get ITuningSpaceContainer");
        return;
      }
      IEnumTuningSpaces enumTuning;
      ITuningSpace[] spaces = new ITuningSpace[2];
      ITuneRequest request;
      container.get_EnumTuningSpaces(out enumTuning);
      while (true)
      {
        int fetched;
        enumTuning.Next(1, spaces, out fetched);
        if (fetched != 1)
          break;
        string name;
        spaces[0].get_UniqueName(out name);
        if (name == "MediaPortal DVBT TuningSpace")
        {
          Log.Log.WriteFile("dvbt:found correct tuningspace {0}", name);
          _tuningSpace = (IDVBTuningSpace)spaces[0];
          tuner.put_TuningSpace(_tuningSpace);
          _tuningSpace.CreateTuneRequest(out request);
          _tuneRequest = (IDVBTuneRequest)request;
          return;
        }
        Release.ComObject("ITuningSpace", spaces[0]);
      }
      Release.ComObject("IEnumTuningSpaces", enumTuning);
      Log.Log.WriteFile("dvbt:Create new tuningspace");
      _tuningSpace = (IDVBTuningSpace)new DVBTuningSpace();
      IDVBTuningSpace tuningSpace = (IDVBTuningSpace)_tuningSpace;
      tuningSpace.put_UniqueName("MediaPortal DVBT TuningSpace");
      tuningSpace.put_FriendlyName("MediaPortal DVBT TuningSpace");
      tuningSpace.put__NetworkType(typeof (DVBTNetworkProvider).GUID);
      tuningSpace.put_SystemType(DVBSystemType.Terrestrial);

      IDVBTLocator locator = (IDVBTLocator)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);
      object newIndex;
      _tuningSpace.put_DefaultLocator(locator);
      container.Add(_tuningSpace, out newIndex);
      tuner.put_TuningSpace(_tuningSpace);
      Release.ComObject("ITuningSpaceContainer", container);
      _tuningSpace.CreateTuneRequest(out request);
      _tuneRequest = request;
    }
Example #34
0
        public DigitalTuner(Config.Graph sourceConfig, Control hostControl)
            : base(sourceConfig, hostControl)
        {
            //deal with the Tuning Space and Network Provider
            tuningSpace = GetTuningSpace();

            Guid networkProviderCLSID;
            Guid networkTypeCLSID;

            tuningSpace.get__NetworkType(out networkTypeCLSID);
            if (networkTypeCLSID.Equals(Guid.Empty))
            {
                throw new Exception("Not a digital Network Type!");
            }

            if (UseGenericNetworkProvider)
            {
                networkProviderCLSID = CLSID_NetworkProvider;
            }
            else
            {
                networkProviderCLSID = networkTypeCLSID;
            }

            networkProvider = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(networkProviderCLSID));

            tuner = (ITuner)networkProvider;

            //   if (UseGenericNetworkProvider)
            {
                tuner.put_TuningSpace(tuningSpace);
            }

            int hr = _graphBuilder.AddFilter(networkProvider, "Network Provider");

            DsError.ThrowExceptionForHR(hr);

            //add MPEG2 Demux
            mpeg2Demux = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, "MPEG-2 Demultiplexer");

            //add video decoder
            videoDecoder = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, GraphConfig[FilterType.VideoDecoder].Name);
            if (videoDecoder == null)
            {
                throw new Exception("Could not instantiate video decoder!");
            }

            //add audio decoder
            if (GraphConfig[FilterType.AudioDecoder] != null)
            {
                audioDecoder = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, GraphConfig[FilterType.AudioDecoder].Name);
                if (audioDecoder == null)
                {
                    throw new Exception("Could not instantiate audio decoder!");
                }
            }

            //add BDA MPEG-2 Transport Information Filter
            bdaTransportInfo = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDATransportInformationRenderersCategory, "BDA MPEG2 Transport Information Filter");
            //add MPEG-2 Sections and Tables Filter
            mpeg2SectionsAndTables = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.BDATransportInformationRenderersCategory, "MPEG-2 Sections and Tables");

            //        sampleGrabberFilter = FilterGraphTools.AddFilterByName(_graphBuilder, FilterCategory.LegacyAmFilterCategory, "SampleGrabber");
            //        sampleGrabber = (ISampleGrabber)sampleGrabberFilter;
        }