XAudio2 Source/Master Voice SetVolume 参数

XAudio2 Source/Master Voice SetVolume parameters

我正在尝试为我的 WPF 应用构建一个音量滑块,以应用于我通过 XAudio2 输出的 WAV 文件。

我把所有的东西都串起来了,可以播放声音了。太棒了!

我无法理解 SetVolume 方法的参数。

谁能解释一下音量滑块的合适值是多少?

我确定我遗漏了一些非常明显的东西,而且我只是不习惯播放音频文件,所以我对启动一无所知。

我希望我真的想要两个滑块,一个用于母带声音,一个用于源声音。

通常,您只需使用 'mastering voice' 上的音量控件来控制应用程序输出的整体音量级别。每个源语音的音量可用于控制预混音的各个声音,但这并不是用户控制应用程序整体 'loudness' 的一种特别直观的方式。

关于volume参数是什么意思,在Microsoft Docs上定义如下:

Volume levels are expressed as floating-point amplitude multipliers between -XAUDIO2_MAX_VOLUME_LEVEL and XAUDIO2_MAX_VOLUME_LEVEL (-2²⁴ to 2²⁴), with a maximum gain of 144.5 dB. A volume level of 1.0 means there is no attenuation or gain and 0 means silence. Negative levels can be used to invert the audio's phase. See XAudio2 Volume and Pitch Control for additional information on volume control.

实际上,您将其设置为 0.0 表示没有声音,设置为 1.0 表示您最初掌握的混音 'full volume',因此 0.0 到 1.0 是一个合理的起点。根据您个人声音的音量、您的效果 运行,尤其是任何混响或 3D 空间定位,您可能会发现将整体音量设置为大于 1.0 会导致 'clipping'。

即使母带音量为 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(),
    &params, 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, &params, sizeof(params) );
    if ( FAILED(hr) )
        // error
#endif

上面的条件代码路径用于处理 XAudio 2.8 与 XAudio 2.7 API 差异。参见 this blog post

更新:: 请注意,DirectX 音频工具包 不再支持 XAudio 2.7。相反,它支持通过 XAudio2Redist.

在 Windows 7 SP1、Windows 8.0、Windows 8.1 和 Windows 10 上使用 XAudio 2.9