aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-12-29 03:39:58 -0800
committerChris Robinson <[email protected]>2023-12-29 03:39:58 -0800
commit10ecdff7d1dfcc16bd2a090f089781310ea9a93d (patch)
treeecd0f09a18f211ca7df2120e7c998aa037f5dfe4
parent768781bab97732fbd0d66fa153d4ebc768be1240 (diff)
Handle pointer ownership a bit better
-rw-r--r--al/auxeffectslot.cpp30
-rw-r--r--al/buffer.cpp10
-rw-r--r--al/effect.cpp10
-rw-r--r--al/filter.cpp10
-rw-r--r--al/source.cpp15
-rw-r--r--alc/alc.cpp46
-rw-r--r--alc/backends/wave.cpp6
-rw-r--r--alc/context.cpp4
-rw-r--r--alc/context.h5
-rw-r--r--alc/device.h7
-rw-r--r--core/mastering.cpp13
-rw-r--r--utils/alsoft-config/mainwindow.cpp16
-rw-r--r--utils/makemhr/makemhr.cpp31
-rw-r--r--utils/uhjdecoder.cpp3
14 files changed, 115 insertions, 91 deletions
diff --git a/al/auxeffectslot.cpp b/al/auxeffectslot.cpp
index ea41a842..695c5788 100644
--- a/al/auxeffectslot.cpp
+++ b/al/auxeffectslot.cpp
@@ -96,7 +96,7 @@ inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) noexcept
EffectSlotSubList &sublist{context->mEffectSlotList[lidx]};
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.EffectSlots + slidx;
+ return al::to_address(sublist.EffectSlots->begin() + slidx);
}
inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) noexcept
@@ -109,7 +109,7 @@ inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) noexcept
EffectSubList &sublist = device->EffectList[lidx];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Effects + slidx;
+ return al::to_address(sublist.Effects->begin() + slidx);
}
inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) noexcept
@@ -122,7 +122,7 @@ inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) noexcept
BufferSubList &sublist = device->BufferList[lidx];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Buffers + slidx;
+ return al::to_address(sublist.Buffers->begin() + slidx);
}
@@ -246,8 +246,8 @@ bool EnsureEffectSlots(ALCcontext *context, size_t needed)
context->mEffectSlotList.emplace_back();
auto sublist = context->mEffectSlotList.end() - 1;
sublist->FreeMask = ~0_u64;
- sublist->EffectSlots = static_cast<gsl::owner<ALeffectslot*>>(
- al_calloc(alignof(ALeffectslot), sizeof(ALeffectslot)*64));
+ sublist->EffectSlots = static_cast<gsl::owner<std::array<ALeffectslot,64>*>>(
+ al_calloc(alignof(ALeffectslot), sizeof(*sublist->EffectSlots)));
if(!sublist->EffectSlots) UNLIKELY
{
context->mEffectSlotList.pop_back();
@@ -267,7 +267,8 @@ ALeffectslot *AllocEffectSlot(ALCcontext *context)
auto slidx = static_cast<ALuint>(al::countr_zero(sublist->FreeMask));
ASSUME(slidx < 64);
- ALeffectslot *slot{al::construct_at(sublist->EffectSlots + slidx, context)};
+ ALeffectslot *slot{al::construct_at(al::to_address(sublist->EffectSlots->begin() + slidx),
+ context)};
aluInitEffectPanning(slot->mSlot, context);
/* Add 1 to avoid ID 0. */
@@ -875,12 +876,9 @@ ALeffectslot::~ALeffectslot()
DecrementRef(Buffer->ref);
Buffer = nullptr;
- if(EffectSlotProps *props{mSlot->Update.exchange(nullptr)})
- {
+ if(std::unique_ptr<EffectSlotProps> props{mSlot->Update.exchange(nullptr)})
TRACE("Freed unapplied AuxiliaryEffectSlot update %p\n",
- decltype(std::declval<void*>()){props});
- delete props;
- }
+ decltype(std::declval<void*>()){props.get()});
mSlot->mEffectState = nullptr;
mSlot->InUse = false;
@@ -983,12 +981,12 @@ void UpdateAllEffectSlotProps(ALCcontext *context)
uint64_t usemask{~sublist.FreeMask};
while(usemask)
{
- const int idx{al::countr_zero(usemask)};
+ const auto idx = static_cast<uint>(al::countr_zero(usemask));
usemask &= ~(1_u64 << idx);
- ALeffectslot *slot{sublist.EffectSlots + idx};
+ auto &slot = (*sublist.EffectSlots)[idx];
- if(slot->mState != SlotState::Stopped && std::exchange(slot->mPropsDirty, false))
- slot->updateProps(context);
+ if(slot.mState != SlotState::Stopped && std::exchange(slot.mPropsDirty, false))
+ slot.updateProps(context);
}
}
}
@@ -1002,7 +1000,7 @@ EffectSlotSubList::~EffectSlotSubList()
while(usemask)
{
const int idx{al::countr_zero(usemask)};
- std::destroy_at(EffectSlots+idx);
+ std::destroy_at(al::to_address(EffectSlots->begin() + idx));
usemask &= ~(1_u64 << idx);
}
FreeMask = ~usemask;
diff --git a/al/buffer.cpp b/al/buffer.cpp
index c0f3f348..46ef8ece 100644
--- a/al/buffer.cpp
+++ b/al/buffer.cpp
@@ -186,8 +186,8 @@ bool EnsureBuffers(ALCdevice *device, size_t needed)
device->BufferList.emplace_back();
auto sublist = device->BufferList.end() - 1;
sublist->FreeMask = ~0_u64;
- sublist->Buffers = static_cast<gsl::owner<ALbuffer*>>(al_calloc(alignof(ALbuffer),
- sizeof(ALbuffer)*64));
+ sublist->Buffers = static_cast<gsl::owner<std::array<ALbuffer,64>*>>(al_calloc(
+ alignof(ALbuffer), sizeof(*sublist->Buffers)));
if(!sublist->Buffers) UNLIKELY
{
device->BufferList.pop_back();
@@ -207,7 +207,7 @@ ALbuffer *AllocBuffer(ALCdevice *device)
auto slidx = static_cast<ALuint>(al::countr_zero(sublist->FreeMask));
ASSUME(slidx < 64);
- ALbuffer *buffer{al::construct_at(sublist->Buffers + slidx)};
+ ALbuffer *buffer{al::construct_at(al::to_address(sublist->Buffers->begin() + slidx))};
/* Add 1 to avoid buffer ID 0. */
buffer->id = ((lidx<<6) | slidx) + 1;
@@ -244,7 +244,7 @@ inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id)
BufferSubList &sublist = device->BufferList[lidx];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Buffers + slidx;
+ return al::to_address(sublist.Buffers->begin() + slidx);
}
@@ -1486,7 +1486,7 @@ BufferSubList::~BufferSubList()
while(usemask)
{
const int idx{al::countr_zero(usemask)};
- std::destroy_at(Buffers+idx);
+ std::destroy_at(al::to_address(Buffers->begin() + idx));
usemask &= ~(1_u64 << idx);
}
FreeMask = ~usemask;
diff --git a/al/effect.cpp b/al/effect.cpp
index c2a2d1b1..1024de80 100644
--- a/al/effect.cpp
+++ b/al/effect.cpp
@@ -134,8 +134,8 @@ bool EnsureEffects(ALCdevice *device, size_t needed)
device->EffectList.emplace_back();
auto sublist = device->EffectList.end() - 1;
sublist->FreeMask = ~0_u64;
- sublist->Effects = static_cast<gsl::owner<ALeffect*>>(al_calloc(alignof(ALeffect),
- sizeof(ALeffect)*64));
+ sublist->Effects = static_cast<gsl::owner<std::array<ALeffect,64>*>>(al_calloc(
+ alignof(ALeffect), sizeof(*sublist->Effects)));
if(!sublist->Effects) UNLIKELY
{
device->EffectList.pop_back();
@@ -155,7 +155,7 @@ ALeffect *AllocEffect(ALCdevice *device)
auto slidx = static_cast<ALuint>(al::countr_zero(sublist->FreeMask));
ASSUME(slidx < 64);
- ALeffect *effect{al::construct_at(sublist->Effects + slidx)};
+ ALeffect *effect{al::construct_at(al::to_address(sublist->Effects->begin() + slidx))};
InitEffectParams(effect, AL_EFFECT_NULL);
/* Add 1 to avoid effect ID 0. */
@@ -189,7 +189,7 @@ inline ALeffect *LookupEffect(ALCdevice *device, ALuint id)
EffectSubList &sublist = device->EffectList[lidx];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Effects + slidx;
+ return al::to_address(sublist.Effects->begin() + slidx);
}
} // namespace
@@ -568,7 +568,7 @@ EffectSubList::~EffectSubList()
while(usemask)
{
const int idx{al::countr_zero(usemask)};
- std::destroy_at(Effects+idx);
+ std::destroy_at(al::to_address(Effects->begin()+idx));
usemask &= ~(1_u64 << idx);
}
FreeMask = ~usemask;
diff --git a/al/filter.cpp b/al/filter.cpp
index ce37b0aa..4a24a38f 100644
--- a/al/filter.cpp
+++ b/al/filter.cpp
@@ -129,8 +129,8 @@ bool EnsureFilters(ALCdevice *device, size_t needed)
device->FilterList.emplace_back();
auto sublist = device->FilterList.end() - 1;
sublist->FreeMask = ~0_u64;
- sublist->Filters = static_cast<gsl::owner<ALfilter*>>(al_calloc(alignof(ALfilter),
- sizeof(ALfilter)*64));
+ sublist->Filters = static_cast<gsl::owner<std::array<ALfilter,64>*>>(al_calloc(
+ alignof(ALfilter), sizeof(*sublist->Filters)));
if(!sublist->Filters) UNLIKELY
{
device->FilterList.pop_back();
@@ -151,7 +151,7 @@ ALfilter *AllocFilter(ALCdevice *device)
auto slidx = static_cast<ALuint>(al::countr_zero(sublist->FreeMask));
ASSUME(slidx < 64);
- ALfilter *filter{al::construct_at(sublist->Filters + slidx)};
+ ALfilter *filter{al::construct_at(al::to_address(sublist->Filters->begin() + slidx))};
InitFilterParams(filter, AL_FILTER_NULL);
/* Add 1 to avoid filter ID 0. */
@@ -186,7 +186,7 @@ inline ALfilter *LookupFilter(ALCdevice *device, ALuint id)
FilterSubList &sublist = device->FilterList[lidx];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Filters + slidx;
+ return al::to_address(sublist.Filters->begin() + slidx);
}
} // namespace
@@ -696,7 +696,7 @@ FilterSubList::~FilterSubList()
while(usemask)
{
const int idx{al::countr_zero(usemask)};
- std::destroy_at(Filters+idx);
+ std::destroy_at(al::to_address(Filters->begin() + idx));
usemask &= ~(1_u64 << idx);
}
FreeMask = ~usemask;
diff --git a/al/source.cpp b/al/source.cpp
index bf96a769..1ac3bf28 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -729,7 +729,8 @@ bool EnsureSources(ALCcontext *context, size_t needed)
context->mSourceList.emplace_back();
auto sublist = context->mSourceList.end() - 1;
sublist->FreeMask = ~0_u64;
- sublist->Sources = static_cast<ALsource*>(al_calloc(alignof(ALsource), sizeof(ALsource)*64));
+ sublist->Sources = static_cast<gsl::owner<std::array<ALsource,64>*>>(al_calloc(
+ alignof(ALsource), sizeof(*sublist->Sources)));
if(!sublist->Sources) UNLIKELY
{
context->mSourceList.pop_back();
@@ -749,7 +750,7 @@ ALsource *AllocSource(ALCcontext *context)
auto slidx = static_cast<ALuint>(al::countr_zero(sublist->FreeMask));
ASSUME(slidx < 64);
- ALsource *source{al::construct_at(sublist->Sources + slidx)};
+ ALsource *source{al::construct_at(al::to_address(sublist->Sources->begin() + slidx))};
/* Add 1 to avoid source ID 0. */
source->id = ((lidx<<6) | slidx) + 1;
@@ -797,7 +798,7 @@ inline ALsource *LookupSource(ALCcontext *context, ALuint id) noexcept
SourceSubList &sublist{context->mSourceList[lidx]};
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Sources + slidx;
+ return al::to_address(sublist.Sources->begin() + slidx);
}
auto LookupBuffer = [](ALCdevice *device, auto id) noexcept -> ALbuffer*
@@ -810,7 +811,7 @@ auto LookupBuffer = [](ALCdevice *device, auto id) noexcept -> ALbuffer*
BufferSubList &sublist = device->BufferList[static_cast<size_t>(lidx)];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Buffers + static_cast<size_t>(slidx);
+ return al::to_address(sublist.Buffers->begin() + static_cast<size_t>(slidx));
};
auto LookupFilter = [](ALCdevice *device, auto id) noexcept -> ALfilter*
@@ -823,7 +824,7 @@ auto LookupFilter = [](ALCdevice *device, auto id) noexcept -> ALfilter*
FilterSubList &sublist = device->FilterList[static_cast<size_t>(lidx)];
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.Filters + static_cast<size_t>(slidx);
+ return al::to_address(sublist.Filters->begin() + static_cast<size_t>(slidx));
};
auto LookupEffectSlot = [](ALCcontext *context, auto id) noexcept -> ALeffectslot*
@@ -836,7 +837,7 @@ auto LookupEffectSlot = [](ALCcontext *context, auto id) noexcept -> ALeffectslo
EffectSlotSubList &sublist{context->mEffectSlotList[static_cast<size_t>(lidx)]};
if(sublist.FreeMask & (1_u64 << slidx)) UNLIKELY
return nullptr;
- return sublist.EffectSlots + static_cast<size_t>(slidx);
+ return al::to_address(sublist.EffectSlots->begin() + static_cast<size_t>(slidx));
};
@@ -3639,7 +3640,7 @@ SourceSubList::~SourceSubList()
{
const int idx{al::countr_zero(usemask)};
usemask &= ~(1_u64 << idx);
- std::destroy_at(Sources+idx);
+ std::destroy_at(al::to_address(Sources->begin() + idx));
}
FreeMask = ~usemask;
al_free(Sources);
diff --git a/alc/alc.cpp b/alc/alc.cpp
index 64b77080..ece65430 100644
--- a/alc/alc.cpp
+++ b/alc/alc.cpp
@@ -1682,16 +1682,16 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
uint64_t usemask{~sublist.FreeMask};
while(usemask)
{
- const int idx{al::countr_zero(usemask)};
- ALeffectslot *slot{sublist.EffectSlots + idx};
+ const auto idx = static_cast<uint>(al::countr_zero(usemask));
+ auto &slot = (*sublist.EffectSlots)[idx];
usemask &= ~(1_u64 << idx);
- aluInitEffectPanning(slot->mSlot, context);
+ aluInitEffectPanning(slot.mSlot, context);
- EffectState *state{slot->Effect.State.get()};
+ EffectState *state{slot.Effect.State.get()};
state->mOutTarget = device->Dry.Buffer;
- state->deviceUpdate(device, slot->Buffer);
- slot->updateProps(context);
+ state->deviceUpdate(device, slot.Buffer);
+ slot.updateProps(context);
}
}
slotlock.unlock();
@@ -1703,8 +1703,8 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
uint64_t usemask{~sublist.FreeMask};
while(usemask)
{
- const int idx{al::countr_zero(usemask)};
- ALsource *source{sublist.Sources + idx};
+ const auto idx = static_cast<uint>(al::countr_zero(usemask));
+ auto &source = (*sublist.Sources)[idx];
usemask &= ~(1_u64 << idx);
auto clear_send = [](ALsource::SendData &send) -> void
@@ -1718,10 +1718,10 @@ ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList)
send.GainLF = 1.0f;
send.LFReference = HIGHPASSFREQREF;
};
- auto send_begin = source->Send.begin() + static_cast<ptrdiff_t>(num_sends);
- std::for_each(send_begin, source->Send.end(), clear_send);
+ auto send_begin = source.Send.begin() + static_cast<ptrdiff_t>(num_sends);
+ std::for_each(send_begin, source.Send.end(), clear_send);
- source->mPropsDirty = true;
+ source.mPropsDirty = true;
}
}
@@ -2905,7 +2905,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) noexcep
uint{DefaultSendCount}
};
- DeviceRef device{new ALCdevice{DeviceType::Playback}};
+ DeviceRef device{new(std::nothrow) ALCdevice{DeviceType::Playback}};
+ if(!device)
+ {
+ WARN("Failed to create playback device handle\n");
+ alcSetError(nullptr, ALC_OUT_OF_MEMORY);
+ return nullptr;
+ }
/* Set output format */
device->FmtChans = DevFmtChannelsDefault;
@@ -3040,7 +3046,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
else
TRACE("Opening default capture device\n");
- DeviceRef device{new ALCdevice{DeviceType::Capture}};
+ DeviceRef device{new(std::nothrow) ALCdevice{DeviceType::Capture}};
+ if(!device)
+ {
+ WARN("Failed to create capture device handle\n");
+ alcSetError(nullptr, ALC_OUT_OF_MEMORY);
+ return nullptr;
+ }
auto decompfmt = DecomposeDevFormat(format);
if(!decompfmt)
@@ -3220,7 +3232,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
uint{DefaultSendCount}
};
- DeviceRef device{new ALCdevice{DeviceType::Loopback}};
+ DeviceRef device{new(std::nothrow) ALCdevice{DeviceType::Loopback}};
+ if(!device)
+ {
+ WARN("Failed to create loopback device handle\n");
+ alcSetError(nullptr, ALC_OUT_OF_MEMORY);
+ return nullptr;
+ }
device->SourcesMax = 256;
device->AuxiliaryEffectSlotMax = 64;
diff --git a/alc/backends/wave.cpp b/alc/backends/wave.cpp
index 60cebd7f..985bb539 100644
--- a/alc/backends/wave.cpp
+++ b/alc/backends/wave.cpp
@@ -56,7 +56,7 @@ using ubyte = unsigned char;
using ushort = unsigned short;
struct FileDeleter {
- void operator()(FILE *f) { fclose(f); }
+ void operator()(gsl::owner<FILE*> f) { fclose(f); }
};
using FilePtr = std::unique_ptr<FILE,FileDeleter>;
@@ -211,10 +211,10 @@ void WaveBackend::open(std::string_view name)
#ifdef _WIN32
{
std::wstring wname{utf8_to_wstr(fname.value())};
- mFile.reset(_wfopen(wname.c_str(), L"wb"));
+ mFile = FilePtr{_wfopen(wname.c_str(), L"wb")};
}
#else
- mFile.reset(fopen(fname->c_str(), "wb"));
+ mFile = FilePtr{fopen(fname->c_str(), "wb")};
#endif
if(!mFile)
throw al::backend_exception{al::backend_error::DeviceError, "Could not open file '%s': %s",
diff --git a/alc/context.cpp b/alc/context.cpp
index b5db03f9..0f6dbbae 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -338,10 +338,10 @@ void ForEachSource(ALCcontext *context, F func)
uint64_t usemask{~sublist.FreeMask};
while(usemask)
{
- const int idx{al::countr_zero(usemask)};
+ const auto idx = static_cast<uint>(al::countr_zero(usemask));
usemask &= ~(1_u64 << idx);
- func(sublist.Sources[idx]);
+ func((*sublist.Sources)[idx]);
}
}
}
diff --git a/alc/context.h b/alc/context.h
index d5e5e78b..d033c08e 100644
--- a/alc/context.h
+++ b/alc/context.h
@@ -1,6 +1,7 @@
#ifndef ALC_CONTEXT_H
#define ALC_CONTEXT_H
+#include <array>
#include <atomic>
#include <deque>
#include <memory>
@@ -70,7 +71,7 @@ struct DebugLogEntry {
struct SourceSubList {
uint64_t FreeMask{~0_u64};
- gsl::owner<ALsource*> Sources{nullptr}; /* 64 */
+ gsl::owner<std::array<ALsource,64>*> Sources{nullptr};
SourceSubList() noexcept = default;
SourceSubList(const SourceSubList&) = delete;
@@ -85,7 +86,7 @@ struct SourceSubList {
struct EffectSlotSubList {
uint64_t FreeMask{~0_u64};
- gsl::owner<ALeffectslot*> EffectSlots{nullptr}; /* 64 */
+ gsl::owner<std::array<ALeffectslot,64>*> EffectSlots{nullptr};
EffectSlotSubList() noexcept = default;
EffectSlotSubList(const EffectSlotSubList&) = delete;
diff --git a/alc/device.h b/alc/device.h
index e5e9b3d2..fe9dff67 100644
--- a/alc/device.h
+++ b/alc/device.h
@@ -1,6 +1,7 @@
#ifndef ALC_DEVICE_H
#define ALC_DEVICE_H
+#include <array>
#include <atomic>
#include <memory>
#include <mutex>
@@ -35,7 +36,7 @@ using uint = unsigned int;
struct BufferSubList {
uint64_t FreeMask{~0_u64};
- gsl::owner<ALbuffer*> Buffers{nullptr}; /* 64 */
+ gsl::owner<std::array<ALbuffer,64>*> Buffers{nullptr};
BufferSubList() noexcept = default;
BufferSubList(const BufferSubList&) = delete;
@@ -50,7 +51,7 @@ struct BufferSubList {
struct EffectSubList {
uint64_t FreeMask{~0_u64};
- gsl::owner<ALeffect*> Effects{nullptr}; /* 64 */
+ gsl::owner<std::array<ALeffect,64>*> Effects{nullptr}; /* 64 */
EffectSubList() noexcept = default;
EffectSubList(const EffectSubList&) = delete;
@@ -65,7 +66,7 @@ struct EffectSubList {
struct FilterSubList {
uint64_t FreeMask{~0_u64};
- gsl::owner<ALfilter*> Filters{nullptr}; /* 64 */
+ gsl::owner<std::array<ALfilter,64>*> Filters{nullptr};
FilterSubList() noexcept = default;
FilterSubList(const FilterSubList&) = delete;
diff --git a/core/mastering.cpp b/core/mastering.cpp
index e9b079d6..5fecdb3f 100644
--- a/core/mastering.cpp
+++ b/core/mastering.cpp
@@ -318,10 +318,10 @@ std::unique_ptr<Compressor> Compressor::Create(const size_t NumChans, const floa
const float PostGainDb, const float ThresholdDb, const float Ratio, const float KneeDb,
const float AttackTime, const float ReleaseTime)
{
- const auto lookAhead = static_cast<uint>(
- clampf(std::round(LookAheadTime*SampleRate), 0.0f, BufferLineSize-1));
- const auto hold = static_cast<uint>(
- clampf(std::round(HoldTime*SampleRate), 0.0f, BufferLineSize-1));
+ const auto lookAhead = static_cast<uint>(clampf(std::round(LookAheadTime*SampleRate), 0.0f,
+ BufferLineSize-1));
+ const auto hold = static_cast<uint>(clampf(std::round(HoldTime*SampleRate), 0.0f,
+ BufferLineSize-1));
size_t size{sizeof(Compressor)};
if(lookAhead > 0)
@@ -335,7 +335,10 @@ std::unique_ptr<Compressor> Compressor::Create(const size_t NumChans, const floa
size += sizeof(*Compressor::mHold);
}
- auto Comp = CompressorPtr{al::construct_at(static_cast<Compressor*>(al_calloc(16, size)))};
+ gsl::owner<void*> storage{al_calloc(16, size)};
+ if(!storage) throw std::bad_alloc{};
+
+ auto Comp = CompressorPtr{::new(storage) Compressor{}};
Comp->mNumChans = NumChans;
Comp->mAuto.Knee = AutoKnee;
Comp->mAuto.Attack = AutoAttack;
diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp
index b2412c73..9a65f79c 100644
--- a/utils/alsoft-config/mainwindow.cpp
+++ b/utils/alsoft-config/mainwindow.cpp
@@ -20,6 +20,7 @@
#include <shlobj.h>
#endif
+#include "almalloc.h"
#include "alspan.h"
namespace {
@@ -1283,11 +1284,10 @@ void MainWindow::addHrtfFile()
void MainWindow::removeHrtfFile()
{
- QList<QListWidgetItem*> selected{ui->hrtfFileList->selectedItems()};
+ QList<gsl::owner<QListWidgetItem*>> selected{ui->hrtfFileList->selectedItems()};
if(!selected.isEmpty())
{
- foreach(QListWidgetItem *item, selected)
- delete item;
+ std::for_each(selected.begin(), selected.end(), std::default_delete<QListWidgetItem>{});
enableApplyButton();
}
}
@@ -1321,9 +1321,8 @@ void MainWindow::showEnabledBackendMenu(QPoint pt)
QAction *gotAction{ctxmenu.exec(pt)};
if(gotAction == removeAction)
{
- QList<QListWidgetItem*> selected{ui->enabledBackendList->selectedItems()};
- foreach(QListWidgetItem *item, selected)
- delete item;
+ QList<gsl::owner<QListWidgetItem*>> selected{ui->enabledBackendList->selectedItems()};
+ std::for_each(selected.begin(), selected.end(), std::default_delete<QListWidgetItem>{});
enableApplyButton();
}
else if(gotAction != nullptr)
@@ -1359,9 +1358,8 @@ void MainWindow::showDisabledBackendMenu(QPoint pt)
QAction *gotAction{ctxmenu.exec(pt)};
if(gotAction == removeAction)
{
- QList<QListWidgetItem*> selected{ui->disabledBackendList->selectedItems()};
- foreach(QListWidgetItem *item, selected)
- delete item;
+ QList<gsl::owner<QListWidgetItem*>> selected{ui->disabledBackendList->selectedItems()};
+ std::for_each(selected.begin(), selected.end(), std::default_delete<QListWidgetItem>{});
enableApplyButton();
}
else if(gotAction != nullptr)
diff --git a/utils/makemhr/makemhr.cpp b/utils/makemhr/makemhr.cpp
index f14110c0..0a9b71e7 100644
--- a/utils/makemhr/makemhr.cpp
+++ b/utils/makemhr/makemhr.cpp
@@ -104,6 +104,11 @@ HrirDataT::~HrirDataT() = default;
namespace {
+struct FileDeleter {
+ void operator()(gsl::owner<FILE*> f) { fclose(f); }
+};
+using FilePtr = std::unique_ptr<FILE,FileDeleter>;
+
using namespace std::placeholders;
// The epsilon used to maintain signal stability.
@@ -312,7 +317,6 @@ static int WriteAscii(const char *out, FILE *fp, const char *filename)
len = strlen(out);
if(fwrite(out, 1, len, fp) != len)
{
- fclose(fp);
fprintf(stderr, "\nError: Bad write to file '%s'.\n", filename);
return 0;
}
@@ -343,33 +347,33 @@ static int StoreMhr(const HrirDataT *hData, const char *filename)
uint dither_seed{22222};
uint fi, ei, ai, i;
- FILE *fp{fopen(filename, "wb")};
+ FilePtr fp{fopen(filename, "wb")};
if(!fp)
{
fprintf(stderr, "\nError: Could not open MHR file '%s'.\n", filename);
return 0;
}
- if(!WriteAscii(MHRFormat, fp, filename))
+ if(!WriteAscii(MHRFormat, fp.get(), filename))
return 0;
- if(!WriteBin4(4, hData->mIrRate, fp, filename))
+ if(!WriteBin4(4, hData->mIrRate, fp.get(), filename))
return 0;
- if(!WriteBin4(1, static_cast<uint32_t>(hData->mChannelType), fp, filename))
+ if(!WriteBin4(1, static_cast<uint32_t>(hData->mChannelType), fp.get(), filename))
return 0;
- if(!WriteBin4(1, hData->mIrPoints, fp, filename))
+ if(!WriteBin4(1, hData->mIrPoints, fp.get(), filename))
return 0;
- if(!WriteBin4(1, static_cast<uint>(hData->mFds.size()), fp, filename))
+ if(!WriteBin4(1, static_cast<uint>(hData->mFds.size()), fp.get(), filename))
return 0;
for(fi = static_cast<uint>(hData->mFds.size()-1);fi < hData->mFds.size();fi--)
{
auto fdist = static_cast<uint32_t>(std::round(1000.0 * hData->mFds[fi].mDistance));
- if(!WriteBin4(2, fdist, fp, filename))
+ if(!WriteBin4(2, fdist, fp.get(), filename))
return 0;
- if(!WriteBin4(1, static_cast<uint32_t>(hData->mFds[fi].mEvs.size()), fp, filename))
+ if(!WriteBin4(1, static_cast<uint32_t>(hData->mFds[fi].mEvs.size()), fp.get(), filename))
return 0;
for(ei = 0;ei < hData->mFds[fi].mEvs.size();ei++)
{
const auto &elev = hData->mFds[fi].mEvs[ei];
- if(!WriteBin4(1, static_cast<uint32_t>(elev.mAzs.size()), fp, filename))
+ if(!WriteBin4(1, static_cast<uint32_t>(elev.mAzs.size()), fp.get(), filename))
return 0;
}
}
@@ -392,7 +396,7 @@ static int StoreMhr(const HrirDataT *hData, const char *filename)
for(i = 0;i < (channels * n);i++)
{
const auto v = static_cast<int>(Clamp(out[i], -scale-1.0, scale));
- if(!WriteBin4(bps, static_cast<uint32_t>(v), fp, filename))
+ if(!WriteBin4(bps, static_cast<uint32_t>(v), fp.get(), filename))
return 0;
}
}
@@ -407,16 +411,15 @@ static int StoreMhr(const HrirDataT *hData, const char *filename)
for(const auto &azd : hData->mFds[fi].mEvs[ei].mAzs)
{
auto v = static_cast<uint>(std::round(azd.mDelays[0]*DelayPrecScale));
- if(!WriteBin4(1, v, fp, filename)) return 0;
+ if(!WriteBin4(1, v, fp.get(), filename)) return 0;
if(hData->mChannelType == CT_STEREO)
{
v = static_cast<uint>(std::round(azd.mDelays[1]*DelayPrecScale));
- if(!WriteBin4(1, v, fp, filename)) return 0;
+ if(!WriteBin4(1, v, fp.get(), filename)) return 0;
}
}
}
}
- fclose(fp);
return 1;
}
diff --git a/utils/uhjdecoder.cpp b/utils/uhjdecoder.cpp
index 8f0d2006..970d9f82 100644
--- a/utils/uhjdecoder.cpp
+++ b/utils/uhjdecoder.cpp
@@ -35,6 +35,7 @@
#include "albit.h"
#include "alcomplex.h"
+#include "almalloc.h"
#include "alnumbers.h"
#include "alspan.h"
#include "vector.h"
@@ -47,7 +48,7 @@
struct FileDeleter {
- void operator()(FILE *file) { fclose(file); }
+ void operator()(gsl::owner<FILE*> file) { fclose(file); }
};
using FilePtr = std::unique_ptr<FILE,FileDeleter>;