SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

DirectShowフィルタの作成

オーディオチャンネルを分離する
DirectShowフィルタの作成 - 前編

複数の出力ピンを持つDirectShowフィルタの作成方法

ダウンロード サンプルコード (6.3 KB)

フィルタクラスの実装

クラス定義

 フィルタクラスAudioChSplitterFilterCBaseFilterから派生して定義します。その際 GetPinCountGetPinの 2つのメソッドが基底クラスにおいて純粋仮想メソッドとして定義されているので、このクラスで実装しなければなりません(表3)。加えて、フィルタロックを宣言する必要があります。

表3.CBaseFilterの純粋仮想メソッド
メソッド名 説明
GetPinCount ピンの数を取得する。
GetPin ピンへのポインタを取得する。
class AudioChSplitterFilter : CBaseFilter
{
    CCritSec m_FilterLock; // フィルタロック
    AudioInPin *m_InPin;
    AudioOutPin *m_OutPins[2];
public:
    static CUnknown * WINAPI
     CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
    AudioChSplitterFilter(LPUNKNOWN pUnk, HRESULT *phr);
    virtual ~AudioChSplitterFilter();
    AudioInPin *GetInPin() { return m_InPin; }
    AudioOutPin *GetOutPin(int n) { return m_OutPins[n]; }
    // CBaseFilter
    int GetPinCount(void);
    CBasePin *GetPin(int n);
};
フィルタロックについて

 フィルタグラフを実行するとき、それを制御するアプリケーションスレッドの他に、サンプルを流すための1つ以上のストリーミングスレッドが作成されます。そのためフィルタ状態の整合性を保つ必要があります。これをクリティカルセクションで実現します。基底クラスライブラリのCCritSecを使うとスマートポインタのようにコンストラクタでロック、デストラクタでアンロックされるので便利です。

コンストラクタ・デストラクタ

 コンストラクタでは、派生元であるCBaseFilterを初期化し、入出力ピンのインスタンスを作成・初期化します。入出力ピンには、このフィルタのインスタンスへのポインタとフィルタロックを渡しておきます。

AudioChSplitterFilter::AudioChSplitterFilter
(LPUNKNOWN pUnk, HRESULT *phr) :
    m_FilterLock(),
    CBaseFilter(FILTER_NAME, pUnk, 
                &m_FilterLock, __uuidof(AudioChSplitterFilter))
{
    NOTE1("%S", __FUNCTION__);
    DbgLockTrace(&m_FilterLock, TRUE);
    m_InPin=new AudioInPin(this, &m_FilterLock, phr);
    m_OutPins[0]=new AudioOutPin(
        LOUT_PIN_NAME, this, &m_FilterLock, phr, 0);
    m_OutPins[1]=new AudioOutPin(
        ROUT_PIN_NAME, this, &m_FilterLock, phr, 1);
}

 デストラクタは、入出力ピンのインスタンスをdeleteで解放するだけです(本稿添付ソースコードを参照)。

ピン数を取得できるようにする

 フィルタクラスからピンの数を取得するメソッドGetPinCountを実装します。今回は数が固定なので常に3を返します。ちなみに、可変の場合は現在もっているピンの数を返すようにします。

int AudioChSplitterFilter::GetPinCount(void) {
    return 3;
}

ピンへのポインタを取得できるようにする

 ピンへのポインタを取得するメソッドGetPinを実装します。引数として0から始まるインデックス値が渡されるので、それに対応したピンへのポインタを返します。

CBasePin *AudioChSplitterFilter::GetPin(int n) {
    switch(n) {
        case 0:
            return m_InPin;
        case 1:
            return m_OutPins[0];
        case 2:
            return m_OutPins[1];
    }
    return NULL;
}

次のページ
入力ピンクラスの実装

この記事は参考になりましたか?

DirectShowフィルタの作成連載記事一覧

もっと読む

この記事の著者

syu5()

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3059 2008/10/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー