wasapi_device_managerの実装

公開:2011-10-25 19:06
更新:2020-02-15 04:36
カテゴリ:wasapi,c++,dawもどきの作成,windows,audio,windows api

wasapi_device_manager

WASAPIデバイスを管理するクラスを今実装中である。エンドポイントデバイスを列挙して一時的にIAudioClientを作成しサポートしている出力フォーマットを調査、wasapi_device_manager::device_info構造体に格納する。

ソースコード

軽く動かして私がおもに使うE-mu0404のフォーマットをチェックしてみた。下記フォーマットをサポートしていた。

スピーカー (2- E-MU E-DSP)
|share|bits:08|channel:02|rate:044100|OK|
|exc  |bits:16|channel:02|rate:044100|OK|
|share|bits:16|channel:02|rate:044100|OK|
|exc  |bits:16|channel:02|rate:048000|OK|
|exc  |bits:16|channel:02|rate:088200|OK|
|exc  |bits:16|channel:02|rate:096000|OK|
|exc  |bits:16|channel:02|rate:176400|OK|
|exc  |bits:16|channel:02|rate:192000|OK|
|share|bits:24|channel:02|rate:044100|OK|
|share|bits:32|channel:02|rate:044100|OK|
|share|bits:32f|channel:02|rate:044100|OK|

excが排他モードでshareが共有モードである。合っているかどうかPlayPcmWinで調べてみると結果が違っていた。

スピーカー (2- E-MU E-DSP)
++-------------++-------------++-------------++-------------++-------------++-------------+-------------++-------------++
|| 44kHz i16V16|| 48kHz i16V16|| 88kHz i16V16|| 96kHz i16V16||176kHz i16V16||192kHz i16V16||352kHz i16V16||384kHz i16V16||
|| OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || NA 88890008 || NA 88890008 ||
++-------------++-------------++-------------++-------------++-------------++-------------++-------------++-------------++
|| 44kHz i24V24|| 48kHz i24V24|| 88kHz i24V24|| 96kHz i24V24||176kHz i24V24||192kHz i24V24||352kHz i24V24||384kHz i24V24||
|| NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 ||
++-------------++-------------++-------------++-------------++-------------++-------------++-------------++-------------++
|| 44kHz i32V24|| 48kHz i32V24|| 88kHz i32V24|| 96kHz i32V24||176kHz i32V24||192kHz i32V24||352kHz i32V24||384kHz i32V24||
|| OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || NA 88890008 || NA 88890008 ||
++-------------++-------------++-------------++-------------++-------------++-------------++-------------++-------------++
|| 44kHz i32V32|| 48kHz i32V32|| 88kHz i32V32|| 96kHz i32V32||176kHz i32V32||192kHz i32V32||352kHz i32V32||384kHz i32V32||
|| OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || OK        0 || NA 88890008 || NA 88890008 ||
++-------------++-------------++-------------++-------------++-------------++-------------++-------------++-------------++
|| 44kHz f32V32|| 48kHz f32V32|| 88kHz f32V32|| 96kHz f32V32||176kHz f32V32||192kHz f32V32||352kHz f32V32||384kHz f32V32||
|| NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 || NA 88890008 ||
++-------------++-------------++-------------++-------------++-------------++-------------++-------------++-------------++

IAudioClient::IsFormatSupported()に渡すWAVEFORMATEXTENSIBLEのパラメータ指定がおかしいのだろうか。ちょっとわからないので、お手本であるPlayPcmWinのソースコードを覗いてみることにする。

WASAPIの共有モードの内部ミックスフォーマット

IAudioClient.GetMixFormat()で得られるフォーマットは32bit float形式であった。共有モードでは他のフォーマットでも渡せるけど、内部的にfloatに変換されるのだろう。Secret Rabbit Codeの内部処理形式はfloatだから、共有モードではそのまま渡せるようだね。