Windows Vista 以降のバージョンの Windows では、AudioEndpointBuilder はシステム内のオーディオ エンドポイントを列挙、初期化、およびアクティブ化するシステム サービスです。 このトピックでは、AudioEndpointBuilder サービスで使用されるアルゴリズムの概要について説明します。
AudioEndpointBuilder サービスは、アルゴリズムを使用してエンドポイントを検出して列挙します。 このアルゴリズムは、多重化 (MUXed) キャプチャ デバイスへのシステム アクセスを簡素化し、複数のホスト ピンと複数のブリッジ ピン、またはその両方を含むトポロジを操作できるように設計されています。
Windows XP では、オーディオ モデルではオーディオ デバイスという用語を使用して、プラグ アンド プレイ (PnP) ツリーの概念デバイスを参照しました。 Windows Vista 以降のバージョンの Windows では、オーディオ デバイスの概念が再設計され、ユーザーが物理的に操作するデバイスをより適切に表現できるようになりました。
Windows Vista の 2 つの新しい API MMDevice API と WASAPI を使用すると、これらの新しいオーディオ デバイスにアクセスして操作できます。 MMDevice API は、新しいオーディオ デバイスをエンドポイントとして参照します。
AudioEndpointBuilder サービスは、デバイス インターフェイスの到着と削除の KSCATEGORY_AUDIO クラスを監視します。 オーディオ デバイス ドライバーが KSCATEGORY_AUDIO デバイス インターフェイス クラスの新しいインスタンスを登録すると、AudioEndpointBuilder サービスはデバイス インターフェイス通知を検出し、アルゴリズムを使用してシステム内のオーディオ デバイスのトポロジを調べ、適切なアクションを実行します。
次の一覧は、AudioEndpointBuilder で使用されるアルゴリズムの動作をまとめたものです。
接続されていないブリッジ ピンを探します。
接続されていないブリッジ ピンのエンドポイントを作成します。 たとえば、AudioEndpointBuilder は、KSNODETYPE_SPEAKERのピン カテゴリ GUID を持つ未接続のブリッジ ピンを検出すると、このブリッジ ピンのスピーカー エンドポイントを作成します。 KSNODETYPE_SPEAKERおよびその他のピン カテゴリ GUID の詳細については、WinDDK\<build number>\inc\api の Ksmedia.h を参照してください。
エンドポイントの既定のプロパティを設定します。 たとえば、AudioEndpointBuilder では、名前、アイコン、およびフォーム ファクターが設定されます。
エンドポイントから、パルス コード変調 (PCM)、オーディオ コーデック 3 (AC3)、または Windows メディア ビデオ (WMV) をサポートするホスト ピンへのパスがあるかどうかを判断します。 ホスト ピンは、通信メンバーが KSPIN_COMMUNICATION_SINK または KSPIN_COMMUNICATION_BOTH に設定された KSPIN 構造体です。 KSPIN 構造の詳細については、 KSPIN を参照してください。
エンドポイント PropertyStore に、オーディオ デバイス インターフェイスのレジストリ キーからのプロパティ情報を設定します。
エンドポイントの状態を設定します。 エンドポイントの状態は、次の 3 つの値のいずれかになります。
アクティブ。 これは、手順 4 の説明に従ってパスが存在することを示します。
アンプラグド。 オーディオ デバイスがジャック検出をサポートしている場合、この状態はエンドポイントのパスが存在し、オーディオ アダプターの物理コネクタからジャックが取り外されていることを示します。
存在しません。 この状態は、手順 4 でパスが見つからなかったことを示し、ジャック検出はこのエンドポイントでサポートされていません。
関連付けられている INF ファイルで指定されている場合は、このエンドポイントを既定のエンドポイントとして設定します。
エンドポイントを列挙した後、オーディオ システムのクライアントは、新しい Windows Vista API (前述) を使用して直接操作するか、Wave、 DirectShow 、 DirectSound などの使い慣れた API を使用して間接的に操作できます。オーディオ クライアントがエンドポイントの MMDevice ID で開始し、同じエンドポイントの Wave または DirectSound ID にアクセスできるように、新しい API メソッドが提供されました。
エンドポイントを使用する場合は、次の利点を活用できます。
コンピューターを再起動する頻度に関係なく、同じグローバル一意 ID (GUID) を使用できます。 この永続的な GUID を使用すると、エンドポイントの waveOut ID またはフレンドリ名を保存するよりも信頼性が高くなります。
コンピューターを再起動する頻度に関係なく、同じ PropertyStore を使用できます。 オーディオ デバイス関連のメタデータは、エンドポイント PropertyStore に保存されます。
多重化 (MUX) ピンと非多重化 (DEMUX) ピンは自動的に管理され、AudioEndpointBuilder サービスによって列挙されます。
オーディオ デバイスを操作する独自のオーディオ デバイス ドライバーと INF ファイルを開発し、オーディオ アプリケーションまたはその両方を開発する場合は、次の問題とベスト プラクティスに注意することをお勧めします。 これらの推奨事項を念頭に置いてドライバーとアプリケーションを開発するときは、AudioEndpointBuilder でより効果的に動作するドライバー、INF ファイル、オーディオ クライアントを生成します。
名前付け規則。 エンドポイントに使用される名前付け規則は、ブリッジ ピンのフレンドリ名に基づいています。 ただし、話者エンドポイントの場合、名前は "Speakers" にハードコーディングされており、ドライバーまたはサード パーティ製アプリケーションによって変更することはできません。
最適ではないトポロジ。 特定のトポロジは、エンドポイントを列挙するために AudioEndpointBuilder によって使用されるアルゴリズムのため、最適でないと見なされます。 たとえば、これらの最適ではないトポロジのいずれかを作成すると、非表示のエンドポイントを持つホストピンが生成され、それが原因で AudioEndpointBuilder やスプリッター (分割エンドポイント) が関連付けられたホストピンにリンクできなくなります。
非表示のエンドポイント
次の図では、KS フィルターに 2 つのホスト ピンが 1 つのブリッジ ピン (スピーカー) に接続されていることが示されています。
AudioEndpointBuilder は、このブリッジ ピンを検出すると、パスを 1 つのホスト ピンのみにトレースし、ブリッジ ピンの既定値を設定し、Speaker エンドポイントを作成してアクティブ化し、他のブリッジ ピンを検出し続けます。 したがって、他のホスト ピンは AudioEndpointBuilder から非表示のままです。
上の図では、問題のあるトポロジが再設計され、AudioEndpointBuilder が 2 つのホスト ピン (PCM と AC-3/PCM) を検出できるようになりました。これは、2 つのブリッジ ピン (Speaker と SPDIF) が表示されるようになったためです。
スプリッター
1 つのホスト ピンが複数のブリッジ ピンに接続すると、別の種類の最適でないトポロジが作成されます。 次の図は、PCM ホスト ピンがスピーカー ブリッジ ピンと SPDIF ブリッジ ピンに接続されるトポロジを示しています。
この場合、AudioEndpointBuilder は 1 つのブリッジ ピンを検出し、PCM ホスト ピンへのパスをトレースし、既定値を設定して、Speaker エンドポイントを作成してアクティブ化します。 AudioEndpointBuilder は、次のブリッジ ピンを検出すると、パスをトレースして同じ PCM ホスト ピンに戻し、既定値を設定して、SPDIF エンドポイントを作成してアクティブ化します。 ただし、両方のエンドポイントが初期化およびアクティブ化されていますが、そのうちの 1 つにストリーミングすると、同時に他方にストリーミングできなくなります。つまり、相互に排他的なエンドポイントです。
次の図は、個別の接続が存在するこのトポロジの再設計を示しています。 この設計により、AudioEndpointBuilder は、2 つのブリッジ ピンのそれぞれについて PCM ホスト ピンへのパスをトレースできます。
エンドポイントの形式。 オーディオ エンジンが共有モードで実行されている場合、エンドポイントの形式は、インストール時に INF ファイルによって指示された特定の設定を想定します。 たとえば、オーディオ デバイスのオーディオ ドライバーは、関連付けられている INF ファイルを使用して、既定のエンドポイントを 44.1 kHz、16 ビット、ステレオ PCM 形式に設定します。 インストール後、コントロール パネルまたはサード パーティ製アプリケーションを使用してエンドポイントの形式を変更する必要があります。
既定のデバイス。 既定のデバイスとして設定されているエンドポイントは、INF ファイルの情報を使用してインストール時に選択されます。 インストールが完了したら、コントロール パネルまたはサード パーティ製アプリケーションを使用して、別のエンドポイントを既定のエンドポイントとして選択する必要があります。
手記 INF ファイルがインストール時に既定として設定するエンドポイントを選択しない場合、クライアント アプリケーションは MMDevice API を使用してエンドポイントを選択できます。 API は、フォーム ファクターのランクと、エンドポイントがレンダリング エンドポイントかキャプチャ エンドポイントかに基づいて選択されます。 次の表に、選択順序を示します。
| レンダリング順位 | ランクをキャプチャする |
|---|---|
| スピーカー | マイク |
| ラインアウト | ラインイン |
| SPDIF | SPDIF |
MMDevice API を使用して既定のエンドポイントを選択し、使用可能なエンドポイントが同じランク付けされている場合、MMDevice API はエンドポイント ID をアルファベット順にして、既定として選択するエンドポイントを決定します。 たとえば、オーディオ アダプターにラインアウト コネクタとラインイン コネクタの両方があり、関連付けられている INF ファイルがインストール時に既定のコネクタを選択しない場合、MMDevice API は最初にどのエンドポイント ID がアルファベット順であるかを識別し、そのコネクタを既定として設定します。 この選択は、エンドポイント ID が永続的であるため、システムを再起動した後も保持されます。 ただし、上位のエンドポイント (たとえば、マイク コネクタを備えた 2 つ目のアダプター) がシステムに表示される場合、選択は保持されません。