XAudio2学习之调节音量

XAudio2音量调节分为全局和声道调节以及连接音量调节。所谓全局就是说设置了音量后会影响整个音频流的声音大小;声道调节就是说只调节某一个声道的音量大小;连接音量设置是说设置voice与其输出voice之间的声道映射音量。举个例子来说明:

IXAudio2SourceVoice->IXAudio2SubmixVoice->IXAudio2MasteringVoice

由三个voice组成的音频图。IXAudio2SourceVoice为2声道,IXAudio2SubmixVoice和IXAudio2MasteringVoice为5.1声道。

所有Voice的所有声道的音量默认都是为1.0。

音频数据经SourceVoice流向SubmixVoice,最终流向MasteringVoice,期间进行采样率和通道数转换。

设置全局音量可以使用IXAudio2SourceVoice::SetVolume和IXAudio2SubmixVoice::SetVolume以及IXAudio2MasteringVoice::SetVolume来设置,任一设置以后都会影响整个音频流的整体音量大小。SetVolume接口都是继承自IXAudio2Voice,参数为浮点型。取值一般为0~1.0,用于调节音量大小。1.0表示无衰减和无增益,0表示静音。如果为负值的话,可以用来逆转音频的相位。

设置声道音量可以使用IXAudio2MasteringVoice::SetChannelVolumes和IXAudio2SourceVoice::SetChannelVolumes以及IXAudio2SubmixVoice::SetChannelVolumes来改变某一声道的音量大小。也就是平时所说的平衡。也是继承自IXAudio2Voice,参数为浮点型。取值一般为0~1.0,用于调节音量大小。1.0表示无衰减和无增益,0表示静音。如果为负值的话,可以用来逆转音频的相位。

<span style="font-size:18px;">HRESULT SetChannelVolumes(
         UINT32 Channels,
         const float *pVolumes,
         UINT32 OperationSet = XAUDIO2_COMMIT_NOW
)
</span>
第一个参数表示此voice包含的所有声道数,第二参数表示每个声道需要设置的音量,使用float指针。例如2声道,那么第二个参数float ChannelVolumes[2] = { 1.0, 0.5 };,参数和声道进行匹配,从坐声道开始。

连接音量设置是指设置当前voice和它的输出voice之间的通道音量映射,比如2通道输出到5.1声道,当前voice每个声道映射到target voice每个声道的音量。SetOutputMatrix接口都是继承自IXAudio2Voice,参数为浮点型。取值一般为0~1.0,用于调节音量大小。1.0表示无衰减和无增益,0表示静音。如果为负值的话,可以用来逆转音频的相位。

<span style="font-size:18px;">HRESULT SetOutputMatrix(
         IXAudio2Voice *pDestinationVoice,
         UINT32 SourceChannels,
         UINT32 DestinationChannels,
         const float *pLevelMatrix,
         UINT32 OperationSet = XAUDIO2_COMMIT_NOW
)
</span>
由当前voice调用,第一个参数表示的输出到的target voice的对象;第二个参数表示当前voice的声道数;第三个参数表示的是target voice的声道数;第四个参数表示的传递给target voice的映射音量数组。

Array of [SourceChannels × DestinationChannels] volume levels sent to the destination voice. The level sent from source channel S to destination channel D is specified in the form pLevelMatrix[SourceChannels × D + S].
上面是文档中描述的,大致意思就是:pLevelMatrix是一个指向元素个数为SourceChannels × DestinationChannels的浮点型数组的指针,数组中的数值表示当前voice映射到target voice每个通道的音量。映射方式是:源声道S映射到目的声道D的音量值对应数组中pLevelMatrix[SourceChannels × D + S]。

例如:2声道映射到5.1声道:

Output Left Input [Array Index] Right Input [Array Index]
Left 1.0 [0] 0.0 [1]
Right 0.0 [2] 1.0 [3]
Front Center 0.0 [4] 0.0 [5]
LFE 0.0 [6] 0.0 [7]
Rear Left 0.8 [8] 0.0 [9]
Rear Right 0.0 [10] 0.8 [11]

 

本文地址;http://blog.csdn.net/u011417605/article/details/51037717

交流QQ:1245178753

你可能感兴趣的:(audio,XAudio2)