Руководство: создание цепи эффектов

В этом разделе показано, как применить цепочку эффектов к голосу, чтобы разрешить пользовательскую обработку звуковых данных для этого голоса. В этом разделе описывается использование эффекта реверберации, который является одним из встроенных эффектов 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 .

    Цепочки эффектов можно применять к master голосам, исходным голосам и голосам подмиксов.

    pVoice->SetEffectChain(&chain);
    
  5. Опубликуйте эффект с помощью IUnknown::Release.

    При создании XAPO число ссылок будет иметь значение 1. Когда XAPO передается в XAudio2 с помощью SetEffectChain, 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);
    

    Параметры DisableEffect и EnableEffect указывают, какой эффект в цепочке следует включить или отключить.

Звуковые эффекты

Руководство по программированию для XAudio2

Руководство: создание базовой схемы обработки звука

Обзор протокола XAPO

Практическое руководство. Использование XAOPFX в XAudio2

Практическое руководство. Использование XAOP в XAudio2