From 5b37e2339bc91de3424b51600c3d3b96401d0b9c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 11 Sep 2019 03:59:53 -0700 Subject: Simplify flexible array member usage --- alc/converter.cpp | 11 +++++------ alc/converter.h | 8 +------- alc/hrtf.cpp | 19 ++++--------------- alc/hrtf.h | 4 +--- alc/ringbuffer.cpp | 2 +- alc/ringbuffer.h | 4 +--- common/almalloc.h | 20 ++++++++++++++++++-- 7 files changed, 31 insertions(+), 37 deletions(-) diff --git a/alc/converter.cpp b/alc/converter.cpp index 7e3c17cc..58b59179 100644 --- a/alc/converter.cpp +++ b/alc/converter.cpp @@ -143,14 +143,13 @@ void Stereo2Mono(ALfloat *RESTRICT dst, const void *src, const size_t frames) no } // namespace -SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, ALsizei numchans, - ALsizei srcRate, ALsizei dstRate, Resampler resampler) +SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, size_t numchans, + ALsizei srcRate, ALsizei dstRate, Resampler resampler) { - if(numchans <= 0 || srcRate <= 0 || dstRate <= 0) + if(numchans < 1 || srcRate < 1 || dstRate < 1) return nullptr; - void *ptr{al_calloc(16, SampleConverter::Sizeof(numchans))}; - SampleConverterPtr converter{new (ptr) SampleConverter{static_cast(numchans)}}; + SampleConverterPtr converter{new (FamCount{numchans}) SampleConverter{numchans}}; converter->mSrcType = srcType; converter->mDstType = dstType; converter->mSrcTypeSize = BytesFromDevFmt(srcType); @@ -162,7 +161,7 @@ SampleConverterPtr CreateSampleConverter(DevFmtType srcType, DevFmtType dstType, /* Have to set the mixer FPU mode since that's what the resampler code expects. */ FPUCtl mixer_mode{}; auto step = static_cast( - mind(static_cast(srcRate)/dstRate*FRACTIONONE + 0.5, MAX_PITCH*FRACTIONONE)); + mind(srcRate*ALdouble{FRACTIONONE}/dstRate + 0.5, MAX_PITCH*FRACTIONONE)); converter->mIncrement = maxi(step, 1); if(converter->mIncrement == FRACTIONONE) converter->mResample = Resample_; diff --git a/alc/converter.h b/alc/converter.h index 62f09af1..46e57f10 100644 --- a/alc/converter.h +++ b/alc/converter.h @@ -39,13 +39,7 @@ struct SampleConverter { ALuint convert(const ALvoid **src, ALuint *srcframes, ALvoid *dst, ALuint dstframes); ALuint availableOut(ALuint srcframes) const; - static constexpr size_t Sizeof(size_t length) noexcept - { - return maxz(sizeof(SampleConverter), - al::FlexArray::Sizeof(length, offsetof(SampleConverter, mChan))); - } - - DEF_PLACE_NEWDEL() + DEF_FAM_NEWDEL(SampleConverter, mChan) }; using SampleConverterPtr = std::unique_ptr; diff --git a/alc/hrtf.cpp b/alc/hrtf.cpp index 5a39f686..04818a4f 100644 --- a/alc/hrtf.cpp +++ b/alc/hrtf.cpp @@ -61,22 +61,12 @@ struct HrtfHandle { HrtfHandle(const HrtfHandle&) = delete; HrtfHandle& operator=(const HrtfHandle&) = delete; - static std::unique_ptr Create(size_t fname_len); - static constexpr size_t Sizeof(size_t length) noexcept - { - return maxz(sizeof(HrtfHandle), - al::FlexArray::Sizeof(length, offsetof(HrtfHandle, filename))); - } + static std::unique_ptr Create(size_t fname_len) + { return std::unique_ptr{new (FamCount{fname_len}) HrtfHandle{fname_len}}; } - DEF_PLACE_NEWDEL() + DEF_FAM_NEWDEL(HrtfHandle, filename) }; -std::unique_ptr HrtfHandle::Create(size_t fname_len) -{ - void *ptr{al_calloc(alignof(HrtfHandle), HrtfHandle::Sizeof(fname_len))}; - return std::unique_ptr{new (ptr) HrtfHandle{fname_len}}; -} - namespace { using namespace std::placeholders; @@ -294,8 +284,7 @@ void GetHrtfCoeffs(const HrtfEntry *Hrtf, ALfloat elevation, ALfloat azimuth, AL std::unique_ptr DirectHrtfState::Create(size_t num_chans) { - void *ptr{al_calloc(16, DirectHrtfState::Sizeof(num_chans))}; - return std::unique_ptr{new (ptr) DirectHrtfState{num_chans}}; + return std::unique_ptr{new (FamCount{num_chans}) DirectHrtfState{num_chans}}; } void BuildBFormatHrtf(const HrtfEntry *Hrtf, DirectHrtfState *state, const ALuint NumChannels, diff --git a/alc/hrtf.h b/alc/hrtf.h index 487dca61..85614f2e 100644 --- a/alc/hrtf.h +++ b/alc/hrtf.h @@ -85,10 +85,8 @@ struct DirectHrtfState { DirectHrtfState(size_t numchans) : Coeffs{numchans} { } static std::unique_ptr Create(size_t num_chans); - static constexpr size_t Sizeof(size_t numchans) noexcept - { return al::FlexArray::Sizeof(numchans, offsetof(DirectHrtfState, Coeffs)); } - DEF_PLACE_NEWDEL() + DEF_FAM_NEWDEL(DirectHrtfState, Coeffs) }; struct AngularPoint { diff --git a/alc/ringbuffer.cpp b/alc/ringbuffer.cpp index d99676b8..d61f6129 100644 --- a/alc/ringbuffer.cpp +++ b/alc/ringbuffer.cpp @@ -48,7 +48,7 @@ RingBufferPtr CreateRingBuffer(size_t sz, size_t elem_sz, int limit_writes) if(power_of_two < sz) return nullptr; const size_t bufbytes{power_of_two * elem_sz}; - RingBufferPtr rb{new (al_calloc(16, sizeof(*rb) + bufbytes)) RingBuffer{bufbytes}}; + RingBufferPtr rb{new (FamCount{bufbytes}) RingBuffer{bufbytes}}; rb->mWriteSize = limit_writes ? sz : (power_of_two-1); rb->mSizeMask = power_of_two - 1; rb->mElemSize = elem_sz; diff --git a/alc/ringbuffer.h b/alc/ringbuffer.h index 84139b66..3151fdcb 100644 --- a/alc/ringbuffer.h +++ b/alc/ringbuffer.h @@ -34,8 +34,6 @@ struct RingBuffer { al::FlexArray mBuffer; RingBuffer(const size_t count) : mBuffer{count} { } - RingBuffer(const RingBuffer&) = delete; - RingBuffer& operator=(const RingBuffer&) = delete; /** Reset the read and write pointers to zero. This is not thread safe. */ void reset() noexcept; @@ -84,7 +82,7 @@ struct RingBuffer { /** Advance the write pointer `cnt' places. */ void writeAdvance(size_t cnt) noexcept; - DEF_PLACE_NEWDEL() + DEF_FAM_NEWDEL(RingBuffer, mBuffer) }; using RingBufferPtr = std::unique_ptr; diff --git a/common/almalloc.h b/common/almalloc.h index 785592bd..232294cc 100644 --- a/common/almalloc.h +++ b/common/almalloc.h @@ -27,8 +27,24 @@ void al_free(void *ptr) noexcept; #define DEF_PLACE_NEWDEL() \ void *operator new(size_t /*size*/, void *ptr) noexcept { return ptr; } \ - void operator delete(void *block) noexcept { al_free(block); } \ - void operator delete(void* /*block*/, void* /*ptr*/) noexcept { } + void operator delete(void *block, void*) noexcept { al_free(block); } \ + void operator delete(void *block) noexcept { al_free(block); } + +struct FamCount { size_t mCount; }; + +#define DEF_FAM_NEWDEL(T, FamMem) \ + static constexpr size_t Sizeof(size_t count) noexcept \ + { return decltype(FamMem)::Sizeof(count, offsetof(T, FamMem)); } \ + \ + void *operator new(size_t /*size*/, FamCount fam) \ + { \ + if(void *ret{al_malloc(alignof(T), T::Sizeof(fam.mCount))}) \ + return ret; \ + throw std::bad_alloc(); \ + } \ + void operator delete(void *block, FamCount /*fam*/) { al_free(block); } \ + void operator delete(void *block) noexcept { al_free(block); } + namespace al { -- cgit v1.2.3