共用方式為


如何:建立效果鏈結

本主題說明如何將效果鏈結套用至語音,以允許自定義處理該語音的音訊數據。 本主題描述如何使用殘響效果,這是其中一個內建的 XAudio2 效果。

建立將效果套用至語音的基本效果鏈結

  1. 創造效果。

    在此範例中,XAudio2CreateReverb 函式會建立殘響效果。 如需與 XAudio2 搭配使用的效果來源清單,請參閱 XAudio2 音訊效果

    IUnknown * pXAPO;
    hr = XAudio2CreateReverb(&pXAPO);
    
  2. 使用資料填入 的 XAUDIO2_EFFECT_DESCRIPTOR 結構。

    如果鏈結中有多個效果,則每個效果都需要 XAUDIO2_EFFECT_DESCRIPTOR 結構。

    XAUDIO2_EFFECT_DESCRIPTOR descriptor;
    descriptor.InitialState = true;
    descriptor.OutputChannels = 1;
    descriptor.pEffect = pXAPO;
    
  3. 使用資料填充 XAUDIO2_EFFECT_CHAIN 結構。 在此情況下,鏈條只有一個效果。 如果鏈條具有一個以上的效果,EffectCount 成員將包含效果的數量,而 pEffectDescriptors 成員會指向一個 XAUDIO2_EFFECT_DESCRIPTOR 結構的數組。

    XAUDIO2_EFFECT_CHAIN chain;
    chain.EffectCount = 1;
    chain.pEffectDescriptors = &descriptor;
    
  4. 使用 SetEffectChain 函式,將效果鏈套用至語音。

    您可以將效果鏈結套用至主音、來源聲音和副混音語音。

    pVoice->SetEffectChain(&chain);
    
  5. 使用 IUnknown::Release 釋放效果。

    當您建立 XAPO 時,其參考計數會是 1。 當 XAPO 傳遞至具有 SetEffectChain的 XAudio2 時,XAudio2 會遞增 XAPO 上的參考計數。 釋放用戶端對 XAPO 的參考,可讓 XAudio2 取得 XAPO 的擁有權。 如果 XAudio2 是唯一參考 XAPO 的對象,當 XAPO 不再被 XAudio2 使用時,XAPO 就會被處置。 如果您的客戶端程式代碼需要保留對 XAPO 的引用,例如為了將來重複使用,您應該略過此步驟。

    pXAPO->Release();
    
  6. 如果有任何與效果相關聯的參數結構,請填入該結構。 殘響效果會使用 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;
    
  7. 藉由在附加效果的語音上呼叫 SetEffectParameters 函式,將效果參數結構傳遞至效果。

    hr = pVoice->SetEffectParameters( 0, &reverbParameters, sizeof( reverbParameters ) );
    
  8. 請在適當的時候停用或啟用效果。

    您可以隨時使用 DisableEffect 來關閉效果。

    pVoice->DisableEffect(0);
    

    您可以使用 EnableEffect再次開啟效果。

    pVoice->EnableEffect(0);
    

    DisableEffectEnableEffect 的參數 指定要在效果鏈中啟用或停用哪個效果。

音訊效果

XAudio2 程式設計手冊

如何:建置基本音訊處理圖形

XAPO 概觀

如何:在 XAudio2 中使用 XAOPFX

如何:在 XAudio2 中使用 XAOP