aboutsummaryrefslogtreecommitdiffstats
path: root/alc
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 /alc
parent768781bab97732fbd0d66fa153d4ebc768be1240 (diff)
Handle pointer ownership a bit better
Diffstat (limited to 'alc')
-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
5 files changed, 44 insertions, 24 deletions
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;