diff options
author | Chris Robinson <[email protected]> | 2018-11-30 16:56:23 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-11-30 16:56:23 -0800 |
commit | 4b7ac4a6ed290182de945274afd90fc4cece0283 (patch) | |
tree | 93cdffafcbd6388bd5fea1bdbf874b92a729b094 | |
parent | 364850e8f9a224144c91c7b562d44321b7aa4505 (diff) |
Don't bother making ALvoiceProps dynamically sized
-rw-r--r-- | Alc/alc.cpp | 30 | ||||
-rw-r--r-- | Alc/alu.cpp | 14 | ||||
-rw-r--r-- | OpenAL32/Include/alSource.h | 1 | ||||
-rw-r--r-- | OpenAL32/Include/alu.h | 24 | ||||
-rw-r--r-- | OpenAL32/alSource.cpp | 4 |
5 files changed, 26 insertions, 47 deletions
diff --git a/Alc/alc.cpp b/Alc/alc.cpp index d8e35d29..4d0dd192 100644 --- a/Alc/alc.cpp +++ b/Alc/alc.cpp @@ -2320,8 +2320,8 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) ALvoiceProps *vprops{context->FreeVoiceProps.exchange(nullptr, std::memory_order_acq_rel)}; while(vprops) { - struct ALvoiceProps *next = vprops->next.load(std::memory_order_relaxed); - al_free(vprops); + ALvoiceProps *next = vprops->next.load(std::memory_order_relaxed); + delete vprops; vprops = next; } @@ -2330,7 +2330,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) std::for_each(context->Voices, voices_end, [device](ALvoice *voice) -> void { - al_free(voice->Update.exchange(nullptr, std::memory_order_acq_rel)); + delete voice->Update.exchange(nullptr, std::memory_order_acq_rel); if(voice->SourceID.load(std::memory_order_acquire) == 0u) return; @@ -2615,7 +2615,7 @@ ALCcontext_struct::~ALCcontext_struct() while(vprops) { ALvoiceProps *next{vprops->next.load(std::memory_order_relaxed)}; - al_free(vprops); + delete vprops; vprops = next; ++count; } @@ -2780,15 +2780,10 @@ void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends) * chunk. */ size_t sizeof_voice{RoundUp(FAM_SIZE(ALvoice, Send, num_sends), 16)}; - size_t sizeof_props{RoundUp(FAM_SIZE(struct ALvoiceProps, Send, num_sends), 16)}; - size_t size{sizeof(ALvoice*) + sizeof_voice + sizeof_props}; + size_t size{sizeof(ALvoice*) + sizeof_voice}; auto voices = static_cast<ALvoice**>(al_calloc(16, RoundUp(size*num_voices, 16))); - /* The voice and property objects are stored interleaved since they're - * paired together. - */ auto voice = reinterpret_cast<ALvoice*>((char*)voices + RoundUp(num_voices*sizeof(ALvoice*), 16)); - auto props = reinterpret_cast<ALvoiceProps*>((char*)voice + sizeof_voice); ALsizei v{0}; if(context->Voices) @@ -2806,17 +2801,12 @@ void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends) */ memcpy(voice, old_voice, sizeof(*voice)); std::copy_n(old_voice->Send, s_count, voice->Send); - - memcpy(props, old_voice->Props, sizeof(*props)); - std::copy_n(old_voice->Props->Send, s_count, props->Send); - /* Set this voice's property set pointer and voice reference. */ - voice->Props = props; + /* Set this voice's reference. */ voices[v] = voice; - /* Increment pointers to the next storage space. */ - voice = reinterpret_cast<ALvoice*>((char*)props + sizeof_props); - props = reinterpret_cast<ALvoiceProps*>((char*)voice + sizeof_voice); + /* Increment pointer to the next storage space. */ + voice = reinterpret_cast<ALvoice*>((char*)voice + sizeof_voice); } /* Deinit any left over voices that weren't copied over to the new * array. NOTE: If this does anything, v equals num_voices and @@ -2833,11 +2823,9 @@ void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends) { voice->Update.store(nullptr, std::memory_order_relaxed); - voice->Props = props; voices[v] = voice; - voice = reinterpret_cast<ALvoice*>((char*)props + sizeof_props); - props = reinterpret_cast<ALvoiceProps*>((char*)voice + sizeof_voice); + voice = reinterpret_cast<ALvoice*>((char*)voice + sizeof_voice); } al_free(context->Voices); diff --git a/Alc/alu.cpp b/Alc/alu.cpp index 607798ba..0dec32bc 100644 --- a/Alc/alu.cpp +++ b/Alc/alu.cpp @@ -101,7 +101,7 @@ void aluInit(void) void DeinitVoice(ALvoice *voice) noexcept { - al_free(voice->Update.exchange(nullptr)); + delete voice->Update.exchange(nullptr, std::memory_order_acq_rel); } @@ -505,7 +505,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev const ALfloat DryGainLF, const ALfloat *WetGain, const ALfloat *WetGainLF, const ALfloat *WetGainHF, ALeffectslot **SendSlots, const ALbuffer *Buffer, - const struct ALvoiceProps *props, const ALlistener &Listener, + const ALvoiceProps *props, const ALlistener &Listener, const ALCdevice *Device) { struct ChanMap StereoMap[2] = { @@ -1023,7 +1023,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev } } -void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) +void CalcNonAttnSourceParams(ALvoice *voice, const ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) { const ALCdevice *Device = ALContext->Device; const ALlistener &Listener = ALContext->Listener; @@ -1086,7 +1086,7 @@ void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, c WetGainLF, WetGainHF, SendSlots, ALBuffer, props, Listener, Device); } -void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) +void CalcAttnSourceParams(ALvoice *voice, const ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) { const ALCdevice *Device = ALContext->Device; const ALlistener &Listener = ALContext->Listener; @@ -1461,13 +1461,11 @@ void CalcSourceParams(ALvoice *voice, ALCcontext *context, bool force) if(props) { - memcpy(voice->Props, props, - FAM_SIZE(struct ALvoiceProps, Send, context->Device->NumAuxSends) - ); + memcpy(&voice->Props, props, FAM_SIZE(ALvoiceProps, Send, context->Device->NumAuxSends)); AtomicReplaceHead(context->FreeVoiceProps, props); } - props = voice->Props; + props = &voice->Props; ALbufferlistitem *BufferListItem{voice->current_buffer.load(std::memory_order_relaxed)}; while(BufferListItem) diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h index 2cbc5ddc..62c6fae3 100644 --- a/OpenAL32/Include/alSource.h +++ b/OpenAL32/Include/alSource.h @@ -7,7 +7,6 @@ #include "almalloc.h" #include "atomic.h" -#define MAX_SENDS 16 #define DEFAULT_SENDS 2 #ifdef __cplusplus diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index e178a5a6..2ff69058 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -17,11 +17,13 @@ #include "math_defs.h" #include "filters/defs.h" #include "filters/nfc.h" +#include "almalloc.h" enum class DistanceModel; -#define MAX_PITCH (255) +#define MAX_PITCH 255 +#define MAX_SENDS 16 /* Maximum number of samples to pad on either end of a buffer for resampling. * Note that both the beginning and end need padding! @@ -29,10 +31,6 @@ enum class DistanceModel; #define MAX_RESAMPLE_PADDING 24 -#ifdef __cplusplus -extern "C" { -#endif - struct BSincTable; struct ALsource; struct ALbufferlistitem; @@ -144,8 +142,6 @@ typedef struct SendParams { struct ALvoiceProps { - std::atomic<ALvoiceProps*> next; - ALfloat Pitch; ALfloat Gain; ALfloat OuterGain; @@ -194,7 +190,11 @@ struct ALvoiceProps { ALfloat HFReference; ALfloat GainLF; ALfloat LFReference; - } Send[]; + } Send[MAX_SENDS]; + + std::atomic<ALvoiceProps*> next; + + DEF_NEWDEL(ALvoiceProps) }; #define VOICE_IS_STATIC (1<<0) @@ -203,13 +203,13 @@ struct ALvoiceProps { #define VOICE_HAS_NFC (1<<3) typedef struct ALvoice { - ALvoiceProps *Props; - std::atomic<ALvoiceProps*> Update; std::atomic<ALuint> SourceID; std::atomic<bool> Playing; + ALvoiceProps Props; + /** * Source offset in samples, relative to the currently playing buffer, NOT * the whole queue, and the fractional (fixed-point) offset to the next @@ -487,8 +487,4 @@ extern ALfloat ConeScale; extern ALfloat ZScale; extern ALboolean OverrideReverbSpeedOfSound; -#ifdef __cplusplus -} -#endif - #endif diff --git a/OpenAL32/alSource.cpp b/OpenAL32/alSource.cpp index c0e48c5c..87729c73 100644 --- a/OpenAL32/alSource.cpp +++ b/OpenAL32/alSource.cpp @@ -68,9 +68,7 @@ void UpdateSourceProps(ALsource *source, ALvoice *voice, ALCcontext *context) /* Get an unused property container, or allocate a new one as needed. */ ALvoiceProps *props{context->FreeVoiceProps.load(std::memory_order_acquire)}; if(!props) - props = static_cast<ALvoiceProps*>(al_calloc(16, - FAM_SIZE(ALvoiceProps, Send, source->Send.size())) - ); + props = new ALvoiceProps{}; else { ALvoiceProps *next; |