我正在嘗試爲我的WPF應用程序構建一個音量滑塊,以應用於通過XAudio2輸出的WAV文件。XAudio2源/主音色SetVolume參數
我把它串在一起,可以播放聲音。大!
我只是無法理解SetVolume方法的參數。
任何人都可以解釋一個音量滑塊適當的值?
我確定我錯過了一些令人難以置信的明顯的東西,我只是不習慣播放音頻文件,所以我非常無法啓動。
我希望我真的想要兩個滑塊,一個用於掌握語音,另一個用於源語音。
我正在嘗試爲我的WPF應用程序構建一個音量滑塊,以應用於通過XAudio2輸出的WAV文件。XAudio2源/主音色SetVolume參數
我把它串在一起,可以播放聲音。大!
我只是無法理解SetVolume方法的參數。
任何人都可以解釋一個音量滑塊適當的值?
我確定我錯過了一些令人難以置信的明顯的東西,我只是不習慣播放音頻文件,所以我非常無法啓動。
我希望我真的想要兩個滑塊,一個用於掌握語音,另一個用於源語音。
通常,您只需使用'掌握語音'的音量控制來控制應用程序輸出的整體音量級別。每個源語音音量可用於控制預混音的個別聲音,但這不是用戶控制應用整體「響度」的特別直觀方式。
至於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。
謝謝查克爲我釘了它。 – WyomingDoug