Advertisement
cocus

TV Tuner DirectShow FM

Nov 23rd, 2015
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // TVTuner.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. /*
  6.  stdafx.h includes:
  7.  #include <tchar.h>
  8.  #include <stdio.h>
  9.  #include <dshow.h>
  10.  #include <ks.h>
  11.  #include <ksmedia.h>
  12.  #include <mmdeviceapi.h>
  13.  */
  14.  
  15. #define INSTANCEDATA_OF_PROPERTY_PTR(x) ((PKSPROPERTY((x))) + 1)
  16. #define INSTANCEDATA_OF_PROPERTY_SIZE(x) (sizeof((x)) - sizeof(KSPROPERTY))
  17.  
  18. IAMTVTuner *pTvTuner;
  19.  
  20. HRESULT setFreq(IAMTVTuner * tvtuner, long freq)
  21. {
  22.     HRESULT hr;
  23.     IKsPropertySet *pKSProp;
  24.     DWORD dwSupported = 0;
  25.  
  26.     hr = tvtuner->QueryInterface(IID_IKsPropertySet, (void**)&pKSProp);
  27.     if (FAILED(hr))
  28.     {
  29.         return hr;
  30.     }
  31.  
  32.     KSPROPERTY_TUNER_MODE_CAPS_S ModeCaps;
  33.     KSPROPERTY_TUNER_FREQUENCY_S Frequency;
  34.     memset(&ModeCaps,0,sizeof(KSPROPERTY_TUNER_MODE_CAPS_S));
  35.     memset(&Frequency,0,sizeof(KSPROPERTY_TUNER_FREQUENCY_S));
  36.     ModeCaps.Mode = AMTUNER_MODE_FM_RADIO;
  37.  
  38.     // Check either the Property is supported or not by the Tuner drivers
  39.     hr = pKSProp->QuerySupported(PROPSETID_TUNER,
  40.           KSPROPERTY_TUNER_MODE_CAPS,&dwSupported);
  41.     if(SUCCEEDED(hr) && dwSupported&KSPROPERTY_SUPPORT_GET)
  42.     {
  43.         DWORD cbBytes=0;
  44.         hr = pKSProp->Get(PROPSETID_TUNER,KSPROPERTY_TUNER_MODE_CAPS,
  45.             INSTANCEDATA_OF_PROPERTY_PTR(&ModeCaps),
  46.             INSTANCEDATA_OF_PROPERTY_SIZE(ModeCaps),
  47.             &ModeCaps,
  48.             sizeof(ModeCaps),
  49.             &cbBytes);  
  50.     }
  51.     else
  52.         return E_FAIL;
  53.  
  54.     Frequency.Frequency = freq;
  55.     if(ModeCaps.Strategy==KS_TUNER_STRATEGY_DRIVER_TUNES)
  56.         Frequency.TuningFlags=KS_TUNER_TUNING_FINE;
  57.     else
  58.         Frequency.TuningFlags=KS_TUNER_TUNING_EXACT;
  59.  
  60.     // Here the real magic starts
  61.     if(freq>=ModeCaps.MinFrequency && freq<=ModeCaps.MaxFrequency)
  62.     {
  63.         hr = pKSProp->Set(PROPSETID_TUNER,
  64.             KSPROPERTY_TUNER_FREQUENCY,
  65.             INSTANCEDATA_OF_PROPERTY_PTR(&Frequency),
  66.             INSTANCEDATA_OF_PROPERTY_SIZE(Frequency),
  67.             &Frequency,
  68.             sizeof(Frequency));
  69.         if(FAILED(hr))
  70.             return E_FAIL;  
  71.     }
  72.     else
  73.         return E_FAIL;
  74.  
  75.     return S_OK;
  76.  
  77. }
  78.  
  79. int _tmain(int argc, _TCHAR* argv[])
  80. {
  81.     IGraphBuilder *pGraphBuilder;
  82.     ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
  83.  
  84.     ICreateDevEnum *pCreateDevEnum = NULL;
  85.     IEnumMoniker *pEnumMoniker = NULL;
  86.     IMoniker *pMoniker = NULL;
  87.  
  88.     ULONG nFetched = 0;
  89.     IBaseFilter *pDeviceFilter;
  90.  
  91.     // initialize COM
  92.     CoInitialize(NULL);
  93.  
  94.     // create FilterGraph
  95.     CoCreateInstance(CLSID_FilterGraph,
  96.         NULL,
  97.         CLSCTX_INPROC,
  98.         IID_IGraphBuilder,
  99.         (LPVOID *)&pGraphBuilder);
  100.  
  101.     // create CaptureGraphBuilder2
  102.     CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
  103.         IID_ICaptureGraphBuilder2,
  104.         (LPVOID *)&pCaptureGraphBuilder2);
  105.  
  106.     // set FilterGraph
  107.     pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);
  108.  
  109.     // create CreateDevEnum to list device
  110.     CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
  111.         IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);
  112.  
  113.     // create EnumMoniker to list VideoInputDevice
  114.     pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
  115.         &pEnumMoniker, 0);
  116.     if (pEnumMoniker == NULL) {
  117.         // this will be shown if there is no capture device
  118.         printf("no devices\n");
  119.         /* TODO: Cleanup COM objects */
  120.         return 0;
  121.     }
  122.  
  123.     // reset EnumMoniker
  124.     pEnumMoniker->Reset();
  125.  
  126.     // get the first Moniker
  127.     pEnumMoniker->Next(1, &pMoniker, &nFetched);
  128.  
  129.     // bind Monkier to Filter
  130.     pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter);
  131.  
  132.     // add device filter to FilterGraph
  133.     pGraphBuilder->AddFilter(pDeviceFilter, L"Device Filter");
  134.  
  135.     // Monkier and Enumerator can be freed now
  136.     pMoniker->Release();
  137.     pEnumMoniker->Release();
  138.     pCreateDevEnum->Release();
  139.  
  140.  
  141.     // Get IAMTVTuner from Graph.
  142.     // If there are more than 1 TV Tuner devices,
  143.     // you will need to use FindInterface again.
  144.     HRESULT hr;
  145.     hr = pCaptureGraphBuilder2->FindInterface(&LOOK_UPSTREAM_ONLY,
  146.         NULL, pDeviceFilter,
  147.         IID_IAMTVTuner, (LPVOID *)&pTvTuner);
  148.     if (hr != S_OK) {
  149.         printf("could not get TV Tuner\n");
  150.         /* TODO: Cleanup COM objects */
  151.         return 1;
  152.     }
  153.    
  154.     // Check whether the mode is supported.
  155.     long lModes = 0;
  156.     hr = pTvTuner->GetAvailableModes(&lModes);
  157.     if (SUCCEEDED(hr) && (lModes & AMTUNER_MODE_FM_RADIO))
  158.     {
  159.         // Set the FM mode.
  160.         hr = pTvTuner->put_Mode(AMTUNER_MODE_FM_RADIO);
  161.     }
  162.     else
  163.     {
  164.         printf("Tuner doesn't support the FM mode, or it can't list the modes it supports.\n");
  165.         /* TODO: Cleanup COM objects */
  166.         return E_NOTIMPL;
  167.     }
  168.  
  169.     // Build Graph
  170.     pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,
  171.         NULL, pDeviceFilter, NULL, NULL);
  172.  
  173.     /* Hide the Render window */
  174.     IVideoWindow *pVidWindow;
  175.     pGraphBuilder->QueryInterface(IID_IVideoWindow, (void**)&pVidWindow);
  176.     pVidWindow->put_AutoShow(OAFALSE);
  177.  
  178.     // get IMediaControl to Run Graph
  179.     IMediaControl *pMediaControl;
  180.     pGraphBuilder->QueryInterface(IID_IMediaControl,
  181.         (LPVOID *)&pMediaControl);
  182.  
  183.    
  184.     pTvTuner->put_Channel(107900000,
  185.         AMTUNER_SUBCHAN_DEFAULT, AMTUNER_SUBCHAN_DEFAULT);
  186.     /* I've also tried with setFreq(107900000); (which should set an EXACT frequency)
  187.      * but it's the same thing! */
  188.  
  189.     // Start playing
  190.     pMediaControl->Run();
  191.  
  192.     // Block execution using MessageBox
  193.     // The video will be played until the OK is pressed
  194.     MessageBox(NULL, "Press OK to end", "block", MB_OK);
  195.  
  196.     // stop playing
  197.     pMediaControl->Stop();
  198.  
  199.     // release
  200.     pTvTuner->Release();
  201.  
  202.     pMediaControl->Release();
  203.     pCaptureGraphBuilder2->Release();
  204.     pGraphBuilder->Release();
  205.  
  206.     // finalize COM
  207.     CoUninitialize();
  208.  
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement