手記
MMDevice API では、デバイス ロールがサポートされます。 ただし、Windows Vista のユーザー インターフェイスでは、この機能のサポートは実装されていません。 デバイス ロールのユーザー インターフェイスのサポートは、今後のバージョンの Windows で実装される可能性があります。 詳細については、「Windows Vista でのデバイスロールの」を参照してください。
DirectSound API は、ユーザーが特定の デバイス ロールに割り当てた 、アプリケーションが オーディオ エンドポイント デバイスを選択する手段を提供しません。 ただし、Windows Vista では、コア オーディオ API を DirectSound アプリケーションと組み合わせて使用して、デバイスの役割に基づいてデバイスを選択できます。 コア オーディオ API の助けを借りて、アプリケーションは、特定の役割に割り当てられているオーディオ エンドポイント デバイスを識別し、エンドポイント デバイスの DirectSound デバイス GUID を取得し、DirectSoundCreate または DirectSoundCaptureCreate 関数を して、エンドポイント デバイスをカプセル化する IDirectSoundCapture または IDirectSoundCapture インターフェイス インスタンス を作成できます。 DirectSound の詳細については、Windows SDK のドキュメントを参照してください。
次のコード例は、特定のデバイス ロールに現在割り当てられているレンダリングまたはキャプチャ デバイスの DirectSound デバイス GUID を取得する方法を示しています。
//-----------------------------------------------------------
// Get the DirectSound or DirectSoundCapture device GUID for
// an audio endpoint device. If flow = eRender, the function
// gets the DirectSound device GUID for the rendering device
// with the specified device role. If flow = eCapture, the
// function gets the DirectSoundCapture device GUID for the
// capture device with the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hr) \
if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
HRESULT GetDirectSoundGuid(EDataFlow flow, ERole role, GUID* pDevGuid)
{
HRESULT hr = S_OK;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
IPropertyStore *pProps = NULL;
PROPVARIANT var;
PropVariantInit(&var);
if (pDevGuid == NULL)
{
return E_POINTER;
}
// Get a device enumerator for the audio endpoint
// devices in the system.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnumerator);
EXIT_ON_ERROR(hr)
// Get the endpoint device with the specified dataflow
// direction (eRender or eCapture) and device role.
hr = pEnumerator->GetDefaultAudioEndpoint(flow, role,
&pDevice);
EXIT_ON_ERROR(hr)
hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
EXIT_ON_ERROR(hr)
// Get the DirectSound or DirectSoundCapture device GUID
// (in WCHAR string format) for the endpoint device.
hr = pProps->GetValue(PKEY_AudioEndpoint_GUID, &var);
EXIT_ON_ERROR(hr)
// Convert the WCHAR string to a GUID structure.
hr = CLSIDFromString(var.pwszVal, pDevGuid);
EXIT_ON_ERROR(hr)
Exit:
PropVariantClear(&var);
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pDevice);
SAFE_RELEASE(pProps);
return hr;
}
前のコード例では、GetDirectSoundGuid 関数は、データ フローの方向 (eRender または eCapture) とデバイス ロール (eConsole、eMultimedia、または eCommunications) を入力パラメーターとして受け取ります。 3 番目のパラメーターは、アプリケーションが directSoundCreate または DirectSoundCaptureCreate関数に入力パラメーターとして指定できるデバイス GUID 書き込むポインターです。
前のコード例では、次の方法で DirectSound デバイス GUID を取得します。
- 指定したデータ フロー方向とデバイス ロールを持つオーディオ エンドポイント デバイスを表す IMMDevice インターフェイス インスタンスを作成します。
- オーディオ エンドポイント デバイスのプロパティ ストアを開く。
- プロパティ ストアから PKEY_AudioEndpoint_GUID プロパティを取得します。 プロパティ値は、オーディオ エンドポイント デバイスの DirectSound デバイス GUID の文字列表現です。
- CLSIDFromString 関数を呼び出して、デバイス GUID の文字列形式を GUID 構造体に変換します。 CLSIDFromString の詳細については、Windows SDK のドキュメントを参照してください。
GetDirectSoundGuid 関数からデバイス GUID を取得した後、アプリケーションは DirectSoundCreate 呼び出すか、この GUID で DirectSoundCaptureCreate を して、オーディオ エンドポイント デバイスをカプセル化する DirectSound レンダリングまたはキャプチャ デバイスを作成できます。 DirectSound は、この方法でデバイスを作成すると、常にデバイスのオーディオ ストリームを既定のセッション (セッション GUID 値によって識別されるプロセス固有のオーディオ セッション) GUID_NULL割り当てます。
アプリケーションがストリームをクロスプロセス オーディオ セッションまたは非NULL セッション GUID を持つセッションにストリームを割り当てる必要がある場合は、IMMDevice::Activate メソッドを呼び出して、前のコード例に示した手法を使用する代わりに、IDirectSoundSound または IDirectSoundCapture オブジェクト を作成する必要があります。 Activate メソッドを使用して、ストリームのクロスプロセス オーディオ セッションまたは非NULL セッション GUID を指定する方法を示すコード例については、「Device Roles for DirectShow Applications」を参照してください。 このセクションのコード例では DirectShow フィルターを作成する方法を示していますが、わずかな変更を加えると、DirectSound デバイスを作成するようにコードを調整できます。
前のコード例の GetDirectSoundGuid 関数は、CoCreateInstance 関数を呼び出して、システム内のオーディオ エンドポイント デバイスの列挙子を作成します。 呼び出し元のプログラムが、com ライブラリを初期化するために CoInitialize または coInitializeEx関数以前に呼び出した場合を除き、CoCreateInstance 呼び出しは失敗します。 CoCreateInstance、CoInitialize、および CoInitializeEx の詳細については、Windows SDK のドキュメントを参照してください。
関連トピック
-
レガシ オーディオ API との相互運用性の