2016-10-16 35 views
0

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

我把它串在一起,可以播放声音。大!

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

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

我确定我错过了一些令人难以置信的明显的东西,我只是不习惯播放音频文件,所以我非常无法启动。

我希望我真的想要两个滑块,一个用于掌握语音,另一个用于源语音。

+0

谢谢查克为我钉了它。 – WyomingDoug

回答

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