Menu

itunercap

DMAN
2009-09-09
2012-10-29
  • DMAN

    DMAN - 2009-09-09

    Does anyone have experience on how to use the ITunderCap interface?
    I'm trying to identify the BDA tuning capabilities of the tuner filter in a graph.

    DMAN

     
    • DMAN

      DMAN - 2009-09-10

      Sorted it

      Here is a BDA sample for others to use in the future:

      void DetectCards()
      {
        ITunerCap _providerType;
        //BDA TV devices
        devices = DsDevice.GetDevicesOfCat(FilterCategory.BDASourceFiltersCategory);
        if (devices.Length > 0)
        {
          IFilterGraph2 graphBuilder = (IFilterGraph2)new FilterGraph();
          DsROTEntry rotEntry = new DsROTEntry(graphBuilder);
          //MS Network Provider - MCE 2005 Roll-up 2 or better
          networkProviderClsId = typeof(NetworkProvider).GUID;
          for (int i = 0; i < devices.Length; i++)
          {
            string name = devices[i].Name ?? "unknown";
            name = name.ToLowerInvariant();
            Log.Log.WriteFile("Found card:{0}", name);
            IBaseFilter tmp;
            graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, name, out tmp);
              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 = 1;
                int pulcNetworkTypes;
                Guid[] lpDeinterlaceModes = new Guid[ulcNetworkTypesMax];
                int hr = _providerType.get_SupportedNetworkTypes(ulcNetworkTypesMax, out pulcNetworkTypes, lpDeinterlaceModes);
                Log.Log.Debug("Number of SupportedNetworkTypes = {0}", pulcNetworkTypes);
                for (int n = 0; n < pulcNetworkTypes; n++)
                {
                  Log.Log.Debug("SupportedNetworkTypes = {0}", lpDeinterlaceModes[n]);
                }
                //test the first found guid to determine the DVB card type
                if (lpDeinterlaceModes[0] == (typeof(DVBTNetworkProvider).GUID))
                {
                  Log.Log.WriteFile("Detected DVB-T* card:{0}", name);
                  TvCardDVBT dvbtCard = new TvCardDVBT(_epgEvents, devices[i]);
                  _cards.Add(dvbtCard);
                }
                else if (lpDeinterlaceModes[0] == (typeof(DVBSNetworkProvider).GUID))
                {
                  Log.Log.WriteFile("Detected DVB-S* card:{0}", name);
                  TvCardDVBS dvbsCard = new TvCardDVBS(_epgEvents, devices[i]);
                  _cards.Add(dvbsCard);
                }
                else if (lpDeinterlaceModes[0] == (typeof(DVBCNetworkProvider).GUID))
                {
                  Log.Log.WriteFile("Detected DVB-C* card:{0}", name);
                  TvCardDVBC dvbcCard = new TvCardDVBC(_epgEvents, devices[i]);
                  _cards.Add(dvbcCard);
                }
                else if (lpDeinterlaceModes[0] == (typeof(ATSCNetworkProvider).GUID))
                {
                  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);
              }
              Log.Log.WriteFile("Not connected with generic MS Network Provider, using the original method");
              graphBuilder.RemoveFilter(networkDVB);
              Release.ComObject("ms provider", networkDVB);
            }
          FilterGraphTools.RemoveAllFilters(graphBuilder);
          rotEntry.Dispose();
          Release.ComObject("graph builder", graphBuilder);
        }
      }
      
       

Log in to post a comment.