XAudio2 Source / Master Voice SetVolume参数

时间:2016-10-16 04:40:20

标签: c#-4.0 xaudio2

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

我把它全部串在一起,可以播放声音。太好了!

我无法理解SetVolume方法的论据。

任何人都可以解释音量滑块的适当值吗?

我确信我错过了一些非常明显的东西,而且我只是不习惯播放音频文件,所以我很无聊。

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

1 个答案:

答案 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(),
    &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