XAudio2学习之调节音调

频率比有两个地方可以设置。一个是在创建IXAudio2SourceVoice对象的时候,一个是调用IXAudio2SourceVoice::SetFrequencyRatio来调节。

在创建IXAudio2SourceVoice对象的时候,第三个参数影响音高(音调)和第四个参数会影响频率比的设置。

HRESULT CreateSourceVoice(
         IXAudio2SourceVoice **ppSourceVoice,
         const WAVEFORMATEX *pSourceFormat,
         UINT32 Flags = 0,
         float MaxFrequencyRatio = XAUDIO2_DEFAULT_FREQ_RATIO,
         IXAudio2VoiceCallback *pCallback = NULL,
         const XAUDIO2_VOICE_SENDS *pSendList = NULL,
         const XAUDIO2_EFFECT_CHAIN *pEffectChain = NULL
)

第三个参数指定source voice的行为方式 . 标志位可以是 0 或者 下面一个或者多个的组合:
Value Description
XAUDIO2_VOICE_NOPITCH 此voice音高控制不可用.。
XAUDIO2_VOICE_NOSRC 此voice采样率转换不可用, 此voice的所有输出必须具有相同的采样率。
注意:
XAUDIO2_VOICE_NOSRC标志位会导致声音表现得好像 XAUDIO2_VOICE_NOPITCH 标志位也被设置了.
 
XAUDIO2_VOICE_USEFILTER 音效过滤器在此voice上应有效. 
XAUDIO2_VOICE_MUSIC 此voice用来播放背景音乐. 系统会自动地用用户选择的音乐来替换此 voice。 
如果第三个参数中包含XAUDIO2_VOICE_NOPITCH,那么此voice调节就不可用。

第四个参数表示的是可以在此voice设置的最大频率比。取值在XAUDIO2_MIN_FREQ_RATIO 和 XAUDIO2_MAX_FREQ_RATIO之间:

#define XAUDIO2_MIN_FREQ_RATIO          (1/1024.0f)   // Minimum SetFrequencyRatio argument
#define XAUDIO2_MAX_FREQ_RATIO          1024.0f       // Maximum MaxFrequencyRatio argument
#define XAUDIO2_DEFAULT_FREQ_RATIO      2.0f          // Default MaxFrequencyRatio argument

此参数的最大值被定义为XAUDIO2_MAX_FREQ_RATIO, 其允许音高提升到10 八度音节.如果MaxFrequencyRatio小于1.0,此voice会在创建后立马使用此比值(而不是默认的1.0)。

而且对于后续的调用IXAudio2SourceVoice::SetFrequencyRatio,也就是第二种可以设置频率比的方法,会被限制XAUDIO2_MIN_FREQ_RATIO 和MaxFrequencyRatio之间。

注意:XAudio2的内存使用可以通过使用尽可能低的MaxFrequencyRatio来减少。

HRESULT SetFrequencyRatio(
         float Ratio,
         UINT32 OperationSet = XAUDIO2_COMMIT_NOW
)

频率调节可以表示为 源频率/目的频率。改变频率比可以改变voice中音频的速率。比值大于1.0会导致音频播放加快,比值小于1.0会导致音频播放减慢。另外,频率比voice中音频的音调。例如,频率比为1.0对音频没有影响,然而频率比为2.0会提升一个八度音节的音高,并且0.5降低一个八度音节的音高。

如果调用SetFrequencyRatio设置了一个比值不在有效范围内,此方法会设置一个最接近有效值的比值。同时在debug模式下回生成一个警告。
所以调用IXAudio2SourceVoice::SetFrequencyRatio可以调节音调(或者音高)。

交流QQ:1245178753

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

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