やっぱりWAVEFORMATEXTENSIBLEのパラメータ指定ミスだった。WAVE_FORMAT_EXTENSIBLEのFormat.wFormatTagにWAVE_FORMAT_EXTENSIBLE、SubFormatにKSDATAFORMAT_SUBTYPE_PCMを設定する必要がある。Format.wFormatTagにWAVE_FORMAT_PCMを指定してはいけない。
後PlayPcmWinのソースコードやMSDN、GetMixFormatの戻り値を見てわかったのは
- wValidBitsPerSampleには実際のサンプルビット数を入れる。例えばサンプルビット数は32bitだけれど24bitが有効だった場合、wBitsPerSampleに32bitを入れ、wValidBitsPerSampleには24bitを入れる。
- WAVEFORMATEXのcbSizeにはフォーマットに追加されるバイトサイズを指定する。WAVEFORMATEXのサイズではない。sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)となる。
である。結果は下記となり、PlayPcmWinとの結果が一致した。
スピーカー (2- E-MU E-DSP) |share|bits:08|vbits:08|channel:02|rate:044100|OK| |exc |bits:16|vbits:16|channel:02|rate:044100|OK| |share|bits:16|vbits:16|channel:02|rate:044100|OK| |exc |bits:16|vbits:16|channel:02|rate:048000|OK| |exc |bits:16|vbits:16|channel:02|rate:088200|OK| |exc |bits:16|vbits:16|channel:02|rate:096000|OK| |exc |bits:16|vbits:16|channel:02|rate:176400|OK| |exc |bits:16|vbits:16|channel:02|rate:192000|OK| |share|bits:24|vbits:24|channel:02|rate:044100|OK| |exc |bits:32|vbits:24|channel:02|rate:044100|OK| |share|bits:32|vbits:24|channel:02|rate:044100|OK| |exc |bits:32|vbits:24|channel:02|rate:048000|OK| |exc |bits:32|vbits:24|channel:02|rate:088200|OK| |exc |bits:32|vbits:24|channel:02|rate:096000|OK| |exc |bits:32|vbits:24|channel:02|rate:176400|OK| |exc |bits:32|vbits:24|channel:02|rate:192000|OK| |exc |bits:32|vbits:32|channel:02|rate:044100|OK| |share|bits:32|vbits:32|channel:02|rate:044100|OK| |exc |bits:32|vbits:32|channel:02|rate:048000|OK| |exc |bits:32|vbits:32|channel:02|rate:088200|OK| |exc |bits:32|vbits:32|channel:02|rate:096000|OK| |exc |bits:32|vbits:32|channel:02|rate:176400|OK| |exc |bits:32|vbits:32|channel:02|rate:192000|OK| |share|bits:32|vbits:03|channel:02|rate:044100|OK|
次は設定用のダイアログを作り、デバイスを変更できるようにコードを修正する。