diff options
author | Chris Robinson <[email protected]> | 2018-11-13 01:56:34 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-11-13 01:56:34 -0800 |
commit | 0ff349a714eac9bc0cf6cbdaafbddcec79f2442e (patch) | |
tree | 36a6804f92b45c9ac053eec7020716de58c436b9 | |
parent | 09ea1d58f63ad3fe248b1e59c0a3634447ce672d (diff) |
Convert the QSA backend to C++
This may very well not work, since there's no testing and my IDE is not able to
show real problems over the incompatibilities with ALSA headers.
-rw-r--r-- | Alc/backends/qsa.cpp (renamed from Alc/backends/qsa.c) | 58 | ||||
-rw-r--r-- | CMakeLists.txt | 2 |
2 files changed, 35 insertions, 25 deletions
diff --git a/Alc/backends/qsa.c b/Alc/backends/qsa.cpp index 81645096..778e9e44 100644 --- a/Alc/backends/qsa.c +++ b/Alc/backends/qsa.cpp @@ -36,7 +36,9 @@ #include "backends/base.h" -typedef struct { +namespace { + +struct qsa_data { snd_pcm_t* pcmHandle; int audio_fd; @@ -48,21 +50,21 @@ typedef struct { ATOMIC(ALenum) killNow; althrd_t thread; -} qsa_data; +}; -typedef struct { +struct DevMap { ALCchar* name; int card; int dev; -} DevMap; +}; TYPEDEF_VECTOR(DevMap, vector_DevMap) -static vector_DevMap DeviceNameMap; -static vector_DevMap CaptureNameMap; +vector_DevMap DeviceNameMap; +vector_DevMap CaptureNameMap; -static const ALCchar qsaDevice[] = "QSA Default"; +constexpr ALCchar qsaDevice[] = "QSA Default"; -static const struct { +constexpr struct { int32_t format; } formatlist[] = { {SND_PCM_SFMT_FLOAT_LE}, @@ -75,7 +77,7 @@ static const struct { {0}, }; -static const struct { +constexpr struct { int32_t rate; } ratelist[] = { {192000}, @@ -94,7 +96,7 @@ static const struct { {0}, }; -static const struct { +constexpr struct { int32_t channels; } channellist[] = { {8}, @@ -106,7 +108,7 @@ static const struct { {0}, }; -static void deviceList(int type, vector_DevMap *devmap) +void deviceList(int type, vector_DevMap *devmap) { snd_ctl_t* handle; snd_pcm_info_t pcminfo; @@ -161,12 +163,13 @@ static void deviceList(int type, vector_DevMap *devmap) } } +} // namespace + /* Wrappers to use an old-style backend with the new interface. */ -typedef struct PlaybackWrapper { - DERIVE_FROM_TYPE(ALCbackend); +struct PlaybackWrapper final : public ALCbackend { qsa_data *ExtraData; -} PlaybackWrapper; +}; static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device); static void PlaybackWrapper_Destruct(PlaybackWrapper *self); @@ -233,7 +236,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) } len = data->size; - write_ptr = data->buffer; + write_ptr = static_cast<char*>(data->buffer); aluMixData(device, write_ptr, len/frame_size); while(len>0 && !ATOMIC_LOAD(&data->killNow, almemory_order_acquire)) { @@ -619,6 +622,7 @@ static void qsa_stop_playback(PlaybackWrapper *self) static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device) { + new (self) PlaybackWrapper{}; ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(PlaybackWrapper, ALCbackend, self); @@ -631,6 +635,7 @@ static void PlaybackWrapper_Destruct(PlaybackWrapper *self) qsa_close_playback(self); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); + self->~PlaybackWrapper(); } static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name) @@ -659,10 +664,9 @@ static void PlaybackWrapper_stop(PlaybackWrapper *self) /* Capture */ /***********/ -typedef struct CaptureWrapper { - DERIVE_FROM_TYPE(ALCbackend); +struct CaptureWrapper final : public ALCbackend { qsa_data *ExtraData; -} CaptureWrapper; +}; static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device); static void CaptureWrapper_Destruct(CaptureWrapper *self); @@ -877,7 +881,7 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin ALint len=samples*frame_size; int rstatus; - read_ptr=buffer; + read_ptr = static_cast<char*>(buffer); while (len>0) { @@ -943,6 +947,7 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device) { + new (self) CaptureWrapper{}; ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(CaptureWrapper, ALCbackend, self); @@ -955,6 +960,7 @@ static void CaptureWrapper_Destruct(CaptureWrapper *self) qsa_close_capture(self); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); + self->~CaptureWrapper(); } static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name) @@ -984,10 +990,9 @@ static ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self) } -typedef struct ALCqsaBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCqsaBackendFactory; -#define ALCQSABACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCqsaBackendFactory, ALCbackendFactory) } } +struct ALCqsaBackendFactory final : public ALCbackendFactory { + ALCqsaBackendFactory() noexcept; +}; static ALCboolean ALCqsaBackendFactory_init(ALCqsaBackendFactory* UNUSED(self)); static void ALCqsaBackendFactory_deinit(ALCqsaBackendFactory* UNUSED(self)); @@ -996,6 +1001,11 @@ static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum static ALCbackend* ALCqsaBackendFactory_createBackend(ALCqsaBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCqsaBackendFactory); +ALCqsaBackendFactory::ALCqsaBackendFactory() noexcept + : ALCbackendFactory{GET_VTABLE2(ALCqsaBackendFactory, ALCbackendFactory)} +{ } + + static ALCboolean ALCqsaBackendFactory_init(ALCqsaBackendFactory* UNUSED(self)) { return ALC_TRUE; @@ -1063,6 +1073,6 @@ static ALCbackend* ALCqsaBackendFactory_createBackend(ALCqsaBackendFactory* UNUS ALCbackendFactory *ALCqsaBackendFactory_getFactory(void) { - static ALCqsaBackendFactory factory = ALCQSABACKENDFACTORY_INITIALIZER; + static ALCqsaBackendFactory factory{}; return STATIC_CAST(ALCbackendFactory, &factory); } diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ff8f2b8..639fa2a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1112,7 +1112,7 @@ IF(QSA_FOUND) IF(ALSOFT_BACKEND_QSA) SET(HAVE_QSA 1) SET(BACKENDS "${BACKENDS} QSA (linked),") - SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.cpp) SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS}) SET(INC_PATHS ${INC_PATHS} ${QSA_INCLUDE_DIRS}) ENDIF() |