如何:创建效果链

本主题说明如何将效果链应用于语音,以允许自定义处理该语音的音频数据。 本主题介绍如何使用混响效果,该效果是内置的 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 的唯一引用,则在 XAudio2 不再使用它时将释放它。 如果客户端代码需要维护对 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