次の方法で共有


DirectShow アプリケーションのデバイス ロール

手記

MMDevice API では、デバイス ロールがサポートされます。 ただし、Windows Vista のユーザー インターフェイスでは、この機能のサポートは実装されていません。 デバイス ロールのユーザー インターフェイスのサポートは、今後のバージョンの Windows で実装される可能性があります。 詳細については、「Windows Vista でのデバイスロールの」を参照してください。

 

DirectShow API には、特定の デバイス ロールに割り当てられている オーディオ エンドポイント デバイス をアプリケーションが選択する手段はありません。 ただし、Windows Vista では、コア オーディオ API を DirectShow アプリケーションと組み合わせて使用して、デバイスの役割に基づいてデバイスを選択できます。 コア オーディオ API の助けを借りて、アプリケーションは次のことができます。

  • ユーザーが特定のデバイス ロールに割り当てたオーディオ エンドポイント デバイスを特定します。
  • オーディオ エンドポイント デバイスをカプセル化する IBaseFilter インターフェイスを使用して DirectShow オーディオ レンダリング フィルターを作成します。
  • フィルターを組み込んだ DirectShow グラフを作成します。

DirectShow と IBaseFilterの詳細については、Windows SDK のドキュメントを参照してください。

次のコード例は、特定のデバイス ロールに割り当てられているレンダリング エンドポイント デバイスをカプセル化する DirectShow オーディオ レンダリング フィルターを作成する方法を示しています。

//-----------------------------------------------------------
// Create a DirectShow audio rendering filter that
// encapsulates the audio endpoint device that is currently
// assigned to the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres)  \
              if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

// This application's audio session GUID
const GUID guidAudioSessionId = {
    0xb13ff52e, 0xa5cf, 0x4fca,
    {0x9f, 0xc3, 0x42, 0x26, 0x5b, 0x0b, 0x14, 0xfb}
};

HRESULT CreateAudioRenderer(ERole role, IBaseFilter** ppAudioRenderer)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;

    if (ppAudioRenderer == NULL)
    {
        return E_POINTER;
    }

    // Activate the IBaseFilter interface on the
    // audio renderer with the specified role.
    hr = CoCreateInstance(CLSID_MMDeviceEnumerator,
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    DIRECTX_AUDIO_ACTIVATION_PARAMS  daap;
    daap.cbDirectXAudioActivationParams = sizeof(daap);
    daap.guidAudioSession = guidAudioSessionId;
    daap.dwAudioStreamFlags = AUDCLNT_STREAMFLAGS_CROSSPROCESS;

    PROPVARIANT  var;
    PropVariantInit(&var);

    var.vt = VT_BLOB;
    var.blob.cbSize = sizeof(daap);
    var.blob.pBlobData = (BYTE*)&daap;

    hr = pDevice->Activate(__uuidof(IBaseFilter),
                           CLSCTX_ALL, &var,
                           (void**)ppAudioRenderer);
    EXIT_ON_ERROR(hr)

Exit:
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    return hr;
}

前のコード例では、CreateAudioRenderer 関数は、デバイス ロール (eConsole、eMultimedia、または eCommunications) を入力パラメーターとして受け入れます。 2 番目のパラメーターは、IBaseFilter インターフェイス インスタンスのアドレスを関数が書き込むポインターです。 さらに、この例では、IMMDevice::Activate メソッドを使用して、IBaseFilter インスタンス内のオーディオ ストリームを、アプリケーション固有のセッション GUID (guidAudioSessionId 定数で指定された) のクロスプロセス オーディオ セッションに割り当てる方法を示します。 Activate 呼び出しの 3 番目のパラメーターは、セッション GUID とプロセス間フラグを含む構造体を指します。 ユーザーがアプリケーションの複数のインスタンスを実行する場合、すべてのインスタンスのオーディオ ストリームは同じセッション GUID を使用するため、同じセッションに属します。

または、呼び出し元は、Activate 呼び出しの 3 番目のパラメーターとして NULL を指定して、セッション GUID 値がGUID_NULLされたプロセス固有のセッションとしてストリームを既定のセッションに割り当てることができます。 詳細については、「IMMDevice::Activateを参照してください。

レガシ オーディオ API との相互運用性の