Use a vector in the wave backend

This commit is contained in:
Chris Robinson
2018-11-11 03:29:43 -08:00
parent 2db82bea6f
commit d3c4bab7bb
+13 -30
View File
@@ -27,6 +27,7 @@
#include <chrono>
#include <thread>
#include <vector>
#include "alMain.h"
#include "alu.h"
@@ -83,8 +84,7 @@ struct ALCwaveBackend final : public ALCbackend {
FILE *mFile;
long mDataStart;
ALvoid *mBuffer;
ALuint mSize;
std::vector<ALbyte> mBuffer;
ATOMIC(ALenum) killNow;
std::thread thread;
@@ -117,9 +117,6 @@ static void ALCwaveBackend_Construct(ALCwaveBackend *self, ALCdevice *device)
self->mFile = nullptr;
self->mDataStart = -1;
self->mBuffer = nullptr;
self->mSize = 0;
ATOMIC_INIT(&self->killNow, AL_TRUE);
}
@@ -159,7 +156,7 @@ static int ALCwaveBackend_mixerProc(ALCwaveBackend *self)
while(avail-done >= device->UpdateSize)
{
ALCwaveBackend_lock(self);
aluMixData(device, self->mBuffer, device->UpdateSize);
aluMixData(device, self->mBuffer.data(), device->UpdateSize);
ALCwaveBackend_unlock(self);
done += device->UpdateSize;
@@ -170,8 +167,8 @@ static int ALCwaveBackend_mixerProc(ALCwaveBackend *self)
if(bytesize == 2)
{
ALushort *samples = static_cast<ALushort*>(self->mBuffer);
ALuint len = self->mSize / 2;
ALushort *samples = reinterpret_cast<ALushort*>(self->mBuffer.data());
ALuint len = self->mBuffer.size() / 2;
for(i = 0;i < len;i++)
{
ALushort samp = samples[i];
@@ -180,8 +177,8 @@ static int ALCwaveBackend_mixerProc(ALCwaveBackend *self)
}
else if(bytesize == 4)
{
ALuint *samples = static_cast<ALuint*>(self->mBuffer);
ALuint len = self->mSize / 4;
ALuint *samples = reinterpret_cast<ALuint*>(self->mBuffer.data());
ALuint len = self->mBuffer.size() / 4;
for(i = 0;i < len;i++)
{
ALuint samp = samples[i];
@@ -191,7 +188,7 @@ static int ALCwaveBackend_mixerProc(ALCwaveBackend *self)
}
}
size_t fs{fwrite(self->mBuffer, frameSize, device->UpdateSize, self->mFile)};
size_t fs{fwrite(self->mBuffer.data(), frameSize, device->UpdateSize, self->mFile)};
(void)fs;
if(ferror(self->mFile))
{
@@ -347,23 +344,16 @@ static ALCboolean ALCwaveBackend_reset(ALCwaveBackend *self)
SetDefaultWFXChannelOrder(device);
ALuint bufsize{FrameSizeFromDevFmt(
device->FmtChans, device->FmtType, device->AmbiOrder
) * device->UpdateSize};
self->mBuffer.resize(bufsize);
return ALC_TRUE;
}
static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self)
{
ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
self->mSize = device->UpdateSize * FrameSizeFromDevFmt(
device->FmtChans, device->FmtType, device->AmbiOrder
);
self->mBuffer = malloc(self->mSize);
if(!self->mBuffer)
{
ERR("Buffer malloc failed\n");
return ALC_FALSE;
}
try {
ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release);
self->thread = std::thread(ALCwaveBackend_mixerProc, self);
@@ -374,10 +364,6 @@ static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self)
}
catch(...) {
}
free(self->mBuffer);
self->mBuffer = nullptr;
self->mSize = 0;
return ALC_FALSE;
}
@@ -388,9 +374,6 @@ static void ALCwaveBackend_stop(ALCwaveBackend *self)
return;
self->thread.join();
free(self->mBuffer);
self->mBuffer = nullptr;
long size{ftell(self->mFile)};
if(size > 0)
{