From 781ca7c58b9aac363afffb75b017e4dcffebb0ad Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 9 Nov 2018 02:57:39 -0800 Subject: Convert the loopback backend to C++ --- Alc/backends/loopback.c | 128 ------------------------------------------- Alc/backends/loopback.cpp | 135 ++++++++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 +- 3 files changed, 136 insertions(+), 129 deletions(-) delete mode 100644 Alc/backends/loopback.c create mode 100644 Alc/backends/loopback.cpp diff --git a/Alc/backends/loopback.c b/Alc/backends/loopback.c deleted file mode 100644 index e9940086..00000000 --- a/Alc/backends/loopback.c +++ /dev/null @@ -1,128 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2011 by Chris Robinson - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" - -#include "backends/base.h" - - -typedef struct ALCloopback { - DERIVE_FROM_TYPE(ALCbackend); -} ALCloopback; - -static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device); -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, Destruct) -static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name); -static ALCboolean ALCloopback_reset(ALCloopback *self); -static ALCboolean ALCloopback_start(ALCloopback *self); -static void ALCloopback_stop(ALCloopback *self); -static DECLARE_FORWARD2(ALCloopback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCloopback, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCloopback, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCloopback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCloopback) -DEFINE_ALCBACKEND_VTABLE(ALCloopback); - - -static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCloopback, ALCbackend, self); -} - - -static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - - alstr_copy_cstr(&device->DeviceName, name); - return ALC_NO_ERROR; -} - -static ALCboolean ALCloopback_reset(ALCloopback *self) -{ - SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); - return ALC_TRUE; -} - -static ALCboolean ALCloopback_start(ALCloopback* UNUSED(self)) -{ - return ALC_TRUE; -} - -static void ALCloopback_stop(ALCloopback* UNUSED(self)) -{ -} - - -typedef struct ALCloopbackFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCloopbackFactory; -#define ALCNULLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCloopbackFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCloopbackFactory_getFactory(void); -static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory *self); -static DECLARE_FORWARD(ALCloopbackFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory *self, ALCbackend_Type type); -static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type, al_string *outnames); -static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCloopbackFactory); - - -ALCbackendFactory *ALCloopbackFactory_getFactory(void) -{ - static ALCloopbackFactory factory = ALCNULLBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - -static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory* UNUSED(self)) -{ - return ALC_TRUE; -} - -static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Loopback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type), al_string* UNUSED(outnames)) -{ -} - -static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Loopback) - { - ALCloopback *backend; - NEW_OBJ(backend, ALCloopback)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/Alc/backends/loopback.cpp b/Alc/backends/loopback.cpp new file mode 100644 index 00000000..dd012ae5 --- /dev/null +++ b/Alc/backends/loopback.cpp @@ -0,0 +1,135 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2011 by Chris Robinson + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include "alMain.h" +#include "alu.h" + +#include "backends/base.h" + + +struct ALCloopback final : public ALCbackend { +}; + +static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device); +static void ALCloopback_Destruct(ALCloopback *self); +static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name); +static ALCboolean ALCloopback_reset(ALCloopback *self); +static ALCboolean ALCloopback_start(ALCloopback *self); +static void ALCloopback_stop(ALCloopback *self); +static DECLARE_FORWARD2(ALCloopback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) +static DECLARE_FORWARD(ALCloopback, ALCbackend, ALCuint, availableSamples) +static DECLARE_FORWARD(ALCloopback, ALCbackend, ClockLatency, getClockLatency) +static DECLARE_FORWARD(ALCloopback, ALCbackend, void, lock) +static DECLARE_FORWARD(ALCloopback, ALCbackend, void, unlock) +DECLARE_DEFAULT_ALLOCATORS(ALCloopback) +DEFINE_ALCBACKEND_VTABLE(ALCloopback); + + +static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device) +{ + new (self) ALCloopback{}; + ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); + SET_VTABLE2(ALCloopback, ALCbackend, self); +} + +static void ALCloopback_Destruct(ALCloopback *self) +{ + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); + self->~ALCloopback(); +} + + +static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + + alstr_copy_cstr(&device->DeviceName, name); + return ALC_NO_ERROR; +} + +static ALCboolean ALCloopback_reset(ALCloopback *self) +{ + SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); + return ALC_TRUE; +} + +static ALCboolean ALCloopback_start(ALCloopback* UNUSED(self)) +{ + return ALC_TRUE; +} + +static void ALCloopback_stop(ALCloopback* UNUSED(self)) +{ +} + + +struct ALCloopbackFactory final : public ALCbackendFactory { + ALCloopbackFactory() noexcept; +}; + +ALCbackendFactory *ALCloopbackFactory_getFactory(void); +static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory *self); +static DECLARE_FORWARD(ALCloopbackFactory, ALCbackendFactory, void, deinit) +static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory *self, ALCbackend_Type type); +static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type, al_string *outnames); +static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory *self, ALCdevice *device, ALCbackend_Type type); +DEFINE_ALCBACKENDFACTORY_VTABLE(ALCloopbackFactory); + +ALCloopbackFactory::ALCloopbackFactory() noexcept + : ALCbackendFactory{GET_VTABLE2(ALCloopbackFactory, ALCbackendFactory)} +{ } + + +static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory* UNUSED(self)) +{ + return ALC_TRUE; +} + +static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory* UNUSED(self), ALCbackend_Type type) +{ + if(type == ALCbackend_Loopback) + return ALC_TRUE; + return ALC_FALSE; +} + +static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type), al_string* UNUSED(outnames)) +{ +} + +static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) +{ + if(type == ALCbackend_Loopback) + { + ALCloopback *backend; + NEW_OBJ(backend, ALCloopback)(device); + if(!backend) return NULL; + return STATIC_CAST(ALCbackend, backend); + } + + return NULL; +} + +ALCbackendFactory *ALCloopbackFactory_getFactory(void) +{ + static ALCloopbackFactory factory{}; + return STATIC_CAST(ALCbackendFactory, &factory); +} diff --git a/CMakeLists.txt b/CMakeLists.txt index b9eb49a1..b51c0367 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1031,7 +1031,7 @@ SET(ALC_OBJS ${ALC_OBJS} Alc/backends/base.c Alc/backends/base.h # Default backends, always available - Alc/backends/loopback.c + Alc/backends/loopback.cpp Alc/backends/null.c ) -- cgit v1.2.3