手記
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 との相互運用性の