我正在尝试为我的 WPF 应用程序构建一个音量滑块,以应用于我通过 XAudio2 输出的 WAV 文件。
我把所有东西都串起来了,可以播放声音。伟大的!
我只是无法理解 SetVolume 方法的参数。
谁能解释一下音量滑块的合适值是多少?
我确定我遗漏了一些非常明显的东西,而且我只是不习惯播放音频文件,所以我对启动毫无头绪。
我希望我真的想要两个滑块,一个用于主控声音,一个用于源声音。
通常,您只需使用“主控声音”上的音量控制来控制应用程序输出的整体音量。每个源声音的音量可用于控制预混单个声音,但这并不是用户控制应用程序整体“响度”的一种特别直观的方式。
至于volume
参数的含义,在微软文档中是这样定义的:
音量级别表示为 -XAUDIO2_MAX_VOLUME_LEVEL 和 XAUDIO2_MAX_VOLUME_LEVEL(-2²⁴ 到 2²⁴)之间的浮点幅度乘数,最大增益为 144.5 dB。音量级别 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 的差异。请参阅此博客文章。
更新:: 请注意DirectX Tool Kit for Audio不再支持 XAudio 2.7。相反,它支持通过XAudio2Redist在 Windows 7 SP1、Windows 8.0、Windows 8.1 和 Windows 10 上使用 XAudio 2.9 。