2016-10-16 62 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