Device Topologies API(1)

公開:2010-11-22 16:18
更新:2020-02-15 04:36
カテゴリ:windows,wasapi,audio,windows api

前から気になっていた、Device Topologies APIについてのお勉強。ヘルプを翻訳しながら理解した部分をまとめてみた。まずはサンプル・コードの手前までの部分。

参考および引用:MSDN Library - Device Topologies http://msdn.microsoft.com/en-us/library/dd370825(v=VS.85).aspx

Device Topologies APIMMDevice APIWASAPIEndpointVolume APIではアクセスできないオーディオ・アダプタのさまざまな内部機能を制御するためのAPIである。 MMDevice API・WASAPI・EndpointVolume APIはマイク・スピーカ・ヘッドフォンなどのオーディオ入力・出力デバイスをエンドポイントデバイスとして利用者に公開する。エンドポイントデバイスはオーディオ・デバイスのミュート・ボリューム制御への簡単なアクセスを提供する。

Vista以降のオーディオ・エンジンはオーディオ・アプリケーションを使用するときオーディオ・デバイスの内部構造を自動的に設定する。なのでオーディオエンジンは設定のためにDevice Topologies APIを利用する必要はほとんどない。入力マルチプレクサがマイク入力かライン入力のいずれかのみ使用でき、先行して共有モードでライン入力を使用しているアプリケーションがあると仮定する。続いて排他モードでマイク入力を行うアプリケーションが実行された場合、マイク録音開始時にOSが自動的にマイク入力に切り替える。 XP以前のWindowsでは排他モードのアプリケーションはmixerXxxAPIを使用してアダプタデバイスの内部を調べマイク入力を手動で切り替える必要があったが、Vista以降では不要になっている。

しかしMMDevice API・WASAPI・EndpointVolume APIを通じてオーディオ・ハードウェアの機能を細かく制御しなくてはならないアプリケーションがある。そんなアプリケーションのためにDeviceTopology APIはアダプター・デバイスの内部機能を検出・管理する機能を提供する。DeviceTopology API を使用するアプリケーションはWindows オーディオ・ポリシーやオーディオ・デバイスを共有している他のアプリケーションに影響のないようにしなくてはならない。

(Device Topologies APIを必要とするアプリケーションってどんなアプリなんだろうね?)

DeviceTopology APIは以下のオーディオ機能を検出し管理するためのインターフェースを提供する。

自動ゲインコントロール
低音コントロール
入力セレクター (マルチプレクサ)
音量コントロール
ミッドレンジコントロール
ミュートコントロール
出力セレクター (デマルチプレクサ)
ピーク メーター
高音コントロール

DeviceTopology APIはさらに、アダプター・デバイスがサポートしているストリーム・フォーマットの情報を取得することができる(これは有用な機能だ)。DeviceTopology APIのインターフェイスはDevicetopology.hで定義されている。

次の図はマイク・ライン入力・CD プレーヤーからオーディオをキャプチャする部分の接続例である。

MSDNより引用:http://msdn.microsoft.com/dynimg/IC99537.jpg

上の図はアナログ入力からシステムバスにつながるデータの経路が示されている。おのおののデバイス機能は下記のIDeviceTopologyインターフェイス・オブジェクトとして表現される。

・ウェーブキャプチャデバイス
・入力マルチプレクサーデバイス
・エンドポイント デバイス A
・エンドポイント デバイス B

上図においてエンドポイント・デバイス・ウェーブキャプチャ・入力マルチプレクサ デバイスが結合されている。デバイス間の接続を通してデバイスから次のデバイスへオーディオデータが渡される。 接続の両側 (図上では「Con」) はデータが入出力されるコネクタである。

図の左端上ではライン入力・マイクロフフォンジャックからの信号がエンドポイントデバイスに入力される。

ウェーブキャプチャデバイスやマルチプレクサデバイスの内部にはサブユニットと呼ばれるストリーム処理機能がある。上図では下記のサブユニットが存在する

・ボリュームコントロール (Vol)
・ミュートコントロール (Mute)
・マルチプレクサ もしくは入力セレクタ(MUX)
・A/Dコンバータ(ADC)

DeviceTopology API上ではコネクタとサブユニットは同じ「部品」カテゴリに属していて、コネクタかサブユニットかに関わらず共通した機能を持っている。DeviceTopology APIではコネクタ・サブユニット共通の機能はIPartインターフェースで実装され、コネクタ・サブユニット固有の機能はそれぞれIConnector・ISubunitインターフェースで実装される。

DeviceTopology APIはカーネル ストリーミング (KS) フィルタの情報からキャプチャデバイスとマルチプレクサデバイスの機能セットを構築する。

DeviceTopology APIは、上図のエンドポイントデバイスA・Bを表す単純な構成セットを構築する。 エンドポイントデバイスの構成は1つのコネクタから成る。エンドポイントデバイスのための単なるプレースホルダであり、オーディオデータ処理のためのサブユニットを全く含んでいない。アダプターデバイスはアプリケーションがオーディオ処理のためのサブユニットをすべてを含んでいるため、エンドポイントデバイスのデバイス構成はアダプタデバイス構成の探索開始点として機能する。

DeviceTopology API上で2つの部品間の接続をリンクと呼ぶ。DeviceTopology APIはデバイス間のにリンクをたどる手段を提供する。デバイス機能間の接続を探索するメソッドも提供する。

接続されているデバイス機能の探索を開始するには、IDeviceTopologyインターフェースを有効にする。 エンドポイントデバイスのコネクタはオーディオアダプタのコネクタもしくはネットワークに接続している。 もしエンドポイントコネクタがオーディオ アダプター上のデバイスに接続されているなら、DeviceTopology APIのメソッドはエンドポイントの対面のアダプターデバイス接続のIDeviceTopologyインターフェースを取得することで、アダプターデバイスにアクセスできる。その一方で、ネットワークはデバイス機能がない。ネットワーク接続はリモートアプリケーションにオーディオ ストリームを送る。

DeviceTopology API はオーディオ アダプターのハードウェアデバイスへのみアクセスできる。図の両側の破線が DeviceTopology API のアクセス可能範囲を表す。左端と右端の外部のデバイスのソフトウェアコンポーネントはAPIのアクセス範囲を超えている。

図では、コネクタ接続は接続の種類に関連付けられている。接続の種類はConnectorType 列挙値(Physical_External・Physical_Internal・Software_Fixed・Software_IO・Network)で定義されている。A・ Bの入力マルチプレクサデバイスとエンドポイントデバイス間の接続はPhysical_Externalとなる。内部の CD プレーヤーからのアナログ信号入力と入力マルチプレクサデバイス間の説送はPhysical_Internalとなる。ウェーブキャプチャデバイスと入力マルチプレクサデバイス間の接続の種類はSoftware_Fixedであり、接続は固定されソフトウェアで構成することはできない。右側のシステムバスへの接続の種類はSoftware_IOであり、DMAによるデータI/Oを示す。図には接続の種類:Networkは描かれていない。

アプリケーションはエンドポイントデバイスからデータパスの探索を開始する。まず、エンドポイントデバイスを表すIMMDevice インターフェイスを取得する。そしてIDeviceTopologyインターフェイスのエンドポイントデバイスを取得するためにIMMDevice::Activate メソッドにIDeviceTopologyのIIDを引数にして呼び出す。図の例では、すべてのハードウェア コントロール (ボリューム・ミュート・マルチプレクサ)のキャプチャストリームライン入力およびマイク入力からのマルチプレクサデバイスが含まれる。

読み返すとまとめになっていないかも。。折をみて内容は改良していくとするか。。