次の方法で共有


セッション ボリューム コントロール

前に説明したように、WASAPI クライアントは、各 オーディオ セッションのボリューム レベルを個別に制御できます。 WASAPI は、セッションのボリューム設定をセッション内のすべてのストリームに均一に適用します。 各ボリューム レベルは 0.0 から 1.0 の範囲の値です。0.0 は無音を示し、1.0 は完全なボリューム (減衰なし) を示します。

クライアントは、最初のストリームをそのセッションに割り当てることによって、セッションを暗黙的に作成します。 新しいセッションの既定のボリューム レベルは 1.0 です。 前に説明したように、ユーザーは WASAPI クライアントである制御プログラム (Sndvol など) のユーザー インターフェイスを使用してセッションのボリューム レベルを調整できます。 コントロールの設定は永続的です。

システムは、クライアントが制御するボリューム設定に加えて、独自のボリューム設定をセッションに適用します。 これらの設定はオーディオ ポリシーに基づいており、グローバル オーディオ ミックスを構成するストリームの変更に応じて動的に変更されます。 オーディオ ポリシーの詳細については、「オーディオ コンポーネントの User-Mode」を参照してください。

各ストリームのボリューム制御を実装するシステム ソフトウェアは、ストリーム内の PCM サンプルに有効なボリューム レベルを乗算します。 有効ボリューム・レベルは、クライアントとシステム・ボリュームの設定を乗算した結果です。 したがって、信号振幅の結果の変化は、クライアントとシステムボリュームレベルの線形の組み合わせである。 たとえば、クライアント ボリューム レベルが 0.8 で、システム ボリューム レベルが 0.5 の場合、有効なボリューム レベルは (0.8)(0.5) = 0.4。

認識されるラウドネスは、信号振幅に関して線形ではないことに注意してください。 代わりに、ラウドネスはボリューム レベル v の対数とほぼ同じで変化します。

デシベルのラウドネス = 20log₁₀(v)

したがって、v = 0.5 を設定すると、元の信号 (音量レベルが適用される前の信号) のラウドネスが 6 デシベルで減衰し、v = 0.25 を設定すると信号が 12 デシベルで減衰します。 ボリューム レベル v = 1.0 (0 デシベルに対応) では、元の信号レベルは変更されません。

音量レベルを制御するためのユーザー インターフェイスを備えたオーディオ アプリケーションでは、通常、スライダーの位置の変化に線形比例する、認識されるラウドネスの変化を生成するスライダーが表示されます。 認識されるラウドネスとスライダーの位置の間に線形リレーションシップを生成するには、アプリケーションでボリューム レベル v とスライダーの位置の間に非線形リレーションシップを定義する必要があります。 詳細については、「ボリューム コントロールの Audio-Tapered」を参照してください。

前に説明したように、システム ボリュームコントロール プログラム Sndvol では、各オーディオ レンダリング デバイスで再生されているオーディオ セッションのボリューム スライダーが表示されます。 これらのスライダーは、[SndVol] ウィンドウの [アプリケーション] ラベルが付いたグループ ボックスに表示されます。 通常、各セッションには、特定のアプリケーション ウィンドウからのすべての再生ストリームが含まれます。 Sndvol ウィンドウのスライダーを使用して、ユーザーは個々のオーディオ アプリケーションのボリューム レベルを制御します。

一般に、アプリケーションは、すべての再生ストリームを同じオーディオ セッションに割り当てる必要があります。 WASAPI は、アプリケーションが複数のセッション間で再生ストリームを分散することを妨げません。 ただし、Sndvol のボリューム スライダーが急増すると、ユーザーが混乱する可能性があります。

オプションとして、アプリケーション ウィンドウにボリューム スライダーを表示できます。 アプリケーション スライダーは、対応する Sndvol スライダーの状態を常に反映する必要があります。 したがって、ユーザーがアプリケーション ウィンドウでスライダーを動かして音量レベルを変更した場合、Sndvol ウィンドウの対応するスライダーは、アプリケーション スライダーと一致して移動する必要があります。 同様に、ユーザーが Sndvol スライダーを移動した場合、アプリケーション スライダーは Sndvol スライダーと一緒に移動する必要があります。

