Skip to content

Commit

Permalink
Handle pointer ownership a bit better
Browse files Browse the repository at this point in the history
  • Loading branch information
kcat committed Dec 29, 2023
1 parent 768781b commit 10ecdff
Show file tree
Hide file tree
Showing 14 changed files with 115 additions and 91 deletions.
30 changes: 14 additions & 16 deletions al/auxeffectslot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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);
}


Expand Down Expand Up @@ -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();
Expand All @@ -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. */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
}
Expand All @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions al/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}


Expand Down Expand Up @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions al/effect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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. */
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions al/filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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. */
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
15 changes: 8 additions & 7 deletions al/source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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*
Expand All @@ -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*
Expand All @@ -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*
Expand All @@ -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));
};


Expand Down Expand Up @@ -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);
Expand Down
46 changes: 32 additions & 14 deletions alc/alc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
Expand All @@ -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;
}
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions alc/backends/wave.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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>;

Expand Down Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions alc/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
}
}
}
Expand Down
Loading

0 comments on commit 10ecdff

Please sign in to comment.