0

waveXXX()一部の楽器との間のオーディオ I/O を処理するために使用および機能するアプリケーションがありますmixerXXX()(楽器ではなく、オシロスコープまたは電子機器と考えてください。それほど重要ではありません)。いよいよ Windows XP への展開をやめて、Windows 7 や 8 に移行するときが来ました。

WASAPI に関するさまざまな資料を読むと、アプリケーションの大部分 (waveXXX()関数に基づく) は実際には問題なく動作するように思えますが、mixer()マスター出力ボリュームの設定、ライン イン ボリューム、およびマイクのミュートに使用されるものは間違いなく変更する必要があります。 、代わりにIAudioEndPointVolume呼び出しを使用します。

mixerXXX()通話のみの変更は可能ですか?それは望ましいですか?

論理的には、このアプリケーションではオーディオ エンドポイント (スピーカー出力、ライン入力) を排他的に使用する必要があります。ソフトウェアを介した排他的アクセスを確保したい場合、すべてのwaveXXX()コードも書き直す必要がありますか? (別の方法としては、他のオーディオ アプリケーションがこれに干渉する可能性があることをユーザーに警告することです)。

4

1 に答える 1

0

私の推奨事項:

  • 排他的なアクセスが必要な場合は、すべてを WASAPI に変換してください
  • ラインインを使用している場合は、すべてを WASAPI に変換します
  • 時間があれば、すべてを WASAPI に変換してください
  • 共有モードで厳密にスピーカーとマイクのみを使用している場合はmixerXXX()ISimpleAudioVolumeインターフェイス (およびそれに到達するための他のいくつかのインターフェイス) に置き換えてから、既存のwaveXXX()コードが必要に応じて動作するかどうかをテストします。次に、ハードウェア、OS、またはオーディオ ドライバーが変更されるたびにテストします。さらに良いことに、WASAPI に変換するだけです。

私の場合、専用のスピーカー出力が重要です。これにより、関連する入力信号を生成する機器が駆動されます。別のアプリケーションがその着信信号へのアクセスを共有したい場合は気にしないと思いますが、論理的には、オーディオ エンドポイントとの排他的契約を必要とするシステムです。

その排他性にはIMMDevice、スピーカー出力とライン入力入力の両方、それらActivate()IAudioClientインターフェイス、およびInitialize()両方を使用するためのインスタンスを取得する必要があります (この回答AUDCLNT_SHAREMODE_EXCLUSIVEも参照してください)。

しかし、実際にそのようなプロセスでラインインを選択したことがありますか? おそらくそうではありません。私が確信できるのは、以前にエンドポイントを共有していた他のアプリケーションを切断して迷惑をかけていることだけです.

これだけのことを行ったので、通話がどうなるかは明確ではありませんwaveInXXX()- おそらくライン入力から、おそらくマイクから取得するでしょう. ハードウェアベンダーが契約の終了をどのように実装するかに依存するかもしれません. また、ライン入力とマイクが常に多重化されている (つまり、選択可能) か、常に混合されているか (つまり、もう一方をミュートすることによってのみ選択をシミュレートできる)、または信頼できる標準がないかどうかも明確ではありませんでした。

このような理由から、全体で WASAPI を使用しないのはギャンブルです。

于 2015-03-20T03:18:16.970 に答える