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だから、共有モードではそのまま渡せるようだね。