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