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 |
RadioShark の Win 版 再生専用アプリ完成しました。
ちょっと時間がかかりましたが、とりあえず、再生が出来ました。感動した!
これはまだ、通過点でしかないのだけれども、少し筒、DirectShowを制覇しつつあるね。
次は
mp3で録音とか、
各地域毎のラジオ局設定とか
最小化時タスクトレイアイコン化とか
アイコンデザインとか
アプリケーションウィンドウのデザインとか
アプリ起動時の各種設定(起動時と同時に再生するかとか、住んでいる地域の設定とか)
予約録音とか・・・・
番組表連動予約とか、現在の番組内容表示とか(どうやって?)・・・・
そういうのをやろうかと思います。
図はグラフエディタで、ROT(RunningObjectTable)を ピン接続図として読み込んだ様子と
起動しているアプリ一覧と音が鳴っているよ!という自慢というか生きた証というか
、そういうものです。(RadioShark持ってない人とかばっかりなのでほとんどの人は全く興味無いでしょうけど…)
最終的にはFMの15MHzシフト部品(いわゆるFMコンバーター)とかを作って日本のFMも聞けるようにしたいな。そしたら、このプレイヤーで15MHzずらした値で制御すればいいんだよね。
必要は発明の母なりを目指そうと思います。
いよいよ。ラジオの音が再生される日も目前です。わかってきました!わかってきました!
こんなことで挫折するような、よねっと氏ではなかったのですよ!
やっぱり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は奥が深い。
DirectShowでのデバイスキャプチャープレビューはきついっすね。
資料が膨大かつ、オーディオデバイスキャプチャー関連の情報が少ないので、手順がよくわからん。
とりあえず、今のところの思考回路
CComPtr<IGraphBuilder>とかのComPtrATLを使おうと思っている。
どうやら、グラフビルダーというものをうまく使いこなさないといけないっぽい
CComPtr<IGraphBuilder>フィルターグラフ
CComPtr<ICaputureGraphBuilder2>キャプチャー用
CComPtr<IMediaControl>コントロール用
でキャプチャーデバイスの再生はコントロールできそう。だけど
デバイスを取得したものの、どうやって関連付けをするのか良くわからない。
もう一つ
Pinという考え方があって、どうやらキャプチャーデバイスとは別に
Default Wave OutのデバイスもしくはDefault Direct SoundのデバイスとPin接続をしないといけないっぽい。
こちらもやり方がよくわからない。DirectX付属のユーティリティGraphEditorでは簡単に聞けるのに、たったこれだけのことをやるだけでも、随分と複雑ね。イヂワル。って俺が無能なだけなんだけど・・・・
DirectXの資料の読み進めかたが悪いのかもしれない。サウンドデバイスプログラミングって、技術の範囲が広くて、ビデオの再生とか、ファイルの再生とか、ファイルの録音、変換、そんな情報ばかりが散在する感じです。
やりたいことを勉強するのが難しいね。
これに比べたら、USBデバイスの操作なんてちょろいもんだったのかもしれないねぇ。
再生できるようになるまで、あと2ヶ月くらいはかかりそうね。