aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/alc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/alc.cpp')
-rw-r--r--Alc/alc.cpp51
1 files changed, 22 insertions, 29 deletions
diff --git a/Alc/alc.cpp b/Alc/alc.cpp
index a8288acb..0c3e56c1 100644
--- a/Alc/alc.cpp
+++ b/Alc/alc.cpp
@@ -3409,10 +3409,6 @@ ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *e
*/
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrList)
{
- ALCcontext *ALContext;
- ALfloat valf;
- ALCenum err;
-
/* Explicitly hold the list lock while taking the StateLock in case the
* device is asynchronously destroyed, to ensure this new context is
* properly cleaned up after being made.
@@ -3430,22 +3426,20 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
dev->LastError.store(ALC_NO_ERROR);
- ALContext = new ALCcontext{dev.get()};
+ ContextRef ALContext{new ALCcontext{dev.get()}};
ALCdevice_IncRef(ALContext->Device);
- if((err=UpdateDeviceParams(dev.get(), attrList)) != ALC_NO_ERROR)
+ ALCenum err{UpdateDeviceParams(dev.get(), attrList)};
+ if(err != ALC_NO_ERROR)
{
alcSetError(dev.get(), err);
if(err == ALC_INVALID_DEVICE)
aluHandleDisconnect(dev.get(), "Device update failure");
statelock.unlock();
- delete ALContext;
- ALContext = nullptr;
-
return nullptr;
}
- AllocateVoices(ALContext, 256, dev->NumAuxSends);
+ AllocateVoices(ALContext.get(), 256, dev->NumAuxSends);
if(DefaultEffect.type != AL_EFFECT_NULL && dev->Type == Playback)
{
@@ -3459,8 +3453,9 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
}
}
- InitContext(ALContext);
+ InitContext(ALContext.get());
+ ALfloat valf{};
if(ConfigValueFloat(dev->DeviceName.c_str(), nullptr, "volume-adjust", &valf))
{
if(!std::isfinite(valf))
@@ -3474,26 +3469,27 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
TRACE("volume-adjust gain: %f\n", ALContext->GainBoost);
}
}
- UpdateListenerProps(ALContext);
+ UpdateListenerProps(ALContext.get());
{
ALCcontext *head = dev->ContextList.load();
do {
ALContext->next.store(head, std::memory_order_relaxed);
- } while(!dev->ContextList.compare_exchange_weak(head, ALContext));
+ } while(!dev->ContextList.compare_exchange_weak(head, ALContext.get()));
+ ALCcontext_IncRef(ALContext.get());
}
statelock.unlock();
if(ALContext->DefaultSlot)
{
- if(InitializeEffect(ALContext, ALContext->DefaultSlot.get(), &DefaultEffect) == AL_NO_ERROR)
- UpdateEffectSlotProps(ALContext->DefaultSlot.get(), ALContext);
+ if(InitializeEffect(ALContext.get(), ALContext->DefaultSlot.get(), &DefaultEffect) == AL_NO_ERROR)
+ UpdateEffectSlotProps(ALContext->DefaultSlot.get(), ALContext.get());
else
ERR("Failed to initialize the default effect\n");
}
- TRACE("Created context %p\n", ALContext);
- return ALContext;
+ TRACE("Created context %p\n", ALContext.get());
+ return ALContext.get();
}
/* alcDestroyContext
@@ -3648,7 +3644,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
))
deviceName = nullptr;
- auto device = al::make_unique<ALCdevice>(Playback);
+ DeviceRef device{new ALCdevice{Playback}};
//Set output format
device->FmtChans = DevFmtChannelsDefault;
@@ -3763,7 +3759,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
BackendType::Playback);
if(!device->Backend)
{
- device = nullptr;
alcSetError(nullptr, ALC_OUT_OF_MEMORY);
return nullptr;
}
@@ -3772,7 +3767,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
ALCenum err{device->Backend->open(deviceName)};
if(err != ALC_NO_ERROR)
{
- device = nullptr;
alcSetError(nullptr, err);
return nullptr;
}
@@ -3813,10 +3807,11 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
do {
device->next.store(head, std::memory_order_relaxed);
} while(!DeviceList.compare_exchange_weak(head, device.get()));
+ ALCdevice_IncRef(device.get());
}
TRACE("Created device %p, \"%s\"\n", device.get(), device->DeviceName.c_str());
- return device.release();
+ return device.get();
}
/* alcCloseDevice
@@ -3892,14 +3887,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
if(deviceName && (!deviceName[0] || strcasecmp(deviceName, alcDefaultName) == 0 || strcasecmp(deviceName, "openal-soft") == 0))
deviceName = nullptr;
- auto device = al::make_unique<ALCdevice>(Capture);
+ DeviceRef device{new ALCdevice{Capture}};
device->Frequency = frequency;
device->Flags |= DEVICE_FREQUENCY_REQUEST;
if(DecomposeDevFormat(format, &device->FmtChans, &device->FmtType) == AL_FALSE)
{
- device = nullptr;
alcSetError(nullptr, ALC_INVALID_ENUM);
return nullptr;
}
@@ -3912,7 +3906,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
BackendType::Capture);
if(!device->Backend)
{
- device = nullptr;
alcSetError(nullptr, ALC_OUT_OF_MEMORY);
return nullptr;
}
@@ -3924,7 +3917,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
ALCenum err{device->Backend->open(deviceName)};
if(err != ALC_NO_ERROR)
{
- device = nullptr;
alcSetError(nullptr, err);
return nullptr;
}
@@ -3934,10 +3926,11 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
do {
device->next.store(head, std::memory_order_relaxed);
} while(!DeviceList.compare_exchange_weak(head, device.get()));
+ ALCdevice_IncRef(device.get());
}
TRACE("Created device %p, \"%s\"\n", device.get(), device->DeviceName.c_str());
- return device.release();
+ return device.get();
}
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device)
@@ -4056,7 +4049,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
return nullptr;
}
- auto device = al::make_unique<ALCdevice>(Loopback);
+ DeviceRef device{new ALCdevice{Loopback}};
device->SourcesMax = 256;
device->AuxiliaryEffectSlotMax = 64;
@@ -4089,7 +4082,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
BackendType::Playback);
if(!device->Backend)
{
- device = nullptr;
alcSetError(nullptr, ALC_OUT_OF_MEMORY);
return nullptr;
}
@@ -4102,10 +4094,11 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
do {
device->next.store(head, std::memory_order_relaxed);
} while(!DeviceList.compare_exchange_weak(head, device.get()));
+ ALCdevice_IncRef(device.get());
}
TRACE("Created device %p\n", device.get());
- return device.release();
+ return device.get();
}
/* alcIsRenderFormatSupportedSOFT