音声デバイス一覧の取得方法は色々ありますが、方法によってはデバイス名が途中までで端折られてしまいます。それでこの前ちょっと苦戦したので書きだしてみました。
デバイス名が端折られて困っている人は、以下のような取得方法をとっているかと思います。
- waveInGetNumDevs・waveOutGetNumDevsで一覧取得
- DirectSoundEnumerate・DirectSoundCaptureEnumerateで取得
まず1.の方法ですが、この方法の場合、デバイスのデータはWAVEINCAPS構造体に格納されて出てきます。
このWAVEINCAPS構造体がゴミゴミアンドゴミで、デバイス名を格納するszPnameというメンバが「CHAR szPname[32]」という風に宣言されているのです。
つまり要素数32のchar型配列にデバイス名が入り切らなかったらはい終了。名前の途中でぶっちり切られます。
次に2.の方法ですが、これも惜しいですがダメです。
DirectSoundEnumrateは問題なく正しいデバイス名をくれるのですが、DirectSoundCaptureEnumrateはWCHAR型で32文字に収まりきらない分を切ってきます。ヌル文字もあるので正確には31文字です。
仕様的に文字数制限などは無いはずですし、MSDNにもそのような記述は無いのですが…少なくとも自分の環境ではこのような結果になりました。
スタックオーバーフローではDirectSoundEnumrateの方で名前が切られたという事例が投稿されていますし、環境依存で起こる現象なのかもしれません。
さて、waveIn/Out系でダメで、DirectSoundでも不安定ならどうするか…答えは簡単、レジストリを参照すればいいのです。お手元のregeditを開いてください。
エクスプローラやコンパネが表示する情報とか何かシステムっぽい情報はだいたいレジストリを参照すればどうにかなります。
とりあえずレジストリ内を検索して調べてみたところ、以下の場所がそれらしい感じでした。
録音デバイス:(マイクの類)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\
以下
再生デバイス(スピーカーの類):HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\
以下
上記のキーの下に名前がGUIDのキーがゴロゴロ転がっていますが、それらが各デバイスです。
各キーの下に「Properties」とかいうサブキーがあり、そこに色々データが設定されていますが、ここからお目当てのデバイス名も分かります。
データの名前がGUIDぽい何かでよくわからない感じになってますが、
デバイス名
→{b3f8fa53-0004-438e-9003-51a46e139bfc},6
デバイス種別
→{a45c254e-df1c-4efd-8020-67d146a850e0},2
その他各種情報の場所
→{b3f8fa53-0004-438e-9003-51a46e139bfc},2
みたいにちゃんと対応があるみたいです。詳しくは調べてないですが。
そうそう、DirectSoundCreate8の第一引数に指定する音声デバイスのIDですが、これは各デバイスのキー名の頭に、再生デバイスなら{0.0.0.00000000}.
を、録音デバイスなら{0.0.1.00000000}.
を付け加えて出来ます。
例えばスピーカーで{1437198c-1fbb-4117-bdbd-d87f32c907cc}
を指定するなら{0.0.0.00000000}.{1437198c-1fbb-4117-bdbd-d87f32c907cc}
とします。
あとはRegQueryValueExを駆使してむにゃむにゃやってOKです。