WASAPI一覧

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


最近のWindowsのオーディオアーキテクチャについて( Windows Core Audio API)

Windows Vista以降のサウンド関連APIについて。
音質についてはあまりよくわからないので、調べてわかったを書いていきます。

まず、APIの説明がほぼ英語・・・。あまり英語が得意ではないためAPIを見て何となく試してみて理解ということをやってます。
その中、日本語で説明されているサイトを見つけました。

ttp://mikeo410.lv9.org/lumadcms/~programmingcoreaudiointerface
どうやらページが消えてしまったようです(2015/03/20)。

これだけでは全然足りないけど、一通りのインターフェースが日本語で書いてある数少ないサイトで、自分にはすごく参考になりました。
サウンド周りといえば WASAPI (Windows Audio Sessions API) がよく取り上げられていて、調べる際の検索キーワードで大事だけど、そこにはまだ関連するグループとして他のモジュールも存在して、これらをひっくるめて Windows Core Audio と呼ぶような感じです。このキーワードも調べる際に活用しないとわからない部分があるな~と思います。
XPのときと大幅に変わっているし、ハードウェアに近いところで制御しようと思ったらこれらが必要になります。

Windows Core Audio

  • MMDevice API
  • WASAPI
  • Device Topology API
  • EndpointVolume API

MMDevice API って何かとおもったら、Multimedia Device という意味で MMDeviceなんだそうだ。
WASAPIを使うことで低レイテンシでサウンドを鳴らしたり、Device Topology API 使ってスピーカーまでの接続状況を調べたりとか色々できるっぽい。これらについてはそのうち何かサンプルコードを書いてみようと思います。

そしてこれらCore Audio の位置づけは、リンク先の図によると、ユーザーアプリケーションが直接さわれる部分としてはカーネルモードに近いユーザーモードの部分かと。

参考: 楽しいハック講座(4) Windows7 オーディオアーキテクチャの概要