Audio Endpoint Builder のアルゴリズム

Windows Vista 以降のバージョンの Windows では、AudioEndpointBuilder はシステム内のオーディオ エンドポイントを列挙、初期化、およびアクティブ化するシステム サービスです。 このトピックでは、AudioEndpointBuilder サービスで使用されるアルゴリズムの概要について説明します。

AudioEndpointBuilder サービスは、アルゴリズムを使用してエンドポイントを検出して列挙します。 このアルゴリズムは、多重化 (MUXed) キャプチャ デバイスへのシステム アクセスを簡素化し、複数のホスト ピンと複数のブリッジ ピン、またはその両方を含むトポロジを操作できるように設計されています。

Windows XP では、オーディオ モデルはオーディオ デバイスという用語でプラグ アンド プレイ (PnP) ツリーの概念デバイスを指していました。 Windows Vista 以降のバージョンの Windows では、オーディオ デバイスの概念が再考され、ユーザーが物理的に操作するデバイスをより適切に表現できるようになりました。

Windows Vista の 2 つの新しい API、MMDevice APIWASAPI を使用すると、これらの新しいオーディオ デバイスにアクセスして操作できます。 MMDevice API は、新しいオーディオ デバイスをエンドポイントと呼びます。

AudioEndpointBuilder サービスは、デバイス インターフェイスの到着と削除で KSCATEGORY_AUDIO クラスを監視します。 オーディオ デバイス ドライバーが KSCATEGORY_AUDIO デバイス インターフェイス クラスの新しいインスタンスを登録すると、AudioEndpointBuilder サービスはデバイス インターフェイス通知を検出し、アルゴリズムを使用してシステム内のオーディオ デバイスのトポロジを調べ、適切なアクションを実行します。

次の一覧は、AudioEndpointBuilder で使用されるアルゴリズムの動作をまとめたものです。

  1. 接続されていないブリッジ ピンを探します。

  2. 接続されていないブリッジ ピンのエンドポイントを作成します。 たとえば、AudioEndpointBuilder は、KSNODETYPE_SPEAKER のピン カテゴリ GUID を持つ未接続のブリッジ ピンを検出すると、このブリッジ ピンのスピーカー エンドポイントを作成します。 KSNODETYPE_SPEAKER とその他のピン カテゴリ GUIDS については、WinDDK\<build number>\inc\api の Ksmedia.h を参照してください。

  3. エンドポイントの既定のプロパティを設定します。 たとえば、AudioEndpointBuilder では、名前、アイコン、およびフォーム ファクターが設定されます。

  4. エンドポイントから、パルス符号変調 (PCM)、オーディオ コーデック 3 (AC3)、または Windows メディア ビデオ (WMV) をサポートするホスト ピンへのパスがあるかどうかを判断します。 ホスト ピンは、通信メンバーが KSPIN_COMMUNICATION_SINK または KSPIN_COMMUNICATION_BOTH に設定された KSPIN 構造体です。 KSPIN 構造体について詳しくは、KSPIN を参照してください。

  5. エンドポイント PropertyStore に、オーディオ デバイス インターフェイスのレジストリ キーからのプロパティ情報を設定します。

  6. エンドポイントの状態を設定します。 エンドポイントの状態は、次の 3 つの値のいずれかになります。

    • アクティブ。 手順 4 で説明したパスが存在することを示しています。

    • 切断。 オーディオ デバイスがジャック検出をサポートしている場合、この状態はエンドポイントのパスが存在し、オーディオ アダプターの物理コネクタからジャックが切断されていることを示します。

    • 存在しない。 この状態は、手順 4 でパスが見つからなかったことを示し、ジャック検出はこのエンドポイントでサポートされていません。

  7. 関連する INF ファイルで指定されている場合は、このエンドポイントを既定のエンドポイントとして設定します。

エンドポイントが列挙された後、オーディオ システムのクライアントは、(先述のとおり) 新しい Windows Vista API を使用して直接操作したり、Wave、DirectShowDirectSound など、より馴染みのある API を使用して間接的に操作したりすることができます。オーディオ クライアントがエンドポイントの MMDevice ID で開始し、同じエンドポイントの Wave ID または DirectSound ID にアクセスできるように、新しい API メソッドが提供されました。

エンドポイントを使用する場合は、次のメリットを活用できます。

  • コンピューターを再起動する頻度に関係なく、同じグローバルに一意の ID (GUID) を使用できます。 この永続的な GUID を使用すると、エンドポイントの waveOut ID またはフレンドリ名を保存するよりも信頼性が高くなります。

  • コンピューターを再起動する頻度に関係なく、同じ PropertyStore を使用できます。 オーディオ デバイス関連のメタデータは、エンドポイント PropertyStore に保存されます。

  • 多重化 (MUX) ピンと非多重化 (DEMUX) ピンは自動的に管理され、AudioEndpointBuilder サービスによって列挙されます。

