Windows Server 2008 R2 以降では、リモート デスクトップ プロトコル プロバイダーの一部としてカスタム リモート オーディオ エンドポイント列挙子を実装できます。 リモート デスクトップ プロトコル プロバイダーは、カスタム オーディオ エンドポイント列挙子を使用して、特定の機能セットを持つオーディオ エンドポイントのコレクションを取得できます。
カスタム リモート オーディオ エンドポイント列挙子を実装するには
- カスタム エンドポイント列挙子ソリューションでは、デバイス列挙子オブジェクト、デバイス コレクション オブジェクト、デバイス オブジェクト、プロパティ ストア オブジェクトの 4 つの主要な種類のオブジェクトを実装する必要があります。
| オブジェクトの種類 | Description |
|---|---|
| デバイス列挙子オブジェクト |
デバイス列挙子オブジェクトは、エンドポイント列挙子の機能を提供します。 既定のエンドポイントと指定したエンドポイントのコレクションを返すメソッドを公開します。 たとえば、指定された条件に応じて、列挙子は通信エンドポイント、再生エンドポイント、またはキャプチャ エンドポイントを返すことができます。 デバイス列挙子オブジェクトは 、IMMDeviceEnumerator インターフェイスを実装する必要があります。 |
| デバイス コレクションのオブジェクト |
デバイス コレクション オブジェクトは、オーディオ デバイスのコレクションを表します。
IMMDeviceCollection インターフェイスを実装する必要があります。 |
| デバイス オブジェクト |
デバイス オブジェクトは、特定のオーディオ デバイスを表します。 オーディオ デバイスのプロパティ ストアへのアクセスを提供し、デバイスで使用可能なオーディオ再生およびキャプチャ インターフェイスを公開します。 デバイス オブジェクトは 、IMMDevice インターフェイスと IMMEndpoint インターフェイスを実装する 必要があります。 |
| プロパティ ストア オブジェクト |
プロパティ ストア オブジェクトは、オーディオ デバイスに関連付けられているプロパティを公開します。 これらのプロパティの一部はシステムによって使用されますが、アプリケーションはオーディオ エンドポイントと共に任意のプロパティを格納することもできます。 すべてのオーディオ デバイスには、次の 3 つのプロパティがあります。 プロパティ ストア オブジェクトは 、IPropertyStore インターフェイスを実装する必要があります。 |
- カスタム エンドポイント列挙子は、オーディオ システムやその他のアプリケーションに読み込むことができる DLL に実装する必要があります。 安全なプロセスが読み込むことができるように、DLL に署名する必要があります。 DLL は、カスタム エンドポイント列挙子へのエントリ ポイントとして機能する GetTSAudioEndpointEnumeratorForSession 関数を実装してエクスポートする必要があります。
リモート デスクトップ Services サービスは、QueryProperty メソッドを呼び出し、QueryType パラメーターをWTS_QUERY_AUDIOENUM_DLLに設定して列挙子オブジェクトの名前を取得します。
カスタム列挙子オブジェクトは、COM に似たインターフェイスと COM に似た参照カウント メカニズムを使用しますが、実際の COM オブジェクトではありません。 カスタム エンドポイント列挙子には、COM をサポートしていないアプリケーションで使用されるレガシ オーディオ インターフェイスを操作できる必要があります。 このため、カスタム エンドポイント列挙子は COM のライフ サイクル管理メカニズムに依存してはなりません。 MMDevAPI.dllなどのオーディオ エンドポイント列挙子のコンシューマーは、ユーザー アプリケーションで必要な場合はカスタム エンドポイント列挙子 DLL を読み込みます。列挙子は、デバイス列挙子オブジェクト、デバイス コレクション オブジェクト、デバイス オブジェクト、またはプロパティ ストア オブジェクトへの参照を保持している間、列挙子をアンロードしません。 ただし、これらのコンシューマーがカスタム エンドポイント列挙子によって所有されている他の種類のオブジェクトへの参照を追跡することはできません。 したがって、カスタム エンドポイント列挙子は、これら 4 種類のオブジェクトを上回る可能性のあるオブジェクトを作成しないことをお勧めします。
カスタム オーディオ エンドポイントを実装するには
カスタム オーディオ デバイス列挙子を実装するには、カスタム オーディオ エンドポイントを実装する必要があります。 カスタム オーディオ デバイスをリンクする方法は、次の 2 つのステートメントを使用することです。
IMMDevice::Activate(IAudioOutputEndpointRT)IMMDevice::Activate(IAudioInputEndpointRT)
カスタム オーディオ デバイス列挙子に IMMDevice::Activate インターフェイスの完全な一覧を実装することは想定されていません。 代わりに、 IAudioOutputEndpointRT と IAudioInputEndpointRT を実装する必要があります。 必要に応じて、 IAudioEndpointVolume など、さらにいくつかの実装を行うことができます。 実装しないインターフェイスについては、 E_NOINTERFACE を返す必要があります (この特定のエラー コードを使用する必要があります)。 その後、Windowsインターフェイスのストック実装 (IAudioClient2 など) にフォールバックします。
オーディオ エンドポイントを実装および登録する方法に関するその他のリファレンス ドキュメントについては、 IAudioInputEndpointRT を参照してください。 WASAPI のしくみを示す図については、「 オーディオ コンポーネントのUser-Mode」を参照してください。 ユーザー モードのオーディオはすべて、Windows Server 2008 以降では新しであることに注意してください。