次の方法で共有


カスタム オーディオ エンドポイント列挙子の実装

Windows Server 2008 R2 以降では、リモート デスクトップ プロトコル プロバイダーの一部としてカスタム リモート オーディオ エンドポイント列挙子を実装できます。 リモート デスクトップ プロトコル プロバイダーは、カスタム オーディオ エンドポイント列挙子を使用して、特定の機能セットを持つオーディオ エンドポイントのコレクションを取得できます。

カスタム リモート オーディオ エンドポイント列挙子を実装するには

  1. カスタム エンドポイント列挙子ソリューションでは、デバイス列挙子オブジェクト、デバイス コレクション オブジェクト、デバイス オブジェクト、およびプロパティ ストア オブジェクトの 4 種類のメインオブジェクトを実装する必要があります。
オブジェクトの種類 説明
デバイス列挙子オブジェクト
デバイス列挙子オブジェクトは、エンドポイント列挙子機能を提供します。 既定のエンドポイントと指定したエンドポイントのコレクションを返すメソッドを公開します。 たとえば、指定された条件に応じて、列挙子は通信エンドポイント、再生エンドポイント、またはキャプチャ エンドポイントを返すことができます。 デバイス列挙子オブジェクトは 、IMMDeviceEnumerator インターフェイスを実装する必要があります。
デバイス コレクション オブジェクト
デバイス コレクション オブジェクトは、オーディオ デバイスのコレクションを表します。 IMMDeviceCollection インターフェイスを実装する必要があります。
デバイス オブジェクト
デバイス オブジェクトは、特定のオーディオ デバイスを表します。 オーディオ デバイスのプロパティ ストアへのアクセスを提供し、デバイスで使用可能なオーディオ再生インターフェイスとキャプチャ インターフェイスを公開します。 デバイス オブジェクトは 、IMMDevice インターフェイスと IMMEndpoint インターフェイスを実装する 必要があります。
プロパティ ストア オブジェクト
プロパティ ストア オブジェクトは、オーディオ デバイスに関連付けられているプロパティを公開します。 これらのプロパティの一部はシステムによって使用されますが、アプリケーションはオーディオ エンドポイントと共に任意のプロパティを格納することもできます。
すべてのオーディオ デバイスには、次の 3 つのプロパティがあります。
プロパティ ストア オブジェクトは 、IPropertyStore インターフェイスを実装する必要があります。
  1. カスタム エンドポイント列挙子は、オーディオ システムやその他のアプリケーションに読み込むことができる DLL に実装する必要があります。 セキュリティで保護されたプロセスが読み込むことができるように、DLL に署名する必要があります。 DLL は、カスタム エンドポイント列挙子へのエントリ ポイントとして機能する GetTSAudioEndpointEnumeratorForSession 関数を実装してエクスポートする必要があります。

リモート デスクトップ サービス サービスは QueryProperty メソッドを呼び出し、 QueryType パラメーターを WTS_QUERY_AUDIOENUM_DLL に設定して列挙子オブジェクトの名前を取得します。

カスタム列挙子オブジェクトは、COM に似たインターフェイスと COM に似た参照カウント メカニズムを使用しますが、実際の COM オブジェクトではありません。 カスタム エンドポイント列挙子には、COM をサポートしていないアプリケーションで使用されるレガシ オーディオ インターフェイスを操作できる必要があります。 このため、カスタム エンドポイント列挙子は COM のライフ サイクル管理メカニズムに依存してはなりません。 MMDevAPI.dllなどのオーディオ エンドポイント列挙子のコンシューマーは、ユーザー アプリケーションで必要なときにカスタム エンドポイント列挙子 DLL を読み込み、列挙子がデバイス列挙子オブジェクト、デバイス コレクション オブジェクト、デバイス オブジェクト、またはプロパティ ストア オブジェクトへの参照を保持している間、列挙子をアンロードしません。 ただし、これらのコンシューマーがカスタム エンドポイント列挙子によって所有されている他の種類のオブジェクトへの参照を追跡することはできません。 したがって、カスタム エンドポイント列挙子は、これら 4 種類のオブジェクトより長く生きることができるオブジェクトを作成しないことをお勧めします。

カスタム オーディオ エンドポイントを実装するには

カスタム オーディオ デバイス列挙子を実装するには、カスタム オーディオ エンドポイントを実装する必要があります。 カスタム オーディオ デバイスをリンクする方法は、次の 2 つのステートメントを使用することです。

  • IMMDevice::Activate(IAudioOutputEndpointRT)
  • IMMDevice::Activate(IAudioInputEndpointRT)

カスタム オーディオ デバイス列挙子に IMMDevice::Activate インターフェイスの完全な一覧を実装することは想定されていません。 代わりに、 IAudioOutputEndpointRTIAudioInputEndpointRT を実装する必要があります。 必要に応じて、 IAudioEndpointVolume など、さらにいくつかを実装できます。 実装しないインターフェイスについては、 E_NOINTERFACE を返す必要があります (この特定のエラー コードを使用する必要があります)。 その後、Windows はインターフェイスのストック実装 ( IAudioClient2 など) にフォールバックします。

オーディオ エンドポイントを実装および登録する方法に関するその他のリファレンス ドキュメントについては、「 IAudioInputEndpointRT」を参照してください。 WASAPI のしくみを示す図については、「 ユーザー モード オーディオ コンポーネント」を参照してください。 Windows Server 2008 以降では、すべてのユーザー モード オーディオが新しであることに注意してください。

リモート デスクトップ プロトコル プロバイダーの作成

GetTSAudioEndpointEnumeratorForSession

IMMDevice

IMMDeviceCollection

IMMDeviceEnumerator

IMMEndpoint

IPropertyStore