複数のアナログ入力があるデバイスを扱う(3)
キャプチャボードやTVチューナーデバイスには、複数のアナログ入力端子が存在するものがあります。 それらの入力デバイスを扱っているとアナログ入力から得られるデータのパス(もしくは経路、もしくはRoute)を設定したくなると思います。 directshowでは、IAMCrossbarを利用することによりそれらの制御が行えます。 ここでは、アナログ入力デバイスから出力されるデータのパスを設定する方法を説明したいと思います。
経路の情報取得と設定
IAMCrossbarインターフェースの取得方法やアナログ入力端子・データ出力に関する情報取得方法を説明しました。 ここでは、取得した情報を元にパスを設定する方法を説明したいと思います。
パスを設定する際に重要になるのが、OutputPin・InputPinとは何かを知ることです。 まず、InputPinですが、InputPinというのは機器に物理的に付いている入力デバイスだと思って下さい。 例えば、TVチューナーとS-Video入力が付属しているTVキャプチャデバイス(TVキャプチャカード)であればTV TunerとS-Videoの2種類のInputPinがあると思われます。 OutputPinはdirectshowにデータを出力するためのPINです。 キャプチャカードからのデータはこのOutputPinからdirectshowのgraphに入ってきます。 OutputPinにInputPinからのパスを設定すると、directshowのgraphに入ってくるデータを制御できます。 例えば、あるOutputPinへのパスをTVチューナーInputPinにするとTVチューナーからの映像がgraphに入ってきます。 OutputPinへのパスをS-Video InputPinに変更するとS-Videoから入力されている映像がgraphに入ってきます。
IAMCrossbar::Route
IAMCrossbar::Routeを利用するとパスの設定が出来ます。 Routeの引数は2つあります。 引数は両方ともlongです。 一つ目の引数がOutputPinを表すlongの値で、二つ目の引数がInputPinを表すlongの値になります。 Routeに渡すためのlongの値はget_CrossbarPinInfoを利用して取得できます。 IAMCrossbarインターフェースの取得方法やget_CrossbarPinInfoの利用方法は前述したサンプルをご覧下さい。
long out;
long in;
IAMCrossbar *crossbar;
crossbar->Route(out, in);
IAMCrossbar::get_IsRoutedToを利用するとOutputPinが利用しているInputPinのlong値を取得できます。 get_IsRoutedToの一つ目の引数はOutputPinを表します。一つ目の引数はlongです。 二つ目の引数はInputPinに関する情報を取得するためのものです。二つ目の引数はlongへのポインタ(long *)になります。
long out;
long in;
IAMCrossbar *crossbar;
crossbar->get_IsRoutedTo(out, &in);
まとめ
ここでは、パスの設定方法を説明しました。 パスの設定は機器にどのような入出力デバイスがあるかに依存するので、ここではサンプルを記述していません。 わかりにくい場合は質問してください。