セッション ボリューム コントロール
前に説明したように、WASAPI クライアントは、各オーディオ セッションのボリューム レベルを個別に制御できます。 WASAPI は、セッションのボリューム設定をセッション内のすべてのストリームに均一に適用します。 各ボリューム レベルは 0.0 から 1.0 の範囲の値です。0.0 は無音を示し、1.0 は最大ボリューム (減衰なし) を示します。
クライアントは、最初のストリームをそのセッションに割り当てることによって、セッションを暗黙的に作成します。 新しいセッションの既定のボリューム レベルは 1.0 です。 前に説明したように、ユーザーは、WASAPI クライアントである制御プログラム (Sndvol など) のユーザー インターフェイスを使用してセッションのボリューム レベルを調整できます。 コントロールの設定は永続的です。
システムは、クライアントが制御するボリューム設定に加えて、独自のボリューム設定をセッションに適用します。 これらの設定はオーディオ ポリシーに基づいており、グローバル オーディオ ミックスを構成するストリームの変更に応じて動的に変更されます。 オーディオ ポリシーについて詳しくは、「ユーザー モード オーディオ コンポーネント」を参照してください。
各ストリームのボリューム制御を実装するシステム ソフトウェアは、ストリーム内の PCM サンプルに有効なボリューム レベルを乗算します。 有効なボリューム レベルは、クライアントとシステムのボリューム設定を乗算した結果です。 したがって、結果として生じる信号振幅の変化は、クライアントとシステムのボリューム レベルの線形の組み合わせとなります。 たとえば、クライアント ボリューム レベルが 0.8 で、システム ボリューム レベルが 0.5 の場合、有効なボリューム レベルは (0.8).(0.5) = 0.4 となります。
認識されるラウドネスは、信号振幅に対して線形ではないことに注意してください。 代わりに、ラウドネスは次の対数とほぼ同様に変化します。ボリューム レベル v の
ラウドネス (デシベル) = 20.log₁₀(v)
したがって、v = 0.5 を設定すると、元の信号 (音量レベルが適用される前の信号) のラウドネスが 6 デシベルで減衰し、v = 0.25 を設定すると信号が 12 デシベルで減衰します。 ボリューム レベル v = 1.0 (0 デシベルに対応) では、元の信号レベルは変更されません。
音量レベルを制御するためのユーザー インターフェイスを備えたオーディオ アプリケーションでは、通常、スライダーの位置の変化に線形比例する、認識されるラウドネスの変化を生成するスライダーが表示されます。 認識されるラウドネスとスライダーの位置の間に線形リレーションシップを生成するには、アプリケーションでボリューム レベル v とスライダーの位置の間に非線形リレーションシップを定義する必要があります。 詳細については、「オーディオ テーパード ボリューム コントロール」を参照してください。
前に説明したように、システム ボリュームコントロール プログラムの 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 を使用すると、クライアントはストリーム内のすべてのチャネルのボリューム レベルを個別に制御できます。 たとえば、アプリケーションでは、この機能を使用し、左から右にパンしてオーディオ ソースの空間移動をシミュレートするなどの、オーディオ効果を実現できます。 もう 1 つの特殊なインターフェイスである 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 デシベルを超えた場合、エンジンはサンプルをクリップしてからセッション サブミックスにそれらのサンプルを追加します。
関連トピック