はじめに
DirectShowフィルタには、さまざまな種類があります。その中で比較的実装が難しいのが、複数の入力ピンや出力ピンを持つフィルタです。このようなフィルタはDirectShow基底クラスライブラリにおいて、CSource
やCTramsformFilter
のように直接サポートするクラスが用意されていません。そのため、それらの基底クラスであるCBaseFilter
から派生して作る必要があります。
本稿では、1つのステレオオーディオストリームから、L/Rチャンネルで分離した2つのモノラルオーディオストリームを出力するフィルタ(図1)の作成を通じて、1つの入力ピンと2つの出力ピンを持つフィルタをCBaseFilter
から派生して作成する方法を解説します。
対象読者
- C++言語が分かる方
- DirectShowアプリケーションを作成したことのある方
- DirectShowフィルタの作成に興味のある方
必要な環境
- Windows Vista / XP
- Visual Studio 2008
- Windows SDK for Windows Server 2008 and .NET Framework 3.5
Visual Studioは過去のバージョンでも良いですが、添付のソースコードは2008でコンパイルを確認しています。
フィルタの仕様
今回作成するフィルタの機能は「はじめに」で述べました。それを踏まえてフィルタとしての仕様をまとめます(表1)。
種類 | スプリッタフィルタ |
名前 | Audio Channel Splitter Filter |
入力ピン数 | 1 |
出力ピン数 | 2 |
メジャータイプ | MEDIATYPE_Audio |
サブタイプ | MEDIASUBTYPE_PCM |
フォーマットタイプ | FORMAT_WaveFormatEx |
メジャータイプ、サブタイプおよびフォーマットタイプは、入力ピンと出力ピンで共通です。オーディオフォーマットは無圧縮PCMのみとします。チャンネル数は入力ピンでは2、出力ピンでは1とします。
フィルタを実装するときは、フィルタそのものを表すクラスの他に入力ピンと出力ピンを表すクラスを実装する必要があります。これらのクラス関係を整理しておきます(表2、図2)。
役割 | クラス名 | 派生元 |
フィルタクラス | AudioChSplitterFilter | CBaseFilter |
入力ピンクラス | AudioInPin | CBaseInputPin |
出力ピンクラス | AudioOutPin | CBaseOutputPin |