この動作をサポートするために、WASAPI は ISimpleAudioVolumeインターフェイス実装します。 ユーザーがアプリケーション スライダーを移動すると、アプリケーションは ISimpleAudioVolume::SetMasterVolume メソッドを呼び出して、それに応じてセッション ボリューム レベルを調整します。 Sndvol は、このメソッドによって行われたボリュームの変更を監視し、表示されるボリューム スライダーの変更を反映します。 さらに、アプリケーションは、ユーザーが Sndvol を介して行ったセッション ボリュームの変更の通知を受け取ることができます。 このため、アプリケーションは IAudioSessionEventsインターフェイス実装し、インターフェイスを WASAPI に登録します。 その後、ユーザーが Sndvol を介してセッション ボリューム レベルを変更するたびに、アプリケーションは IAudioSessionEvents::OnSimpleVolumeChanged メソッドを介して通知呼び出しを受け取ります。 IAudioSessionEvents インターフェイスを実装するコード例については、「オーディオ セッション イベント」を参照してください。 IAudioSessionEvents インターフェイスを登録するコード例については、「レガシ オーディオ アプリケーション のオーディオ イベント」を参照してください。

ISimpleAudioVolume インターフェイスは、オーディオ セッション内のすべてのチャネルに同じボリューム レベルを均一に適用します。 このインターフェイスは、ほとんどのアプリケーションのボリューム制御要件を満たす必要がありますが、いくつかのアプリケーションでは、より特殊なボリューム制御機能が必要な場合があります。 IAudioStreamVolume インターフェイスは、セッション内の他のストリームを基準にして、セッション内の個々のストリームのボリュームを制御します。 IAudioStreamVolume を使用すると、クライアントはストリーム内のすべてのチャネルのボリューム レベルを個別に制御することもできます。 たとえば、アプリケーションでは、この機能を使用して、左から右にパンしてオーディオ ソースの空間移動をシミュレートするなどのオーディオ効果を実現できます。 IChannelAudioVolume別の特殊なインターフェイスは、セッション内の個々のチャネルのボリューム レベルを制御します。 たとえば、アプリケーションでは、IChannelAudioVolume を使用して、ステレオフォニック サウンド システムのバランス コントロールを実装できます。

Sndvol の [アプリケーション] ボックスのボリューム スライダーには、ISimpleAudioVolume インターフェイスを介して行われたボリュームの変更のみが反映されます。 IAudioStreamVolume および IChannelAudioVolume インターフェイス によって行われたボリューム変更は反映されません。 一部のアプリケーションでは、IAudioStreamVolume と IChannelAudioVolume を使用してボリューム設定を直接または間接的に制御できる場合がありますが、開発者は、ユーザーが Sndvol のボリューム スライダーと混同する可能性があるこれらのボリューム設定のアプリケーション スライダーを表示しないようにする必要があります。 そうしないと、ユーザーが Sndvol スライダーに反映された変更を見るためにアプリケーション スライダーを移動し、そのような変更が発生しないと混乱する可能性があります。 開発者は、慎重なユーザー インターフェイスの設計によってこの問題を回避できます。

セッション サブミックス内の任意のチャネルの有効ボリューム レベルは、スピーカーで聞いたとおり、次の 4 つのボリューム レベル要因の積です。

  • セッション内のストリームのチャネルごとのボリューム レベル。クライアントは、IAudioStreamVolume インターフェイス内のメソッドを使用して制御できます。
  • セッションのチャネルごとのボリューム レベル。クライアントは、IChannelAudioVolume インターフェイス内のメソッドを介して制御できます。
  • セッションのマスター ボリューム レベル。クライアントは、ISimpleAudioVolume インターフェイス内のメソッドを使用して制御できます。
  • グローバル ミックスの変更に応じてシステムが動的に変更する、セッションのポリシー ベースのボリューム レベル。

上記の一覧の 4 つのボリューム レベル要因はそれぞれ 0.0 から 1.0 の範囲の値です。0.0 は無音を示し、1.0 は完全なボリューム (減衰なし) を示します。 有効ボリューム レベルは、0.0 から 1.0 の範囲の値でもあります。

オーディオ エンジンは、ストリームをオーディオ セッション内の他のストリームと混合する前に、ストリーム内のチャネルに各チャネルの有効なボリューム レベルを適用します。 オーディオ エンジンが有効なボリューム レベルを乗算した後にチャネル内のサンプル値が 0 デシベルを超えた場合、エンジンはサンプルをクリップしてからセッション サブミックスに追加します。

ボリューム コントロールの