使用方法:建立效果鏈
本主題說明如何將效果鏈結套用至語音,以允許自訂處理該語音的音訊資料。 本主題描述如何使用殘響效果,這是其中一個內建的 XAudio2 效果。
建立將效果套用至語音的基本效果鏈結
建立效果。
在此範例中, XAudio2CreateReverb 函式會建立殘響效果。 如需可與 XAudio2 搭配使用之效果的可能來源清單,請參閱 XAudio2 音訊效果 。
IUnknown * pXAPO; hr = XAudio2CreateReverb(&pXAPO);
使用資料填入 XAUDIO2_EFFECT_DESCRIPTOR 結構。
如果鏈結中有多個效果,每個效果都需要 XAUDIO2_EFFECT_DESCRIPTOR 結構。
XAUDIO2_EFFECT_DESCRIPTOR descriptor; descriptor.InitialState = true; descriptor.OutputChannels = 1; descriptor.pEffect = pXAPO;
使用資料填入 XAUDIO2_EFFECT_CHAIN 結構。 在此情況下,鏈結只會有一個效果。 如果鏈結有多個效果,EffectCount 成員會包含效果計數,而 pEffectDescriptors 成員會指向XAUDIO2_EFFECT_DESCRIPTOR結構的陣列。
XAUDIO2_EFFECT_CHAIN chain; chain.EffectCount = 1; chain.pEffectDescriptors = &descriptor;
使用 SetEffectChain 函式將效果鏈結套用至語音。
您可以將效果鏈結套用至主音、來源語音和副混音。
pVoice->SetEffectChain(&chain);
使用 IUnknown::Release 釋放效果。
當您建立 XAPO 時,其參考計數會是 1。 當 XAPO 傳遞至 具有 SetEffectChain的 XAudio2 時,XAudio2 會遞增 XAPO 上的參考計數。 釋放用戶端對 XAPO 的參考,可讓 XAudio2 取得 XAPO 的擁有權。 如果 XAudio2 只有 XAPO 的參考,當 XAudio2 不再使用時,將會加以處置。 如果用戶端程式代碼需要維護 XAPO 的參考,例如稍後重複使用,您應該略過此步驟。
pXAPO->Release();
如果有任何與效果相關聯的參數結構,請填入參數結構。 殘響效果會使用 XAUDIO2FX_REVERB_PARAMETERS 結構。
XAUDIO2FX_REVERB_PARAMETERS reverbParameters; reverbParameters.ReflectionsDelay = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_DELAY; reverbParameters.ReverbDelay = XAUDIO2FX_REVERB_DEFAULT_REVERB_DELAY; reverbParameters.RearDelay = XAUDIO2FX_REVERB_DEFAULT_REAR_DELAY; reverbParameters.PositionLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION; reverbParameters.PositionRight = XAUDIO2FX_REVERB_DEFAULT_POSITION; reverbParameters.PositionMatrixLeft = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX; reverbParameters.PositionMatrixRight = XAUDIO2FX_REVERB_DEFAULT_POSITION_MATRIX; reverbParameters.EarlyDiffusion = XAUDIO2FX_REVERB_DEFAULT_EARLY_DIFFUSION; reverbParameters.LateDiffusion = XAUDIO2FX_REVERB_DEFAULT_LATE_DIFFUSION; reverbParameters.LowEQGain = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_GAIN; reverbParameters.LowEQCutoff = XAUDIO2FX_REVERB_DEFAULT_LOW_EQ_CUTOFF; reverbParameters.HighEQGain = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_GAIN; reverbParameters.HighEQCutoff = XAUDIO2FX_REVERB_DEFAULT_HIGH_EQ_CUTOFF; reverbParameters.RoomFilterFreq = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_FREQ; reverbParameters.RoomFilterMain = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_MAIN; reverbParameters.RoomFilterHF = XAUDIO2FX_REVERB_DEFAULT_ROOM_FILTER_HF; reverbParameters.ReflectionsGain = XAUDIO2FX_REVERB_DEFAULT_REFLECTIONS_GAIN; reverbParameters.ReverbGain = XAUDIO2FX_REVERB_DEFAULT_REVERB_GAIN; reverbParameters.DecayTime = XAUDIO2FX_REVERB_DEFAULT_DECAY_TIME; reverbParameters.Density = XAUDIO2FX_REVERB_DEFAULT_DENSITY; reverbParameters.RoomSize = XAUDIO2FX_REVERB_DEFAULT_ROOM_SIZE; reverbParameters.WetDryMix = XAUDIO2FX_REVERB_DEFAULT_WET_DRY_MIX;
藉由在附加效果的語音上呼叫 SetEffectParameters 函式,將效果參數結構傳遞至效果。
hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
請視需要停用或啟用效果。
您可以隨時使用 DisableEffect 關閉效果。
pVoice->DisableEffect(0);
您可以使用 EnableEffect再次開啟效果。
pVoice->EnableEffect(0);
DisableEffect和EnableEffect的參數會指定鏈結中要啟用或停用的效果。
相關主題