2010-11-25 14 views
2

「Microsoft DVBTネットワークプロバイダ」、「AVerMedia BDA DVBTチューナー」、「AVerMEdia BDAデジタルキャプチャ」、「サンプルグラバー」および「NULLレンダラー」のDirectShowグラフがあります。ITuner :: put_TuneRequest()呼び出しが無視されました

これらのフィルタが接続されています。

「MPEG-2デマルチプレクサ」と「BDA MPEG2トランスポート情報フィルタ」もありますが、これら2つのフィルタは接続されていません。グラフを実行するには、ここにいる必要があるようです。

私はグラフを開始するときにTSデータを受信して​​いますが、私が何をするにしても、私はチューニング要求を出すことができません。 Windows Media Centerのような他のアプリケーションでは、最後にチューニングされた周波数からMUXデータをキャプチャすることしかできません。

// creating tuning space 

CComPtr<IDVBTuningSpace> pDVBTuningSpace;<br> 
hr = pDVBTuningSpace.CoCreateInstance(__uuidof(DVBTuningSpace)); 

WCHAR szFriendlyName[ 64 ] = L"Local DVB-T Digital Antenna";<br> BSTR bstrFriendlyName = SysAllocString(szFriendlyName); 

hr = pDVBTuningSpace->put_UniqueName(bstrFriendlyName);<br> 
hr = pDVBTuningSpace->put_FriendlyName(bstrFriendlyName); 

SysFreeString(bstrFriendlyName); 

CComBSTR clsid_dvbt = ("{216C62DF-6D7F-4e9a-8571-05F14EDB766A}");<br> 
hr = pDVBTuningSpace->put_NetworkType(clsid_dvbt);<br> 
hr = pDVBTuningSpace->put_SystemType(DVB_Terrestrial);<br> 


// creating tune request<br> 
CComPtr<ITuneRequest> pTuneRequest; 

hr = pDVBTuningSpace->CreateTuneRequest(&pTuneRequest); 

CComQIPtr<IDVBTuneRequest> pDVBTuneRequest(pTuneRequest); 

hr = pDVBTuneRequest->put_ONID(-1);<br> 
hr = pDVBTuneRequest->put_TSID(-1);<br> 
hr = pDVBTuneRequest->put_SID(-1); 

// locator<br> 
CComPtr<IDVBTLocator> pDVBTLocator; 

hr = pDVBTLocator.CoCreateInstance(__uuidof(DVBTLocator));<br> 
hr = pDVBTLocator->put_Bandwidth(8);<br> 
hr = pDVBTLocator->put_CarrierFrequency(506000); 

hr = pDVBTuneRequest->put_Locator(pDVBTLocator); 

CComQIPtr<ITuner> pTuner(pNetworkProvider_); 

hr = pTuner->put_TuneRequest(pDVBTuneRequest); 

これはグラフ中の「Microsoft DVB-Tネットワークプロバイダー」フィルタを追加した直後に実行されます。ここでは

チューニング要求を置くためのコードです。
上記のコードの "hr"値はすべてS_OKです。

私は間違っていますか?または、私はこの「調整要求」のもので大きなものを逃しましたか?

(帯域幅と周波数の値が正しい)

答えて

2

私はput_Bandwidth(8)が間違っている、それはHz単位の帯域幅であるべきだと思います。とにかく、私はあなたが使用しているコードをいくつか示します。多分それは助けます。

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 <IDVBTLocator> 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 <ITuningSpaceContainer> pTuningSpaceContainer; 
hr = pTuningSpaceContainer.CoCreateInstance(CLSID_SystemTuningSpaces); 

VARIANT tiIndex; 
hr = pTuningSpaceContainer->Add(pDVBTuningSpace2,&tiIndex);  

if (!SUCCEEDED(hr)) { 
    // Get the enumerator for the collection. 
    CComPtr<IEnumTuningSpaces> pTuningSpaceEnum; 
    hr = pTuningSpaceContainer->get_EnumTuningSpaces(&pTuningSpaceEnum); 
    if (SUCCEEDED(hr)) { 
     // Loop through the collection. 
     CComPtr<ITuningSpace> 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<ITuneRequest> pTuneRequest; 
hr = pDVBTuningSpace2->CreateTuneRequest(&pTuneRequest); 

CComQIPtr<IDVBTuneRequest> 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<ITuner> 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<IBaseFilter> pBdaReceiver; 
hr = FindDevice(KSCATEGORY_BDA_RECEIVER_COMPONENT, &pBdaReceiver, 0, 0, 0); 

hr = graph->AddFilter(pBdaReceiver,L"BDA Receiver"); 
hr = ConnectFilters(pBdaNetworkTuner,pBdaReceiver); 

CComPtr<IBaseFilter> pMpegDemux; 
hr = pMpegDemux.CoCreateInstance(CLSID_MPEG2Demultiplexer); 
hr = graph->AddFilter(pMpegDemux,L"MPEG Demux"); 
hr = ConnectFilters(pBdaReceiver,pMpegDemux); 

あなたは異なる順序でいくつかのことをしていますが、重要かどうかはわかりません。

+1

私はあなたのアプローチを試みましたが、結果はまったく同じです。 :-(私は、Hzで入力してみましたが、http://msdn.microsoft.com/en-us/library/dd693838(VS.85).aspxによるとMHzでなければなりません。おそらくWindows Media –

+1

@natko DVB-Tの場合、私は通常帯域幅に-1を使用していますが、DVB-Sでは27500000などを使用しなければならないので、ドキュメントが間違っています。あなたはONID、TSID、SIDを指定しません。私がそれらを入力しなければ、結果も得られません。TransEdit(http://www.dvbviewer.com/griga/TransEdit%20E/)を使ってそれらを見つけることができます。 MainWindow.html)(onidはwww.dvb.orgで見つけることができます)グラフェンを使って実験をすることができます。 – wimh

+0

DVB-Sではput_Bandwidthではなくput_SymbolRateを使用しています。それは別の関数です。 – wimh