TVチューナーを制御する
ここでは、TVチューナーデバイスを制御するIAMTVTunerを利用する方法を説明したいと思います。 (注意)ここの例では、サンプルを簡潔にするためにエラー処理を書いていません。
とりあえず、コードを書いてみる
まず、何も考えずに以下のコードを書いてみましょう。 このコードは、最初に発見したキャプチャデバイスからTVチューナーデバイス用のインターフェースを取得しようとします。 IAMTVTunerインターフェースが取得できなければ、その場でサンプルは終了します。 このサンプルは再生を行わず、IAMTVTunerインターフェースの取得のみを行っているので注意してください。 再生も含めたサンプルは後述したいと思います。
#include <stdio.h>
#include <dshow.h>
int
main()
{
IGraphBuilder *pGraphBuilder;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
// 補足情報)英単語の日本語訳
// Enumerate : 列挙、一覧
// Moniker : あだ名
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
IMoniker *pMoniker = NULL;
ULONG nFetched = 0;
IBaseFilter *pDeviceFilter;
// COMを初期化
CoInitialize(NULL);
// FilterGraphを生成
CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder,
(LPVOID *)&pGraphBuilder);
// CaptureGraphBuilder2というキャプチャ用GraphBuilderを生成する
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2,
(LPVOID *)&pCaptureGraphBuilder2);
// FilterGraphをセットする
pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);
// デバイスを列挙するためのCreateDevEnumを生成
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);
// VideoInputDeviceを列挙するためのEnumMonikerを生成
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEnumMoniker, 0);
if (pEnumMoniker == NULL) {
// 接続された映像入力デバイスが一つも無い場合にはこのif文に入ります
printf("no device\n");
return 0;
}
// EnumMonikerをResetする
// Resetすると、先頭から数えなおします
pEnumMoniker->Reset();
// 最初のMonikerを取得
pEnumMoniker->Next(1, &pMoniker, &nFetched);
// MonkierをFilterにBindする
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter );
// FilterGraphにデバイスフィルタを追加する
pGraphBuilder->AddFilter(pDeviceFilter, L"Device Filter");
// この時点でMonkier系、Enumerator系は用済み
pMoniker->Release();
pEnumMoniker->Release();
pCreateDevEnum->Release();
/*
* IAMTVTuner
*/
HRESULT hr;
IAMTVTuner *pTvTuner;
// Graph内からIAMTVTunerを取得。
// 2つ以上のTV Tunerがある場合には、
// もう一度FindInterfaceを繰り返す必要あり。
hr = pCaptureGraphBuilder2->FindInterface(&LOOK_UPSTREAM_ONLY,
NULL, pDeviceFilter,
IID_IAMTVTuner, (LPVOID *)&pTvTuner);
if (hr != S_OK) {
printf("could not get TV Tuner\n");
return 1;
}
// 資源を解放
pTvTuner->Release();
pCaptureGraphBuilder2->Release();
pGraphBuilder->Release();
// COM終了
CoUninitialize();
return 0;
}
このサンプルは最初に発見したキャプチャデバイスからIAMTVTunerを取得しようとします。 複数あるデバイスを選んだり、発見したデバイスの情報を表示したりする方法はここをご覧下さい。