Su | Mo | Tu | We | Th | Fr | Sa |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
いよいよ。ラジオの音が再生される日も目前です。わかってきました!わかってきました!
こんなことで挫折するような、よねっと氏ではなかったのですよ!
やっぱりPin接続っていうのをきちんとしないといけないっぽい。以下のような関数(もっと沢山必要かも)を駆使して、実現できるっぽい。
CoCreateInstanceでグラフを実体化して
AddFilter()でフィルターを追加
pCaputureGraphBuilde2->FindInterface()
pFilterGraph->FindInterface()とかFind()でピン情報を取得
pBaseFileter->ConnectedTo()で既に接続されているピンを検知
pIPin->QueryDirection()でアウトプットピンかインプットピンかを取得
pBaseFileter->ConnectDirect()やRenderStream()でピンとピンを結合
Pinに対応するFilterGraphを列挙する関数とかを自作しないといけないっぽいけど
そんなに難しくはなさそうEnumMediaTypeとかっていうインターフェースで列挙出来そう。
そうするとWDMストリーム標準データタイプハンドラ、つまりDirectSoundDeviceの抽出ができそうです。
DirectShowってややこしいけどいっぱいInterfaceが用意されていて、それを使いこなせれば、簡単な表記でやりとりができるんだね。
COMインターフェースの技術って凄いです。
対応するものがあれば、簡単にオーバーライド演算子= とかで代入を試みてくれます。インターフェースのコピーや転送といった考え方が面白いです。つまりIMediaControlもIGrapFilterもCComPtrのATLを使えば代入演算子だけで、必要なインタフェースが代入できてしまうっぽいです。しかし、これのデメリットはインターフェースのポインタを管理するだけで、COMだけでやってしまうと何が何と結びついていて、今、どういうものが保持されているかがかわからず、デバッグに骨が折れそうだということ。ときおり、COMを使わないクラスに中身を取得したり代入してみたりして、何が設定されているかわかるようにしないと厳しそうです。
それでも…
CAutoPtrとかCInterfaceListとか便利な器が用意されていて、調べれば調べるほど、その高度なプログラミングテクニックに感動します。
あと、GraphEditっていうDirectXのユーティリティが便利ね(いろんなDirectXSDKのバージョンがあって入手するのに手間どりましたが…)。グラフの繋ぎ方を勉強できる。しかもDirectShowで作られている、有名なアプリとか、いろんなアプリでその仕組みが参考にできるよ。SmartTeeとかっていうフィルタとかも発見しました。
これは、今までにやったプログラミングの中でもかなり勉強になる類のことをやっている気がするよ。クラスの概念を超越するような素晴らしい技術です。でも自分でインターフェースを作るとなるとまた大変そうで、自分はCOMインターフェースを使うので精一杯な気がします。idlとかいうファイルで専用のツールをつかってコンパイルするっぽいです。
んーつまりは
フィルターグラフマネージャーという一つのグラフフィルターの中に
グラフという物をいくつか追加して、それぞれのグラフ存在するピンを探して
必要なピンと必要なピンを繋ぐ、このときフィルターグラフにはキャプチャーグラフとよばれる、サウンドやムービーの元、フィルターグラフとよばれるエンコーダーのような仲介的なもの、そして、レンダーグラフというファイル出力やダイレクトサウンド出力が存在するってことだね。
そうやってできあがったフィルターグラフマネージャーは
メディアコントロールというものとかメディアイベントといったようなものと連携することで、再生したり再生中のイベントを取得したり、再生を止めたりする操作ができるようになるって感じになるんだね。
こういったことをやるために最初にいったようなCOMインターフェースや関数を使うと実装ができるということに他ならない。
概要がわかったZE!あとは、少しづつコードを組むだけだな。DirectShowは奥が深い。
Posted by yo-net at 2006年08月21日 23:38 | TrackBack(0)