2

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

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

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

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

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

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

4

1 回答 1

1

通常,您只需使用“主控声音”上的音量控制来控制应用程序输出的整体音量。每个源声音的音量可用于控制预混单个声音,但这并不是用户控制应用程序整体“响度”的一种特别直观的方式。

至于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,剪辑也可能发生在复杂的混音中。这里的一个解决方案是在您的母带上使用FXMasteringLimiterAPO。例如,这是在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 的差异。请参阅此博客文章

更新:: 请注意DirectX Tool Kit for Audio不再支持 XAudio 2.7。相反,它支持通过XAudio2Redist在 Windows 7 SP1、Windows 8.0、Windows 8.1 和 Windows 10 上使用 XAudio 2.9 。

于 2016-10-24T16:23:50.267 回答