我正在尝试为我的WPF应用程序构建一个音量滑块,以应用于我通过XAudio2输出的WAV文件。
我把它全部串在一起,可以播放声音。太好了!
我无法理解SetVolume方法的论据。
任何人都可以解释音量滑块的适当值吗?
我确信我错过了一些非常明显的东西,而且我只是不习惯播放音频文件,所以我很无聊。
我希望我真的想要两个滑块,一个用于母带处理,一个用于源语音。
答案 0 :(得分:0)
通常,您只需使用“母带语音”上的音量控制来控制应用程序输出的整体音量级别。每个源语音音量可用于控制预混音个别声音,但这并不是用户控制应用程序整体“响度”的特定直观方式。
关于volume
参数的含义,它在MSDN上的定义如下:
音量级别表示为浮点幅度乘数 介于-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差异。请参阅this blog post。