DirectX でデジタル TV アプリケーションを書く
この節では、ビデオ コントロールを使用できない下位プラットフォーム用のデジタル TV フィルタ グラフを作成する方法について説明する。このようなプラットフォームでは、アプリケーションはデジタル TV グラフを手動で作成し、各フィルタの追加や接続をしなければならない (キャプチャ グラフ ビルダ オブジェクトはデジタル TV グラフをサポートしないことに注意)。BDA サンプル アプリケーションでは、基本的なデジタル TV フィルタ グラフを作成する方法が紹介されている。
チューニング要求の取得
最初にチューニング要求を取得する。ガイド ストアから取得するか、またはアプリケーション内でプログラム的に作成する。詳細については、「Microsoft 統合チューニング モデル」を参照すること。
ネットワーク プロバイダ フィルタの作成
デジタル TV フィルタ グラフに最初に表示されるフィルタは、BDA ネットワーク プロバイダ フィルタである。ネットワーク プロバイダはチューニングを制御し、トランスポート情報フィルタ (TIF) と連携して、トランスポート ストリームから番組情報を取得する。ネットワーク プロバイダ フィルタを選択するには、チューニング空間のネットワーク タイプ プロパティを問い合わせる。ネットワーク タイプ プロパティはそのチューニング空間で使われるネットワーク プロバイダの CLSID に対応している。次のコードは、ネットワーク プロバイダを作成してグラフに追加する方法を示している。
CComPtr<ITuneRequest> pTuneRequest; // チューニング要求
CComPtr<ITuningSpace> pTuningSpace; // チューニング空間
CComPtr<IBaseFilter> pNetworkProvider; // ネットワーク プロバイダ フィルタ
GUID CLSIDNetworkType; // ネットワーク タイプの GUID。
// チューニング要求を初期化する (省略)。
// このチューニング要求のチューニング空間を見つける。
hr = pTuneRequest->get_TuningSpace(&pTuningSpace);
if (FAILED(hr))
{
// エラーを処理する。
}
// ネットワーク タイプを見つける。
hr = pTuningSpace->get__NetworkType(&CLSIDNetworkType);
if (FAILED(hr))
{
// エラーを処理する。
}
if (CLSID_NetworkType == GUID_NULL)
{
// このチューニング空間はアナログ TV、AuxIn、またはその他の非 BDA タイプである。
}
else
{
// このネットワーク タイプ用のネットワーク プロバイダ フィルタを作成する。
hr = pNetworkProvider.CoCreateInstance(CLSIDNetworkType);
if (SUCCEEDED(hr))
{
// ネットワーク プロバイダをグラフに追加する。
hr = pGraph->AddFilter(pNetworkProvider, L"Network Provider");
}
}
ITuneRequest::get_TuningSpace メソッドは、特定のチューニング要求のチューニング空間へのポインタを取得する。次に、ITuningSpace::get__NetworkType を呼び出してネットワーク タイプ GUID を取得する。この GUID を CoCreateInstance 関数に渡してネットワーク プロバイダ フィルタを作成する。
アナログ チューニング空間
一部のチューニング空間では、ネットワーク タイプが GUID_NULL である。これは、チューニング空間がデジタル TV ネットワークを表さないことを意味する。そのため、BDA ネットワーク プロバイダ フィルタはこのチューニング空間を処理しない。この場合、アプリケーションでは、「ビデオ キャプチャ」および「アナログ TV」の節にある説明に従って、アナログ TV キャプチャ グラフを作成する必要がある。チューニング要求上のチャンネル番号は、TV チューナー フィルタ上に設定するチャンネルを示す。
AuxInTuningSpace チューニング空間は、補助ビデオ入力または "AuxIn" を表す。チャンネル番号は入力ソースを示す。
チャンネル番号 | 入力 |
0 | S ビデオ |
1 | 合成ビデオ |
チューニング要求が AuxIn タイプかどうかを確認するには、チューニング空間の IAuxInTuningSpace インターフェイスを問い合わせる。このインターフェイスが公開されている場合は、アナログ キャプチャ グラフを作成し、クロスバー フィルタを使用して入力ソースを選択する。詳細については、「クロスバーの操作」を参照すること。S ビデオの場合は、PhysConn_Video_SVideo ピンをビデオ出力ピンにルーティングする。合成ビデオの場合は、PhysConn_Video_Composite ピンをビデオ出力にルーティングする。両方の場合に、PhysConn_Audio_Line ピンをオーディオ出力にルーティングする。
アナログ グラフの場合、この節の以降の部分は無視してかまわない。
ネットワーク プロバイダへのチューニング要求の送信
ネットワーク プロバイダをグラフに追加した後、チューニング要求へのポインタを指定してネットワーク プロバイダの ITuner インターフェイスを問い合わせ、ITuner::put_TuneRequest を呼び出す。
// ITuner を問い合わせる。
CComQIPtr<ITuner> pTuner(pNetworkProvider);
if (pTuner)
{
// ネットワーク プロバイダにチューニング要求を送信する。
hr = pTuner->put_TuneRequest(pTuneRequest);
}
残りのフィルタの追加と接続
チューニング要求のネットワーク プロバイダを構成した後、残りのフィルタをグラフに追加できる。ネットワーク プロバイダは、"BDA ソース フィルタ" カテゴリのチューナー フィルタ (KSCATEGORY_BDA_NETWORK_TUNER) に接続するチューナー フィルタは、"" カテゴリの 1 つ以上のフィルタ (KSCATEGORY_BDA_RECEIVER_COMPONENT) に接続する。このカテゴリには、ハードウェアに応じて、キャプチャ フィルタまたはデモジュレータ フィルタが含まれる。アプリケーションでは、メディア タイプ別またはメディア別にこのカテゴリのフィルタを列挙し、フィルタを接続する必要がある。
キャプチャ フィルタを MPEG-2 デマルチプレクサに接続する。すると、優先コンポーネント タイプに基づいて出力ピンが自動的に構成される。通常、ピン 1 は BDA MPEG-2 トランスポート情報フィルタ (TIF) に接続する。通常は、すべての出力ピンをデマルチプレクサ上にレンダリングすれば、正しいレンダラ フィルタがグラフに追加される。IP データの場合は、デマルチプレクサ上の出力ピンを BDA MPE フィルタ経由で BDA IP シンク フィルタに接続する。
デフォルト優先コンポーネント タイプの定義
"コンポーネント" はプログラム サブストリームを表す。デフォルト優先コンポーネント タイプは、ユーザーがデフォルトでアクティブにすることを望むタイプのサブストリームである。たとえば、スペイン語のオーディオ ストリームが利用可能なときはいつもそれを再生するように指定するユーザーもいる。アプリケーションは空のコンポーネント コレクション オブジェクトをインスタンス化し、それに書き込むことによって優先コンポーネント セットを作成する。次にアプリケーションはそのコンポーネント オブジェクトを持続するように保存するか、チューナーに送る。またはその両方を行う。チューナーは利用可能なサブストリームに変更があると必ずコンポーネント オブジェクトをチェックする。
サブストリームの選択
どのサブストリームをアクティブまたは非アクティブにするかを指定するには、アプリケーションは最初にチューニング要求をチューナーに送らなければならない。チューナーが指定したチャンネルや周波数をチューニングすると、チューナーはチューニング要求のコンポーネント コレクションにアクティブまたは非アクティブな各サブストリームの情報を書き込む。次にアプリケーションはこのコレクション内の各コンポーネントを調べ、IComponent::put_Status メソッドを使って個々のサブストリームをアクティブまたは非アクティブにすることができる。
デジタル チューニング
最初のチューニング要求が送られた後、次のチューニングは新しいチューニング要求をネットワーク プロバイダに送ることによって行われる。