ピン カテゴリの操作
フィルタで特定のピン カテゴリのピンを検索するには、ICaptureGraphBuilder2::FindPin メソッドを使える。次の例は、ビデオ プレビュー ピンを検索する。
int i = 0;
hr = pBuild->FindPin(
pFilter, // 検索するフィルタへのポインタ。
PINDIR_OUTPUT, // どちらのピン方向?
&PIN_CATEGORY_PREVIEW, // どちらのカテゴリ? (NULL は "すべてのカテゴリ" を意味する)
&MEDIATYPE_Video, // どちらのメディア タイプ? (NULL は "すべてのタイプ" を意味する)
FALSE, // 接続が必要か?
i, // i 番目に一致するピンを取得する (0 = 最初に一致するピン)
&pPin // ピンへのポインタを受け取る。
);
最初の引数はフィルタのIBaseFilter インターフェイスへのポインタである。次の 3 つの引数で、方向、ピン カテゴリ、およびメディア タイプを指定する。5 番目の引数の値 FALSE は、ピンが接続または未接続できることを示す。 (これらのパラメータの正確な定義については、メソッドのドキュメントを参照すること。)メソッドは、適合するピンを見つけると、pPin パラメータによって IPin インターフェイスへのポインタを返す。
FindPin メソッドは便利だが、必要に応じて独自のヘルパー関数を作成することもできる。ピンのカテゴリを確認するには、「ピン プロパティ セット」トピックで説明しているように、IKsPropertySet::Get メソッドを呼び出す。
次のコードは、ピンが指定されたカテゴリに一致するかどうかを確認するヘルパー関数を示している。
BOOL PinMatchesCategory(IPin *pPin, const GUID& Category)
{
if (pPin == NULL) return E_POINTER;
BOOL bFound = FALSE;
IKsPropertySet *pKs;
HRESULT hr = pPin->QueryInterface(IID_IKsPropertySet, (void **)&pKs);
if (SUCCEEDED(hr))
{
GUID PinCategory;
DWORD cbReturned;
hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0,
&PinCategory, sizeof(GUID), &cbReturned);
if (SUCCEEDED(hr))
{
bFound = (PinCategory == Category);
}
pKs->Release();
}
return bFound;
}
次の例は、FindPin メソッドのように、カテゴリ別にピンを検索する関数を示している。
HRESULT FindPinByCategory(
IBaseFilter *pF, // 検索するフィルタへのポインタ。
PIN_DIRECTION PinDir, // ピンの方向。
const GUID& Category, // ピン カテゴリ。
IPin **ppPin) // ピンへのポインタを受け取る。
{
if (!pF || !ppPin) return E_POINTER;
*ppPin = 0;
HRESULT hr;
IEnumPins *pEnum = 0;
if (SUCCEEDED(pF->EnumPins(&pEnum)))
{
IPin *pPin = 0;
while (hr = pEnum->Next(1, &pPin, 0), hr == S_OK)
{
PIN_DIRECTION ThisPinDir;
hr = pPin->QueryDirection(&ThisPinDir);
if (FAILED(hr))
{
pPin->Release();
pEnum->Release();
return E_UNEXPECTED; // 予期しないことが発生した。
}
if ((ThisPinDir == PinDir) &&
PinMatchesCategory(pPin, Category))
{
*ppPin = pPin; // 呼び出し元はインターフェイスを解放する必要がある。
pEnum->Release();
return S_OK;
}
pPin->Release();
}
pEnum->Release();
}
// 一致するピンがない。
return E_FAIL;
}
次のコードは、前の関数を使い、フィルタでビデオ ポート ピンを検索する。
IPin *pVP;
hr = FindPinByCategory(pFilter, PINDIR_OUTPUT,
PIN_CATEGORY_VIDEOPORT, &pVP);
if (SUCCEEDED(hr))
{
// pVP を使う ...
// 完了したら、解放する。
pVP->Release();
}
プロパティ セットの詳細については、Microsoft® Windows® Driver Development Kit (DDK) のドキュメントを参照すること。
参照