ITuner::put_TuneRequest() call ignored

后端 未结 1 1240
猫巷女王i
猫巷女王i 2021-01-15 16:09

I have a DirectShow graph with a \"Microsoft DVBT Network Provider\", \"AVerMedia BDA DVBT Tuner\", \"AVerMEdia BDA Digital Capture\", \"Sample Grabber\" and \"NULL Renderer

1条回答
  •  悲哀的现实
    2021-01-15 16:52

    I think put_Bandwidth( 8 ) is wrong, it should be a bandwidth in Hz. Anyway, I show you some code I use. Maybe it helps.

    HRESULT hr;
    CComBSTR TuningName;
    
    hr = pDVBTuningSpace2.CoCreateInstance(CLSID_DVBTuningSpace);
    
    hr = pDVBTuningSpace2->put_SystemType(DVB_Terrestrial);
    
    TuningName = L"My DVB-T";
    hr = pDVBTuningSpace2->put__NetworkType(CLSID_DVBTNetworkProvider);
    
    CComPtr  pDVBTLocator;
    hr = pDVBTLocator.CoCreateInstance(CLSID_DVBTLocator);
    hr = pDVBTLocator->put_CarrierFrequency(config->GetFreq());
    hr = pDVBTLocator->put_Bandwidth(config->GetSymbolRate());
    hr = pDVBTuningSpace2->put_DefaultLocator(pDVBTLocator);
    
    hr = pDVBTuningSpace2->put_UniqueName(TuningName);
    hr = pDVBTuningSpace2->put_FriendlyName(TuningName);
    hr = pDVBTuningSpace2->put_FrequencyMapping(L"");
    
    CComPtr  pTuningSpaceContainer;
    hr = pTuningSpaceContainer.CoCreateInstance(CLSID_SystemTuningSpaces);
    
    VARIANT tiIndex;
    hr = pTuningSpaceContainer->Add(pDVBTuningSpace2,&tiIndex);    
    
    if (!SUCCEEDED(hr)) {
        // Get the enumerator for the collection.
        CComPtr pTuningSpaceEnum;
        hr = pTuningSpaceContainer->get_EnumTuningSpaces(&pTuningSpaceEnum);
        if (SUCCEEDED(hr)) {
            // Loop through the collection.
            CComPtr pTuningSpace;
            //ITuningSpace *pTuningSpace;
            tiIndex.intVal=0;
            while (S_OK == pTuningSpaceEnum->Next(1, &pTuningSpace, NULL)) {
                USES_CONVERSION;
                BSTR Name;
    
                hr = pTuningSpace->get_UniqueName(&Name);
                if (SUCCEEDED(hr)) {
                    if (wcscmp(OLE2W(Name), TuningName) == 0) {
                        hr = pTuningSpaceContainer->put_Item(tiIndex,pDVBTuningSpace2);
                    }
                    SysFreeString(Name);
                }
    
                tiIndex.intVal++;
                //pTuningSpace->Release();
                pTuningSpace.Release();
            }
        }
    }
    
    CComPtr pTuneRequest;
    hr = pDVBTuningSpace2->CreateTuneRequest(&pTuneRequest);
    
    CComQIPtr pDVBTuneRequest(pTuneRequest);
    if(pDVBTuneRequest) {
    
        hr = pDVBTuneRequest->put_SID(config->GetSid());
        hr = pDVBTuneRequest->put_TSID(config->GetTsid());
        hr = pDVBTuneRequest->put_ONID(config->GetOnid());
    }
    
    GUID CLSIDNetworkType;
    hr = pDVBTuningSpace2->get__NetworkType(&CLSIDNetworkType);
    
    hr = CoCreateInstance(CLSIDNetworkType, NULL, CLSCTX_INPROC_SERVER,
                          IID_IBaseFilter, (void **) &pNetworkProvider);
    hr = graph->AddFilter(pNetworkProvider,L"Network Provider");
    
    // Query for ITuner.
    CComQIPtr pTuner(pNetworkProvider);
    if (pTuner) {
        // Submit the tune request to the network provider.
        hr = pTuner->put_TuneRequest(pTuneRequest);
    }
    
    hr = graph->AddFilter(pBdaNetworkTuner,L"BDA Source");
    hr = ConnectFilters(pNetworkProvider,pBdaNetworkTuner);
    CComPtr pBdaReceiver;
    hr = FindDevice(KSCATEGORY_BDA_RECEIVER_COMPONENT, &pBdaReceiver, 0, 0, 0);
    
    hr = graph->AddFilter(pBdaReceiver,L"BDA Receiver");
    hr = ConnectFilters(pBdaNetworkTuner,pBdaReceiver);
    
    CComPtr pMpegDemux;
    hr = pMpegDemux.CoCreateInstance(CLSID_MPEG2Demultiplexer);
    hr = graph->AddFilter(pMpegDemux,L"MPEG Demux");
    hr = ConnectFilters(pBdaReceiver,pMpegDemux);
    

    You are doing some things in a different order, but I'm not sure if it matters.

    0 讨论(0)
提交回复
热议问题