ループバック録音
ループバック モードでは、WASAPI のクライアントは、レンダリング エンドポイント デバイスによって再生されているオーディオ ストリームをキャプチャすることができます。 ループバック モードでストリームを開くには、クライアントで次の手順を実行する必要があります。
- レンダリング エンドポイント デバイスの IMMDevice インターフェイスを取得する。
- レンダリング エンドポイント デバイスにおいてループバック モードでキャプチャ ストリームを初期化する。
これらの手順を実行した後、クライアントは IAudioClient::GetService メソッドを呼び出して、レンダリング エンドポイント デバイス上の IAudioCaptureClient インターフェイスを取得できます。
WASAPI には、主に音響エコー キャンセル (AEC) をサポートするためにループバック モードが用意されています。 ただし、他の種類のオーディオ アプリケーションでは、オーディオ エンジンによって再生されているシステム ミックスをキャプチャするためにループバック モードが役立つことがあります。
「ストリームのキャプチャ」のコード例では、RecordAudioStream 関数を簡単に変更してループバック モード キャプチャ ストリームを構成することができます。 必要な変更は次のとおりです。
- IMMDeviceEnumerator::GetDefaultAudioEndpoint メソッドの呼び出しで、最初のパラメーター (dataFlow) を eCapture から eRender に変更します。
- IAudioClient::Initialize メソッドの呼び出しで、2 番目のパラメーター (StreamFlags) の値を 0 から AUDCLNT_STREAMFLAGS_LOOPBACK に変更します。
Windows 10 1703 より前のバージョンの Windows では、ストリームがイベント ドリブン バッファリングで初期化され、ループバックが有効になっている場合、プルモード キャプチャ クライアントはイベントを受け取りません。 これを回避するには、イベント ドリブン モードでレンダー ストリームを初期化します。 クライアントは、レンダー ストリームのイベントを受信するたびに、キャプチャ エンドポイント バッファーから次のサンプル セットを読み取るキャプチャ スレッドを実行するようキャプチャ クライアントに通知する必要があります。 Windows 10 バージョン 1703 以降では、イベント ドリブン ループバック クライアントがサポートされているため、レンダー ストリームに関連する回避策は不要になりました。
クライアントは、共有モード ストリーム (AUDCLNT_SHAREMODE_SHARED) に対してのみループバック モードを有効にすることができます。 排他モード ストリームは、ループバック モードでは動作できません。
WASAPI によるループバックの実装は、ハードウェアの機能ごとに異なります。 ハードウェアがレンダー エンドポイントでループバック ピンをサポートしている場合、WASAPI はこのピンで提供されるオーディオをループバック ストリームに使用します。 ハードウェアがループバック ピンをサポートしていない場合、WASAPI はオーディオ データをハードウェアのレンダリング ピンにコピーするだけでなく、オーディオ エンジンからループバック アプリケーションのキャプチャ バッファーに出力ストリームをコピーします。
一部のハードウェア ベンダーは、(レンダー デバイス上のインスタンスをピン留めするのではなく) ループバック デバイスをオーディオ アダプターに実装しています。 ハードウェア ループバック デバイスの動作は WASAPI ループバック モードと似ていますが、使用するのが難しいことがあります。
ハードウェア ループバック デバイスには、オーディオ アプリケーションに関して次のようなデメリットがあります。
- すべてのオーディオ アダプターにループバック デバイスがあるわけではありません。 したがって、それらに依存するアプリケーションはすべてのシステムで動作するわけではありません。
- アプリケーションがループバック デバイスから録音する前に、ユーザーはループバック デバイスを識別し、有効にして使用可能にする必要があります。
ハードウェア ループバック デバイスに割り当てられる名前はベンダーによって異なります。 以下に名前の例を示します。
- ステレオ ミックス
- ウェーブアウト ミックス
- 混合出力
- 聞こえる内容
標準化された名前がないと、ユーザーはデバイス名の一覧でループバック デバイスを識別するのが難しくなる可能性があります。
ハードウェア ループバック デバイスは、キャプチャ デバイスです。 したがって、アダプターがループバック デバイスをサポートしている場合、オーディオ アプリケーションは、他のキャプチャ デバイスから録音するのと同じ方法でデバイスから録音することができます。
たとえば、ハードウェア ループバック デバイスを既定のキャプチャ デバイスとして選択した場合、「ストリームのキャプチャ」のコード例の RecordAudioStream 関数 (変更なし) を使用して、デバイスからストリームをキャプチャできます。 (Windows マルチメディア waveInXxx 関数などのレガシ オーディオ API を使用し、デバイスからストリームをキャプチャすることもできます)。
オーディオ アダプターにハードウェア ループバック デバイスが含まれている場合、Windows マルチメディア コントロール パネル (Mmsys.cpl) を使用して、デバイスを既定のキャプチャ デバイスとして指定できます。 手順は次のとおりです。
Mmsys.cpl を実行するには、コマンド プロンプト ウィンドウを開き、次のコマンドを入力します。
control mmsys.cpl
または、タスク バーの右側にある通知領域のスピーカー アイコンを右クリックし、[録音デバイス] を選択することにより、Mmsys.cpl を実行することもできます。
Mmsys.cpl ウィンドウが開いたら、録音デバイスの一覧内の任意の場所を右クリックし、[無効なデバイスを表示する] オプションがオンになっていることを確認します。 (オンになっていない場合、ループバック デバイスが無効になっていると、一覧に表示されません)。
録音デバイスの一覧を参照し、ループバック デバイス (存在する場合) を見つけます。 ループバック デバイスが無効になっている場合、デバイスを右クリックして [有効] をクリックして有効にします。
最後に、ループバック デバイスを既定のキャプチャ デバイスとして選択するには、デバイスを右クリックし、[既定のデバイスとして設定] をクリックします。
WASAPI は、オーディオ ハードウェアにループバック デバイスが含まれているかどうかや、ユーザーがデバイスを有効にしているかどうかに関係なく、ループバック録音をサポートします。
Windows Vista には、デジタル著作権管理 (DRM) が用意されています。 コンテンツ プロバイダーは、著作権で保護された音楽や他のコンテンツを不正なコピーやその他の違法な使用から保護する点で DRM に依存しています。 同様に、信頼されたオーディオ ドライバーでは、ループバック デバイスが保護されたコンテンツを含むデジタル ストリームをキャプチャすることができません。 Windows Vista では、信頼されたドライバーのみが保護されたコンテンツを再生できます。 信頼できたドライバーと DRM について詳しくは、Windows DDK のドキュメントをご覧ください。
WASAPI ループバックには、オーディオの発信元であるターミナル サービス セッションに関係なく、再生されているすべてのオーディオのミックスが既定で含まれています。 たとえば、セッション 0 で実行されているサービスでループバック クライアントを実行し、すべてのユーザー セッションからオーディオをキャプチャしたり、セッション 0 から再生されているオーディオをキャプチャしたりすることができます。
Windows 10 ビルド 20348 以降では、IMMDevice::Activate の呼び出しで AUDIOCLIENT_ACTIVATION_PARAMS を渡すことで、特定のプロセスとその子をループバック キャプチャに含めたり除外したりできます。 アプリケーション ループバック オーディオ キャプチャのサンプルを参照してください。
リモート デスクトップを使用すると、クライアントにオーディオをリダイレクトすることができます。 これは、そのセッションにのみ表示される新しいオーディオ デバイスを作成することによって実装されます。
関連トピック