オーディオ デバイスで動作する独自のオーディオ デバイス ドライバーと INF ファイルを開発し、オーディオ アプリケーションまたはその両方を開発する場合は、次の問題とベスト プラクティスに注意してください。 これらの推奨事項を念頭に置いてドライバーとアプリケーションを開発すると、AudioEndpointBuilder でより効果的に動作するドライバー、INF ファイル、オーディオ クライアントが作成されます。

  • 名前付け規則。 エンドポイントに使用される名前付け規則は、ブリッジ ピンのフレンドリ名に基づいています。 ただし、スピーカー エンドポイントの場合、名前は "スピーカー" にハードコーディングされており、ドライバーまたはサードパーティ製アプリケーションによって変更することはできません。

  • 準最適なトポロジ。 特定のトポロジは、エンドポイントを列挙するために AudioEndpointBuilder によって使用されるアルゴリズムのため、準最適であると見なされます。 たとえば、これらの準最適なトポロジのいずれかを作成する場合、非表示のエンドポイントを持ち、AudioEndpointBuilder が関連付けられているホスト ピンにリンクできない AudioEndpointBuilder またはスプリッター (分割エンドポイント) では表示できないホスト ピンを作成します。

    • 非表示のエンドポイント

      次の図では、KS フィルターに、1 つのブリッジ ピン (スピーカー) に接続する 2 つのホスト ピンがあります。

      Diagram showing problematic topology with AC-3 host pin and hidden endpoint on left side, individual PCM and AC-3 sharing single filter.

      AudioEndpointBuilder はこのブリッジ ピンを検出すると、パスを 1 つのホスト ピンのみにトレースし、ブリッジ ピンの既定値を設定して、スピーカー エンドポイントを作成してアクティブ化し、他のブリッジ ピンを検出し続けます。 したがって、他のホスト ピンが AudioEndpointBuilder から非表示になります。

      Diagram illustrating recommended topology with traceable paths between host pins and endpoints.

      上の図では、問題のあるトポロジが再設計され、AudioEndpointBuilder が 2 つのホスト ピン (PCM と AC-3/PCM) を検出できるようになりました。これは、2 つのブリッジ ピン (スピーカーと SPDIF) が表示されるようになったためです。

    • スプリッター

      1 つのホスト ピンが複数のブリッジ ピンに接続すると、別の種類の準最適なトポロジが作成されます。 次の図では、PCM ホスト ピンがスピーカー ブリッジ ピンと SPDIF ブリッジ ピンに接続されるトポロジを示しています。

      Diagram depicting problematic topology with two endpoints connected to one host pin and single PCM.

      この場合、AudioEndpointBuilder は 1 つのブリッジ ピンを検出し、PCM ホスト ピンへのパスをトレースして、既定値を設定し、スピーカー エンドポイントを作成してアクティブ化します。 AudioEndpointBuilder は次のブリッジ ピンを検出し、同じの PCM ホスト ピンへのパスをトレースして、既定値を設定し、SPDIF エンドポイントを作成してアクティブ化します。 ただし、両方のエンドポイントが初期化され、アクティブ化されているにもかかわらず、どちらか一方にストリーミングすると、もう一方に同時にストリーミングすることができなくなります。つまり、相互に排他的なエンドポイントです。

      次の図では、個別の接続が存在するこのトポロジの再設計を示しています。 この設計により、AudioEndpointBuilder は、2 つのブリッジ ピンのそれぞれについて PCM ホスト ピンへのパスをトレースできます。

      Diagram illustrating recommended topology with traceable paths between host pins and endpoints, featuring two PCMs on the left side.

  • エンドポイントの形式。 オーディオ エンジンが共有モードで実行されている場合、エンドポイントの形式は、インストール時に INF ファイルによって指示された特定の設定を想定します。 たとえば、オーディオ デバイスのオーディオ ドライバーは、関連付けられている INF ファイルを使用して、既定のエンドポイントを 44.1 kHz、16 ビット、ステレオ PCM 形式に設定します。 インストール後、エンドポイントの形式を変更するには、コントロール パネルまたはサードパーティ製アプリケーションを使用する必要があります。

  • 既定のデバイス。 既定のデバイスとして設定されているエンドポイントは、INF ファイルの情報を使用してインストール時に選択されます。 インストールが完了したら、コントロール パネルまたはサードパーティ製アプリケーションを使用して、別のエンドポイントを既定のエンドポイントとして選択する必要があります。

注: INF ファイルがインストール時に既定として設定するエンドポイントを選択しない場合、クライアント アプリケーションは MMDevice API を使用してエンドポイントを選択できます。 API は、フォーム ファクターのランクと、エンドポイントがレンダリング エンドポイントかキャプチャ エンドポイントかに基づいて選択されます。 次の表に、選択順序を示します。

レンダリング ランク キャプチャ ランク
スピーカー Microphone
ラインアウト ラインイン
SPDIF SPDIF

MMDevice API を使用して既定のエンドポイントを選択し、使用可能なエンドポイントが同じランク付けをされている場合、MMDevice API はエンドポイント ID をアルファベット順にして、既定として選択するエンドポイントを決定します。 たとえば、オーディオ アダプターにラインアウト コネクタとラインイン コネクタの両方があり、関連付けられている INF ファイルがインストール時に既定のコネクタを選択しない場合、MMDevice API はどのエンドポイント ID がアルファベット順で先であるかを識別し、そのコネクタを既定として設定します。 この選択は、エンドポイント ID が永続的であるため、システムを再起動した後も保持されます。 ただし、上位のエンドポイント (マイク コネクタを備えた 2 つ目のアダプター) がシステムに表示される場合、選択は保持されません。