From 3058205963ee3293341bc7d92061fa18ccae4df8 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 16 May 2015 01:46:06 -0700 Subject: Add a method to reset the device This basically acts as if the app created a new context with the specified attributes (causing the device to reset with new parameters), then immediately delete it. Existing contexts remain undisturbed, except for a temporary pause while the device output is reconfigured. --- Alc/ALc.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'Alc') diff --git a/Alc/ALc.c b/Alc/ALc.c index 672c8d61..ba8cb879 100644 --- a/Alc/ALc.c +++ b/Alc/ALc.c @@ -162,6 +162,8 @@ static const ALCfunction alcFunctions[] = { DECL(alcGetInteger64vSOFT), + DECL(alcResetDeviceSOFT), + DECL(alEnable), DECL(alDisable), DECL(alIsEnabled), @@ -3289,6 +3291,42 @@ ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *Context) } +/* alcResetDeviceSOFT + * + * Resets the given device output, using the specified attribute list. + */ +ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs) +{ + ALCenum err; + + LockLists(); + if(!(device=VerifyDevice(device)) || device->Type == Capture || !device->Connected) + { + UnlockLists(); + alcSetError(device, ALC_INVALID_DEVICE); + if(device) ALCdevice_DecRef(device); + return ALC_FALSE; + } + + if((err=UpdateDeviceParams(device, attribs)) != ALC_NO_ERROR) + { + UnlockLists(); + alcSetError(device, err); + if(err == ALC_INVALID_DEVICE) + { + V0(device->Backend,lock)(); + aluHandleDisconnect(device); + V0(device->Backend,unlock)(); + } + ALCdevice_DecRef(device); + return ALC_FALSE; + } + UnlockLists(); + ALCdevice_DecRef(device); + + return ALC_TRUE; +} + /* alcOpenDevice * * Opens the named device. -- cgit v1.2.3