一般に、アプリケーションの出力の全体的な音量レベルを制御するには、「マスタリング音声」の音量コントロールを使用します。音源ごとの音量は、プレミックスの個々の音を制御するために利用できますが、ユーザーがアプリケーションの全体的な音量を制御するための特定の直観的な方法ではありません。
音量レベルを用いて、浮動小数点振幅乗算-XAUDIO2_MAX_VOLUME_LEVELとXAUDIO2_MAX_VOLUME_LEVEL間 (-2²⁴2²⁴まで)として表される:MSDNに次のように
volume
パラメータが何を意味するかについては、それが定義されてい最大利得は144.5dBです。 1.0の音量レベルは、減衰またはゲインがないことを意味し、0は無音を意味する。負のレベルを使用して、オーディオのフェーズを反転することができます。ボリュームコントロールの詳細については、「XAudio2ボリュームとピッチコントロール」を参照してください。
実際には、サウンドを持たないように0.0に設定し、元のマスタリングされたミックスの「フルボリューム」にするには1.0に設定すると、0.0から1.0までは開始するのが妥当な場所です。個々のサウンドの音量、実行しているエフェクト、特にリバーブや3D空間ポジショニングによっては、全体の音量を1.0以上に設定すると「クリッピング」が発生することがあります。
マスタリングボリュームが1.0の場合でも、複雑なミックスでクリッピングが発生する可能性があります。ここでの解決方法は、マスタリング音声にFXMasteringLimiter
APOを使用することです。たとえば、マスタリングリミッタをDirectX Tool Kit for Audioに追加するコードを次に示します。
FXMASTERINGLIMITER_PARAMETERS params = {};
params.Release = FXMASTERINGLIMITER_DEFAULT_RELEASE;
params.Loudness = FXMASTERINGLIMITER_DEFAULT_LOUDNESS;
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
hr = CreateFX(__uuidof(FXMasteringLimiter),
mVolumeLimiter.ReleaseAndGetAddressOf(),
¶ms, sizeof(params));
#else
hr = CreateFX(__uuidof(FXMasteringLimiter),
mVolumeLimiter.ReleaseAndGetAddressOf());
#endif
if (FAILED(hr))
// error
XAUDIO2_EFFECT_DESCRIPTOR desc = {};
desc.InitialState = TRUE;
desc.OutputChannels = masterChannels;
desc.pEffect = mVolumeLimiter.Get();
XAUDIO2_EFFECT_CHAIN chain = { 1, &desc };
hr = mMasterVoice->SetEffectChain(&chain);
if (FAILED(hr))
// error
#if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
hr = mMasterVoice->SetEffectParameters(0, ¶ms, sizeof(params));
if (FAILED(hr))
// error
#endif
上記の条件付きコードパスは、XAudio 2.8とXAudio 2.7のAPIの違いを処理するためのものです。 this blog postを参照してください。
チャックが私のためにそれを釘付けに感謝します。 – WyomingDoug