Date

Windows Core Audio で EndPoint を取得の続き

キャプチャフォーマットを決定する。つまり周波数、ビット数、チャンネル数などを決める。これらについてどのような値が使えるのかはデバイスの能力によって異なる。普通は44.1khzまたは48khz 16bitとすれば問題ないだろう。

Windows Core Audioはプロオーディオ向けアプリケーションでも使えるように、高精度なオーディオデータを低レイテンシで扱うことができる。今回はEDIROLのUA-101 を使うことを想定して、キャプチャフォーマットを96khz 24bit 2channel、キャプチャモードは排他モードを選択する。

まずは共有モードのフォーマットを設定する。コントロールパネルのサウンドプロパティを開いてみる。

このように、Windows Vista 上から 96KHZ, 24bit が認識できている。UA-101は10in 10out構成ですが、L/Rを一組として複数のエンドポイントから構成されていることが分かる。2channel, 24 bit, 96000 Hz を選択しておく。

キャプチャフォーマットはWAVEFORMATEX型で指定するが、スクラッチから組み立てていくと大変なので、共有モードで指定されているフォーマットを取得し、それをもとに排他モードのキャプチャフォーマットを指定する。

それには IAudioClient::GetMixFormatを呼び出す。返される値はWAVEFORMATEX型となっているが、WAVEFORMATEXTENSIBLE型にキャストして取得できる。

ここでややこしいのが、実際に使われているフォーマットと、返されるフォーマットが異なるということ。特にWAVEFORMATEXTENSIBLE::Format::nBitsPerSampleWAVEFORMATEXTENSIBLE::Samples::wValidBitsPerSampleには32が代入されている。しかし実際に有効なのは24ビットなのでおかしい。

そこでWAVEFORMATEXTENSIBLE::Samples::wValidBitsPerSampleを実際に有効なビット数である24に上書きする。

同様にWAVEFORMATEXTENSIBLE::SubFormatも浮動小数点となっているが、実際には整数なのでKSDATAFORMAT_SUBTYPE_PCMに上書きする。

フォーマットの準備ができたら IAudioClient::IsFormatSupported を呼び出し、指定したフォーマットがサポートされているか確認する。 メソッドの引数にAUDCLNT_SHAREMODE_EXCLUSIVEを渡すことにより排他モードでサポートされているか確認できる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// キャプチャフォーマットの設定
WAVEFORMATEXTENSIBLE *wfxe=NULL;
pAudClient->GetMixFormat((WAVEFORMATEX**)&wfxe);
// - 戻り値には、wValidBitsPerSample=32となるが、
//   実際に有効なのは24bitなので上書きする。
// - SubFormatはKSDATAFORMAT_SUBTYPE_IEEE_FLOATだが
//   実際にはKSDATAFORMAT_SUBTYPE_PCMなので上書きする。
(*wfxe).SubFormat=KSDATAFORMAT_SUBTYPE_PCM;
(*wfxe).Samples.wValidBitsPerSample=24;
hr=pAudClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE,
    (WAVEFORMATEX*)wfxe, NULL);

Comments

comments powered by Disqus