Convert the WinMM backend to C++

This commit is contained in:
Chris Robinson
2018-11-08 20:32:31 -08:00
parent 34c836c490
commit 75eeb6ba4b
2 changed files with 31 additions and 24 deletions
+30 -23
View File
@@ -34,6 +34,8 @@
#include "backends/base.h"
namespace {
#ifndef WAVE_FORMAT_IEEE_FLOAT
#define WAVE_FORMAT_IEEE_FLOAT 0x0003
#endif
@@ -41,17 +43,17 @@
#define DEVNAME_HEAD "OpenAL Soft on "
static vector_al_string PlaybackDevices;
static vector_al_string CaptureDevices;
vector_al_string PlaybackDevices;
vector_al_string CaptureDevices;
static void clear_devlist(vector_al_string *list)
void clear_devlist(vector_al_string *list)
{
VECTOR_FOR_EACH(al_string, *list, alstr_reset);
VECTOR_RESIZE(*list, 0, 0);
}
static void ProbePlaybackDevices(void)
void ProbePlaybackDevices(void)
{
ALuint numdevs;
ALuint i;
@@ -94,7 +96,7 @@ static void ProbePlaybackDevices(void)
}
}
static void ProbeCaptureDevices(void)
void ProbeCaptureDevices(void)
{
ALuint numdevs;
ALuint i;
@@ -137,10 +139,9 @@ static void ProbeCaptureDevices(void)
}
}
} // namespace
typedef struct ALCwinmmPlayback {
DERIVE_FROM_TYPE(ALCbackend);
struct ALCwinmmPlayback final : public ALCbackend {
RefCount WaveBuffersCommitted;
WAVEHDR WaveBuffer[4];
@@ -150,7 +151,7 @@ typedef struct ALCwinmmPlayback {
ATOMIC(ALenum) killNow;
althrd_t thread;
} ALCwinmmPlayback;
};
static void ALCwinmmPlayback_Construct(ALCwinmmPlayback *self, ALCdevice *device);
static void ALCwinmmPlayback_Destruct(ALCwinmmPlayback *self);
@@ -174,6 +175,7 @@ DEFINE_ALCBACKEND_VTABLE(ALCwinmmPlayback);
static void ALCwinmmPlayback_Construct(ALCwinmmPlayback *self, ALCdevice *device)
{
new (self) ALCwinmmPlayback{};
ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
SET_VTABLE2(ALCwinmmPlayback, ALCbackend, self);
@@ -190,6 +192,7 @@ static void ALCwinmmPlayback_Destruct(ALCwinmmPlayback *self)
self->OutHdl = 0;
ALCbackend_Destruct(STATIC_CAST(ALCbackend, self));
self->~ALCwinmmPlayback();
}
@@ -211,7 +214,7 @@ static void CALLBACK ALCwinmmPlayback_waveOutProc(HWAVEOUT UNUSED(device), UINT
FORCE_ALIGN static int ALCwinmmPlayback_mixerProc(void *arg)
{
ALCwinmmPlayback *self = arg;
auto self = static_cast<ALCwinmmPlayback*>(arg);
ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
WAVEHDR *WaveHdr;
MSG msg;
@@ -381,7 +384,7 @@ static ALCboolean ALCwinmmPlayback_start(ALCwinmmPlayback *self)
BufferSize = device->UpdateSize*device->NumUpdates / 4;
BufferSize *= FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder);
BufferData = calloc(4, BufferSize);
BufferData = static_cast<ALbyte*>(calloc(4, BufferSize));
for(i = 0;i < 4;i++)
{
memset(&self->WaveBuffer[i], 0, sizeof(WAVEHDR));
@@ -418,9 +421,7 @@ static void ALCwinmmPlayback_stop(ALCwinmmPlayback *self)
typedef struct ALCwinmmCapture {
DERIVE_FROM_TYPE(ALCbackend);
struct ALCwinmmCapture final : public ALCbackend {
RefCount WaveBuffersCommitted;
WAVEHDR WaveBuffer[4];
@@ -432,7 +433,7 @@ typedef struct ALCwinmmCapture {
ATOMIC(ALenum) killNow;
althrd_t thread;
} ALCwinmmCapture;
};
static void ALCwinmmCapture_Construct(ALCwinmmCapture *self, ALCdevice *device);
static void ALCwinmmCapture_Destruct(ALCwinmmCapture *self);
@@ -456,6 +457,7 @@ DEFINE_ALCBACKEND_VTABLE(ALCwinmmCapture);
static void ALCwinmmCapture_Construct(ALCwinmmCapture *self, ALCdevice *device)
{
new (self) ALCwinmmCapture{};
ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
SET_VTABLE2(ALCwinmmCapture, ALCbackend, self);
@@ -499,6 +501,7 @@ static void ALCwinmmCapture_Destruct(ALCwinmmCapture *self)
self->InHdl = 0;
ALCbackend_Destruct(STATIC_CAST(ALCbackend, self));
self->~ALCwinmmCapture();
}
@@ -520,7 +523,7 @@ static void CALLBACK ALCwinmmCapture_waveInProc(HWAVEIN UNUSED(device), UINT msg
static int ALCwinmmCapture_captureProc(void *arg)
{
ALCwinmmCapture *self = arg;
auto self = static_cast<ALCwinmmCapture*>(arg);
WAVEHDR *WaveHdr;
MSG msg;
@@ -635,7 +638,7 @@ static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name)
BufferSize = self->Format.nAvgBytesPerSec / 20;
BufferSize -= (BufferSize % self->Format.nBlockAlign);
BufferData = calloc(4, BufferSize);
BufferData = static_cast<ALbyte*>(calloc(4, BufferSize));
if(!BufferData) goto failure;
for(i = 0;i < 4;i++)
@@ -690,7 +693,7 @@ static void ALCwinmmCapture_stop(ALCwinmmCapture *self)
static ALCenum ALCwinmmCapture_captureSamples(ALCwinmmCapture *self, ALCvoid *buffer, ALCuint samples)
{
ll_ringbuffer_read(self->Ring, buffer, samples);
ll_ringbuffer_read(self->Ring, static_cast<char*>(buffer), samples);
return ALC_NO_ERROR;
}
@@ -700,10 +703,10 @@ static ALCuint ALCwinmmCapture_availableSamples(ALCwinmmCapture *self)
}
typedef struct ALCwinmmBackendFactory {
DERIVE_FROM_TYPE(ALCbackendFactory);
} ALCwinmmBackendFactory;
#define ALCWINMMBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCwinmmBackendFactory, ALCbackendFactory) } }
struct ALCwinmmBackendFactory final : public ALCbackendFactory {
ALCwinmmBackendFactory() noexcept;
};
#define ALCWINMMBACKENDFACTORY_INITIALIZER GET_VTABLE2(ALCwinmmBackendFactory, ALCbackendFactory)
static ALCboolean ALCwinmmBackendFactory_init(ALCwinmmBackendFactory *self);
static void ALCwinmmBackendFactory_deinit(ALCwinmmBackendFactory *self);
@@ -713,6 +716,10 @@ static ALCbackend* ALCwinmmBackendFactory_createBackend(ALCwinmmBackendFactory *
DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwinmmBackendFactory);
ALCwinmmBackendFactory::ALCwinmmBackendFactory() noexcept
: ALCbackendFactory{ALCWINMMBACKENDFACTORY_INITIALIZER}
{ }
static ALCboolean ALCwinmmBackendFactory_init(ALCwinmmBackendFactory* UNUSED(self))
{
@@ -781,6 +788,6 @@ static ALCbackend* ALCwinmmBackendFactory_createBackend(ALCwinmmBackendFactory*
ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void)
{
static ALCwinmmBackendFactory factory = ALCWINMMBACKENDFACTORY_INITIALIZER;
static ALCwinmmBackendFactory factory{};
return STATIC_CAST(ALCbackendFactory, &factory);
}
+1 -1
View File
@@ -1138,7 +1138,7 @@ IF(HAVE_WINDOWS_H)
IF(ALSOFT_BACKEND_WINMM)
SET(HAVE_WINMM 1)
SET(BACKENDS "${BACKENDS} WinMM,")
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c)
SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.cpp)
SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
ENDIF()
ENDIF()