カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

レンダラーフィルターを指定する

このセクションでは指定された再生デバイスをフィルタグラフに組み込む方法を紹介します。

RenderFile()やRender()関数はデフォルトで再生デバイスに”Default DirectSound Device”を指定します。デフォルトデバイスはコントロールパネルの”サウンドとオーディオのプロパティ”で設定できます。

ユーザーが指定した再生デバイス、あるいは特定の機能を持つ再生デバイスを使いたい場合、そのデバイスをグラフに組み込む工夫をしなければなりません。

以下に2つの方法を紹介します。

初期状態から構築する

新しくフィルタグラフを作成するときは、IGraphBuilder::RenderFile()やIGraphBuilder::Render()関数が威力を発揮します。これらの関数は非常に賢い関で、フィルタグラフ内にあるフィルターを使ってグラフを完成しようと試みます。もしレンダラーフィルターが見つかれば、デフォルトレンダラーの代わりに見つかったレンダラーフィルターを使います。

手順は、使いたいレンダラーフィルターをフィルタグラフに挿入し、その後、RenderFile()あるいはRender()関数を実行します。これでデフォルトレンダラーが使いたいレンダラーフィルターに置き換わったグラフが作成されます。

レンダラーフィルターの作成には以下の2つの方法があります。

CLSIDからの作成

フィルターのCLSIDが分かればCoCreateInstance()関数でフィルターを作成できます。

    IBaseFilter *pFilter = NULL;

    result = CoCreateInstance(
        CLSID_????, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pFilter);
    if (FAILED(result))     throw result;

以下に代表的な例を示します。

機能 CLSID フィルター名
デフォルトデバイス CLSID_DSoundRender "Default DirectSound Device"
NULLデバイス CLSID_NullRenderer "Null Renderer"

モニカからの作成

デバイスを列挙することで得られるモニカを使ってフィルターを作成します。

    IMoniker    *pMoniker;          // デバイスの列挙で得られたモニカ
    IBaseFilter *pFilter = NULL;

    result = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)pFilter);
    if (FAILED(result))     throw result;

次にグラフに作成したレンダラーフィルターを挿入します。

AddFilter()関数の2番目の引数にフィルターの名前を指定します。デバイスを列挙した場合には、そこで得られたデバイス名を使います。

    result = m_pGB->AddFilter(pFilter, L"フィルターの名前");
    if (FAILED(result))     throw result;

最後にRenderFile()あるいはRender()関数を実行します。

RenderFile()、Render()関数についてはセクション「グラフの構築」を参照してください。

既存のフィルタグラフを修正する

既存のレンダラーフィルターを新しいレンダラーフィルターと置き換えます。この操作はグラフが停止しているときに行ってください。手順を以下に示します。

  1. 既存のレンダラーフィルターにつながっているピンを取得します。
  2. 旧レンダラーフィルターを削除します。
  3. 新レンダラーフィルターをグラフに挿入します。
  4. 新レンダラーの入力ピンと旧レンダラーにつながっていたピンを接続します。

既存のレンダラーフィルターにつながっているピンを取得します

  1. CLSIDあるいはフィルター名から現在使われているレンダラーフィルターを特定します。
  2. 見つかったフィルターの入力ピンを探します。
  3. 次にその入力ピンにつながっているピンを取得します。
  4. つながっている相手のピンと共にピン接続を切ります。

旧レンダラーフィルターを削除します

フィルタグラフから旧レンダラーフィルターを削除します。

  1. フィルタグラフから旧レンダラーフィルターを削除します。

新レンダラーフィルターをグラフに挿入します

  1. 「初期状態から構築する」で説明した要領で新しいレンダラーフィルターを作成します。
  2. フィルタグラフに新しいレンダラーフィルターを挿入します。

新レンダラーの入力ピンと旧レンダラーにつながっていたピンを接続します

  1. 新しいレンダラーフィルターの入力ピンを取得します。
  2. 旧レンダラーフィルターがつながっていたピンと新しいレンダラーフィルターの入力ピンを接続します。

以下のコードは、既存のレンダラーを指定されたレンダラーに置き換えるものです。

HRESULT CMyClass::SwapNewRenderer(
    IGraphBuilder*      pGB,
    IBaseFilter*        pNewRenderer,
    LPCWSTR             wstrRenderer)
{
    HRESULT result = S_OK;
    IBaseFilter* pCurRenderer = NULL;
    IPin* pInputPin = NULL;
    IPin* pOutputPin = NULL;

    try
    {
        result = GetRenderer(pGB, &pCurRenderer);
        if (result != S_OK)         throw result;

        pInputPin = FindInputPin(pCurRenderer);
        pOutputPin = FindConnectedToPin(pInputPin);
        SAFE_RELEASE(pInputPin);

        result = pGB->RemoveFilter(pCurRenderer);
        if (FAILED(result))         throw result;

        result = pGB->AddFilter(pNewRenderer, wstrRenderer);
        if (FAILED(result))         throw result;

        pInputPin = FindInputPin(pNewRenderer);
        result = ConnectPin(pGB, pOutputPin, pInputPin);
        if (FAILED(result))         throw result;
    }
    catch (HRESULT result)
    {
        // TODO:
    }
    SAFE_RELEASE(pCurRenderer);
    SAFE_RELEASE(pInputPin);
    SAFE_RELEASE(pOutputPin);
    return result;
}
上記の例で用いているいくつかの関数は、フィルターやピンを操作するためのものです。これらの実装については関連するセクション「フィルターを探す」、「ピンを探す」、「つながっているピンを取得する」、「ピンをつなぐ・ピンを切る」を参照してください。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