2

私は、とりわけ、すべての入力オーディオデバイスを列挙し(を使用してSetupAPI)、オーディオデバイスごとにすべての入力オーディオラインを一覧表示する(を使用して)アプリケーションを開発していますwinmm.dll

基本的に、この2つを関連付ける方法は、オーディオデバイスからデバイスパスを取得し、それを使用waveInMessageしてオーディオラインのデバイスパスを比較することです。

ここで、Windowsのデフォルトの[入力]オーディオライン()でも同じことができるようにしたいと思いますWAVE_MAPPER

問題は、waveInGetDevCapsforを使用するとWAVE_MAPPER「MicrosoftSound Mapper」が返され、 waveInMessagewithを使用するとDRV_QUERYDEVICEINTERFACE空の文字列が返されることです。

Microsoft Mapperがどのデバイスにマッピングされているかを確認する方法について何か提案はありますか?

4

3 に答える 3

3

WAVE_MAPPER がマップされるデバイスは、waveInOpen に渡されるパラメーターによって異なります。ドキュメントから:

WAVE_MAPPER - この関数は、指定された形式で録音できる波形オーディオ入力デバイスを選択します。

これは、実際に開かないとデバイスのプロパティを確認できないことを意味します。開くと、実際のデバイス ID を で取得できるはずですwaveInGetID

于 2009-12-10T20:19:26.130 に答える
1

1 つには、DirectSound の方がはるかに簡単で、XP から Vista への文書化されていない奇妙さがはるかに少ない (文書化されていない一般的な奇妙さがはるかに少ない) ことがわかりました。

しかし、おそらく唯一の方法は、他のすべてのデバイスを列挙し、どれが WAVE_MAPPER のものと一致するかを確認することです。

正直なところ... DirectSoundを使用するか、VistaとWin 7しかできない場合はCore Audio APIを使用してください。Winmm は ANCIENT API であり、最初に導入されたときはかなり壊れていました...

于 2009-12-10T20:18:19.173 に答える
1

間違っている場合は訂正してください。ただし、サウンド開発に関する過去の Microsoft カンファレンスのビデオをいくつか見てきました。Larry Osterman の最新の記事では、彼のチームが取り組んだ Windows 7 の新しいサウンド機能について言及しています。

その特徴の一つが【名前は私の解釈です】「デバイスのホットスワップ」でした。アプリケーションが「Windows の既定のサウンド再生」エンドポイントを使用して再生していて、現時点では USB ヘッドフォンのセットであるとします。突然ヘッドホンを外す。Windows 7 までは、[そのテスト シナリオを予見していなかった場合] アプリケーションがクラッシュしていました。Windows 7 では [元の件名へのフックがあります]、Windows のデフォルトの再生デバイスを使用している場合、Windows は出力ストリームを新しいデフォルト (スピーカーなど) に適切かつ自動的にスワップします。

私が到達しようとしているのは、WAVE_MAPPER デバイスを本来あるべきではないクラスに適合させようとしているということです。おそらく、概念的に言えば、WAVE_MAPPER は、オーディオ ストリームの入力と出力の機能が同じであっても、例外として扱われるべきです。

もっと具体的にしようと思います。私のアプリケーションにはオーディオ デバイスのリストがあり、各オーディオ デバイスにはオーディオ ラインのリストがあります。オーディオ デバイスには、VID や PID などのプロパティがあり、SetupAPI を介して簡単に検出でき、winmm の waveInMessage を介してオーディオ ラインに関連付けることができます。WAVE_MAPPER はそのロジックに従っていません。私はそれをやろうとしていました。

したがって、WAVE_MAPPER をその基盤となるオーディオ デバイスに関連付けようとする代わりに、それをそのまま、つまりデフォルトのオーディオ デバイスとして扱います。

于 2009-12-11T20:36:31.997 に答える