From 249afde5f9363384649fc3993bde9dc26c75df4c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 13 Jul 2017 22:33:13 -0700 Subject: [PATCH] Initialize the default effect after device update --- Alc/ALc.c | 72 ++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/Alc/ALc.c b/Alc/ALc.c index e4b57c45..ece66273 100644 --- a/Alc/ALc.c +++ b/Alc/ALc.c @@ -3617,7 +3617,26 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin ATOMIC_INIT(&ALContext->ActiveAuxSlots, NULL); ALContext->Device = device; - if(DefaultEffect.type != AL_EFFECT_NULL) + if((err=UpdateDeviceParams(device, attrList)) != ALC_NO_ERROR) + { + almtx_unlock(&device->BackendLock); + + al_free(ALContext); + ALContext = NULL; + + alcSetError(device, err); + if(err == ALC_INVALID_DEVICE) + { + V0(device->Backend,lock)(); + aluHandleDisconnect(device); + V0(device->Backend,unlock)(); + } + ALCdevice_DecRef(device); + return NULL; + } + AllocateVoices(ALContext, 256, device->NumAuxSends); + + if(DefaultEffect.type != AL_EFFECT_NULL && device->Type == Playback) { ALContext->DefaultSlot = (ALeffectslot*)(ALContext->_listener_mem + sizeof(ALlistener)); if(InitEffectSlot(ALContext->DefaultSlot) != AL_NO_ERROR) @@ -3635,46 +3654,23 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin ERR("Failed to initialize the default effect\n"); } } - } - - if((err=UpdateDeviceParams(device, attrList)) != ALC_NO_ERROR) - { - almtx_unlock(&device->BackendLock); - - al_free(ALContext->Voices); - ALContext->Voices = NULL; - - al_free(ALContext); - ALContext = NULL; - - alcSetError(device, err); - if(err == ALC_INVALID_DEVICE) + if(ALContext->DefaultSlot) { - V0(device->Backend,lock)(); - aluHandleDisconnect(device); - V0(device->Backend,unlock)(); - } - ALCdevice_DecRef(device); - return NULL; - } - AllocateVoices(ALContext, 256, device->NumAuxSends); + ALeffectslot *slot = ALContext->DefaultSlot; + ALeffectState *state = slot->Effect.State; - if(ALContext->DefaultSlot) - { - ALeffectslot *slot = ALContext->DefaultSlot; - ALeffectState *state = slot->Effect.State; - - START_MIXER_MODE(); - state->OutBuffer = device->Dry.Buffer; - state->OutChannels = device->Dry.NumChannels; - if(V(state,deviceUpdate)(device) != AL_FALSE) - UpdateEffectSlotProps(slot); - else - { - DeinitEffectSlot(ALContext->DefaultSlot); - ALContext->DefaultSlot = NULL; + START_MIXER_MODE(); + state->OutBuffer = device->Dry.Buffer; + state->OutChannels = device->Dry.NumChannels; + if(V(state,deviceUpdate)(device) != AL_FALSE) + UpdateEffectSlotProps(slot); + else + { + DeinitEffectSlot(ALContext->DefaultSlot); + ALContext->DefaultSlot = NULL; + } + END_MIXER_MODE(); } - END_MIXER_MODE(); } ALCdevice_IncRef(ALContext->Device);