QVorbis (0.9.2) | 2009-09-09 12:00 |
QDSAudio コンポーネントの使用方法について解説します。
DirectShow は、COM インターフェイスをベースとした API ですので、COM インターフェイス に関する基本的な知識が必要です。このサンプルでは、利便性を考慮し ATL の COM スマートポインター を使用します。
COM 使用の際は、アプリケーション開始時に、初期化用関数を呼び出す必要があります。 (CoInitializeEx() or OleInitialize()) 詳細は、Windows プログラミングの参考資料をご覧ください。
DirectShow のフィルターグラフコンポーネントを作成します。
ソースフィルターコンポーネントを作成し、フィルターグラフへ登録します。
ここでは、SHCreateStreamOnFileW() 関数を使用して IStream インターフェイスを、 準備しています。その後 AddFilter() メソッドで、フィルターグラフへ登録を行います。
- ...
- LPCWSTR path;
- ...
- ATL::CComPtr<IBaseFilter> filter;
- {
- ATL::CComPtr<IStream> stm;
- hRslt = SHCreateStreamOnFileW(
- path,
- STGM_READ,
- &stm);
- if (FAILED(hRslt)) {
- return;
- }
- hRslt = QDSA_CreateOggVorbisDecoder_IStream(
- stm,
- &filter);
- if (FAILED(hRslt)) {
- return;
- }
- }
- hRslt = m_FilterGraph->AddFilter(
- filter,
- L"QDSAudio");
- if (FAILED(hRslt)) {
- return;
- }
オーディオレンダラーを作成して、フィルターグラフへ登録します。
ここでは、デフォルト DirectSound レンダラーを作成しています。
ピンの接続を行います。
ソースフィルターについては、Pin 名称が定められているので、FindPin() メソッドで、IPin インターフェイス を取得します。
レンダラーについては、EnumPins() メソッドで、所属 Pin を列挙し、最初に見つかった Pin を使用します。
ConnectDirect() メソッドで、ピンの直接接続を行います。
- ATL::CComPtr<IPin> pin;
- hRslt = filter->FindPin(L"Audio", &pin);
- if (FAILED(hRslt)) {
- return;
- }
- ATL::CComPtr<IEnumPins> e;
- hRslt = rend->EnumPins(&e);
- if (FAILED(hRslt)) {
- return;
- }
- ATL::CComPtr<IPin> ip;
- ULONG c = 0;
- hRslt = e->Next(1, &ip, &c);
- if (FAILED(hRslt)) {
- return;
- }
- hRslt = m_FilterGraph->ConnectDirect(
- pin,
- ip,
- 0);
- if (FAILED(hRslt)) {
- return;
- }
ここまでで、フィルターグラフの構築は完了です。
フィルターの登録処理をしていれば、IGraphBuilder::RenderFile() メソッドを使用して、 フィルターグラフの自動構築が可能になりますが、エンドユーザー実行環境によっては、意図したものとは異なる フィルターコンポーネントが使用される場合があり、不具合を生じることがあります。
そのため、QDSAudio コンポーネントでは、フィルターコンポーネントの登録を行っていません。
上記のようにフィルターグラフ構築処理が、多少煩雑になりますが、意図しないコンポーネントに 割り込まれることがなくなるので、エンドユーザーに安定した動作を提供することができます。
DirectShow 一般の使用方法については、以下のページを参照ください。
ループモードの設定を行うには、以上のようにします。
ループモードでは、ストリーム終端に達したとき、設定したループ位置に戻り再生を続行します。
ループ位置の設定単位は、サンプル数となります。
[PageInfo]
LastUpdate: 2009-09-03 12:09:36, ModifiedBy: noumiakira
[License]
GNU Free Documentation License
[Permissions]
view:all, edit:members, delete/config:members