UVC 拡張ユニットのサンプル アプリケーション
重要
このトピックのコンテンツとサンプル コードは古く、現在はサポートされていません。 現在のドライバー開発ツールチェーンでは動作しない場合があります。
このトピックには、拡張ユニットをサポートするために使用できるサンプル アプリケーション コードが含まれています。
アプリケーションは、IKsTopologyInfo::CreateNodeInstance を使用してインターフェイスにアクセスし、その後にノード オブジェクトのQueryInterface を呼び出して、必要な COM API を取得します。 詳細については、「IKsTopologyInfo」を参照してください。
TestApp.cpp という任意の名前のアプリケーション ソースに次のコードを含めます。
また、TestApp.cpp には、拡張ユニットによる自動更新イベントのサポートに示されているコードも含含めます。
// pUnkOuter is the unknown associated with the base filter
hr = pUnkOuter->QueryInterface(__uuidof(IKsTopologyInfo),
(void **) &pKsTopologyInfo);
if (!SUCCEEDED(hr))
{
printf("Unable to obtain IKsTopologyInfo %x\n", hr);
goto errExit;
}
hr = FindExtensionNode(pKsTopologyInfo,
GUID_EXTENSION_UNIT_DESCRIPTOR,
&dwExtensionNode);
if (FAILED(hr))
{
printf("Unable to find extension node : %x\n", hr);
goto errExit;
}
hr = pKsTopologyInfo->CreateNodeInstance(
dwExtensionNode,
__uuidof(IExtensionUnit),
(void **) &pExtensionUnit);
if (FAILED(hr))
{
printf("Unable to create extension node instance : %x\n", hr);
goto errExit;
}
hr = pExtensionUnit->get_PropertySize(1, &ulSize);
if (FAILED(hr))
{
printf("Unable to find property size : %x\n", hr);
goto errExit;
}
pbPropertyValue = new BYTE[ulSize];
if (!pbPropertyValue)
{
printf("Unable to allocate memory for property value\n");
goto errExit;
}
hr = pExtensionUnit->get_Property(1,ulSize, pbPropertyValue);
if (FAILED(hr))
{
printf("Unable to get property value\n");
goto errExit;
}
// assume the property value is an integer
ASSERT(ulSize == 4);
printf("The value of property 1 = %d\n", *((int *)
pbPropertyValue));
この場合、 pUnkOuter は USB ビデオ クラス (UVC) デバイスを表すキャプチャ フィルターへのポインターである必要があります。 キャプチャ フィルターをフィルター グラフに追加した後、このサンプル コードに示すように、IKsTopologyInfo インターフェイスのフィルターに対してクエリを実行できます。
FindExtensionNode 関数のコードを記述して、必要な拡張ユニット ノードを見つけ、その ID を dwExtensionNode に返します。 この ID は、このサンプル コードの後続の IKsTopologyInfo::CreateNodeInstance メソッドの呼び出しで使用されます。