「 Device Topology 」一覧

Device Topology API を使ってみる おまけ


前回の各処理ユニットの接続状況を調べていくプログラムを作成して、ちょっと気になったことがありました。
自分のもっているある環境では妙なことが起こったのです。それが、「ジャックの数と並んでいるチャンネルの数が一致しない」という挙動です。

これが前回にも使った環境なのですが、ジャックは3つで、ここからチャンネル数は 6と予想がつきます。

しかしこのスピーカーの各ボリュームを表示してみると、以下のようになります。

Side-LR が増えています。しかし、ジャックにはその情報がいないようで、謎です。
ドライバの問題でしょうか・・・。

そこでマニュアルを取り出してみると、 VT1718S というサウンドチップが使用されており、なんとこれは8ch出力も可能である旨が記載されていました。この場合、8chの最後の部分が Side L&R と割り当てられており、このときの出力線は line out が使用されるとありました。

この情報から、ジャック情報にはline outの情報が出ていないだけで、実は8chが使用可能であったということがわかりました。実際にスピーカーの構成で 7.1ch を選択してテストしてみると、確かにLineOutにつないだところが Side LRとして鳴りました。当然ながら、5.1ch構成にするとLineOutにつないだスピーカーからは音が出力されませんでした。

このプロパティのチャンネルの並びについてよくわからないのですが、チャンネル数だけがわかっているときには参考URLに示すように、デフォルト値と対応するようにして並んでいるのかな~と思います。

個数 暗黙的なチャンネル位置
1 両方のスピーカーの FrontLeft および FrontRight に常にフル スケールでマッピングされます (モノラル サウンドの特殊な場合)。
2 FrontLeft、FrontRight (基本的なステレオ構成)。
3 FrontLeft、FrontRight、LowFrequency (2.1 構成)。
4 FrontLeft、FrontRight、BackLeft、BackRight (4 チャンネル)。
5 FrontLeft、FrontRight、FrontCenter、SideLeft、SideRight (5.0 構成)。
6 FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight (5.1 構成)。
7 FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight、BackCenter (6.1 構成)。
8 FrontLeft、FrontRight、FrontCenter、LowFrequency、BackLeft、BackRight、SideLeft、SideRight (7.1 構成)。

参考: XAudio2 の既定のチャンネル マッピング


Device Topology API を使ってみる その2


前回はジャック情報を取得しました。今回はオーディオの各ユニットの接続状況を取得するプログラムを書いてみました。
各ユニットへのIN/OUTの情報をコンソールに出力します。

前回のプログラムを利用し、IPartインターフェースを取得できたところから、接続状況をたどっていきます。

このようなコードで、現在のIPartに対して、入力・出力のIPartListを取得し、接続状況を調査します。
入力も出力も情報そのものは同じなので、入力部分のコードだけ下記に示します。

情報取得の部分では、名前しか今は取得していないですが、接続の情報や処理ユニットのGUIDとか色々ととれる情報があるようです。


DeviceTopology API を使ってみる


Windows Core Audio APIの1部である DeviceTopology APIを使って、ジャック情報を表示するプログラムを作ってみました。
デフォルトの出力先としているデバイスのジャック情報をコンソールに出力します。

ジャックの情報はスピーカーのプロパティ等で確認することができます。

この情報をプログラム中で取得、表示ということをします。

デフォルトの出力先デバイス(IMMDeviceインターフェース)は取得できているとして、
これから IDeviceToplogyを取得し、そこに接続情報を示す IConnector インターフェースを取得します。

そしてさらにこのコネクタに接続しているコネクタを取得します。

この IConnector は、コンポーネント間の接続を表現するインターフェースです。
ジャックや各処理ユニットの接続状況がこのインターフェースを用いることで調べることが出来るようです。

そして、1処理ユニットを示すインターフェースが IPart となるようなので、これを IConnector より取得します。
取得するメソッドが見つからないので、COMコンポーネントのおきまりのQueryInterfaceで取り出しています。

ここまで取り出しが終わったら、 IKsJackDescription インターフェースを取得して、ジャック情報構造体を取得します。
取得したら各メンバについて表示を行っています。表示を行う関数については省略します。

今回作成したプログラム実行体をおいておきます。dispJackInfo