aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/mixer.c42
-rw-r--r--OpenAL32/Include/alBuffer.h1
-rw-r--r--OpenAL32/alBuffer.c21
3 files changed, 47 insertions, 17 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 187ccbe7..6f2bf005 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -37,6 +37,14 @@
#include "bs2b.h"
+static __inline ALdouble point64(const ALdouble *vals, ALint step, ALint frac)
+{ return vals[0]; (void)step; (void)frac; }
+static __inline ALdouble lerp64(const ALdouble *vals, ALint step, ALint frac)
+{ return lerp(vals[0], vals[step], frac * (1.0/FRACTIONONE)); }
+static __inline ALdouble cubic64(const ALdouble *vals, ALint step, ALint frac)
+{ return cubic(vals[-step], vals[0], vals[step], vals[step+step],
+ frac * (1.0/FRACTIONONE)); }
+
static __inline ALdouble point32(const ALfloat *vals, ALint step, ALint frac)
{ return vals[0]; (void)step; (void)frac; }
static __inline ALdouble lerp32(const ALfloat *vals, ALint step, ALint frac)
@@ -195,6 +203,10 @@ static void Mix_##T##_Mono_##sampler(ALsource *Source, ALCdevice *Device, \
*DataPosFrac = frac; \
}
+DECL_TEMPLATE(ALdouble, point64)
+DECL_TEMPLATE(ALdouble, lerp64)
+DECL_TEMPLATE(ALdouble, cubic64)
+
DECL_TEMPLATE(ALfloat, point32)
DECL_TEMPLATE(ALfloat, lerp32)
DECL_TEMPLATE(ALfloat, cubic32)
@@ -348,6 +360,10 @@ static void Mix_##T##_Stereo_##sampler(ALsource *Source, ALCdevice *Device, \
*DataPosFrac = frac; \
}
+DECL_TEMPLATE(ALdouble, point64)
+DECL_TEMPLATE(ALdouble, lerp64)
+DECL_TEMPLATE(ALdouble, cubic64)
+
DECL_TEMPLATE(ALfloat, point32)
DECL_TEMPLATE(ALfloat, lerp32)
DECL_TEMPLATE(ALfloat, cubic32)
@@ -492,6 +508,10 @@ static void Mix_##T##_##chans##_##sampler(ALsource *Source, ALCdevice *Device,\
static const Channel QuadChans[] = { FRONT_LEFT, FRONT_RIGHT,
BACK_LEFT, BACK_RIGHT };
+DECL_TEMPLATE(ALdouble, QuadChans, point64)
+DECL_TEMPLATE(ALdouble, QuadChans, lerp64)
+DECL_TEMPLATE(ALdouble, QuadChans, cubic64)
+
DECL_TEMPLATE(ALfloat, QuadChans, point32)
DECL_TEMPLATE(ALfloat, QuadChans, lerp32)
DECL_TEMPLATE(ALfloat, QuadChans, cubic32)
@@ -508,6 +528,10 @@ DECL_TEMPLATE(ALubyte, QuadChans, cubic8)
static const Channel X51Chans[] = { FRONT_LEFT, FRONT_RIGHT,
FRONT_CENTER, LFE,
BACK_LEFT, BACK_RIGHT };
+DECL_TEMPLATE(ALdouble, X51Chans, point64)
+DECL_TEMPLATE(ALdouble, X51Chans, lerp64)
+DECL_TEMPLATE(ALdouble, X51Chans, cubic64)
+
DECL_TEMPLATE(ALfloat, X51Chans, point32)
DECL_TEMPLATE(ALfloat, X51Chans, lerp32)
DECL_TEMPLATE(ALfloat, X51Chans, cubic32)
@@ -525,6 +549,10 @@ static const Channel X61Chans[] = { FRONT_LEFT, FRONT_RIGHT,
FRONT_CENTER, LFE,
BACK_CENTER,
SIDE_LEFT, SIDE_RIGHT };
+DECL_TEMPLATE(ALdouble, X61Chans, point64)
+DECL_TEMPLATE(ALdouble, X61Chans, lerp64)
+DECL_TEMPLATE(ALdouble, X61Chans, cubic64)
+
DECL_TEMPLATE(ALfloat, X61Chans, point32)
DECL_TEMPLATE(ALfloat, X61Chans, lerp32)
DECL_TEMPLATE(ALfloat, X61Chans, cubic32)
@@ -542,6 +570,10 @@ static const Channel X71Chans[] = { FRONT_LEFT, FRONT_RIGHT,
FRONT_CENTER, LFE,
BACK_LEFT, BACK_RIGHT,
SIDE_LEFT, SIDE_RIGHT };
+DECL_TEMPLATE(ALdouble, X71Chans, point64)
+DECL_TEMPLATE(ALdouble, X71Chans, lerp64)
+DECL_TEMPLATE(ALdouble, X71Chans, cubic64)
+
DECL_TEMPLATE(ALfloat, X71Chans, point32)
DECL_TEMPLATE(ALfloat, X71Chans, lerp32)
DECL_TEMPLATE(ALfloat, X71Chans, cubic32)
@@ -598,6 +630,10 @@ static void Mix_##T##_##sampler(ALsource *Source, ALCdevice *Device, \
} \
}
+DECL_TEMPLATE(ALdouble, point64)
+DECL_TEMPLATE(ALdouble, lerp64)
+DECL_TEMPLATE(ALdouble, cubic64)
+
DECL_TEMPLATE(ALfloat, point32)
DECL_TEMPLATE(ALfloat, lerp32)
DECL_TEMPLATE(ALfloat, cubic32)
@@ -638,6 +674,12 @@ static void Mix_##sampler(ALsource *Source, ALCdevice *Device, \
Data, DataPosInt, DataPosFrac, \
OutPos, SamplesToDo, BufferSize); \
break; \
+ \
+ case FmtDouble: \
+ Mix_ALdouble_##sampler##64(Source, Device, FmtChannels, \
+ Data, DataPosInt, DataPosFrac, \
+ OutPos, SamplesToDo, BufferSize); \
+ break; \
} \
}
diff --git a/OpenAL32/Include/alBuffer.h b/OpenAL32/Include/alBuffer.h
index 06823ace..44a05915 100644
--- a/OpenAL32/Include/alBuffer.h
+++ b/OpenAL32/Include/alBuffer.h
@@ -11,6 +11,7 @@ enum FmtType {
FmtUByte,
FmtShort,
FmtFloat,
+ FmtDouble,
};
enum FmtChannels {
diff --git a/OpenAL32/alBuffer.c b/OpenAL32/alBuffer.c
index 7dac47ff..2db0b3fd 100644
--- a/OpenAL32/alBuffer.c
+++ b/OpenAL32/alBuffer.c
@@ -287,9 +287,11 @@ AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid
case AL_FORMAT_MONO8:
case AL_FORMAT_MONO16:
case AL_FORMAT_MONO_FLOAT32:
+ case AL_FORMAT_MONO_DOUBLE_EXT:
case AL_FORMAT_STEREO8:
case AL_FORMAT_STEREO16:
case AL_FORMAT_STEREO_FLOAT32:
+ case AL_FORMAT_STEREO_DOUBLE_EXT:
case AL_FORMAT_QUAD8_LOKI:
case AL_FORMAT_QUAD16_LOKI:
case AL_FORMAT_QUAD8:
@@ -309,17 +311,6 @@ AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer,ALenum format,const ALvoid
alSetError(Context, err);
break;
- case AL_FORMAT_MONO_DOUBLE_EXT:
- err = LoadData(ALBuf, data, size, freq, format, AL_FORMAT_MONO_FLOAT32);
- if(err != AL_NO_ERROR)
- alSetError(Context, err);
- break;
- case AL_FORMAT_STEREO_DOUBLE_EXT:
- err = LoadData(ALBuf, data, size, freq, format, AL_FORMAT_STEREO_FLOAT32);
- if(err != AL_NO_ERROR)
- alSetError(Context, err);
- break;
-
case AL_FORMAT_REAR8:
case AL_FORMAT_REAR16:
case AL_FORMAT_REAR32: {
@@ -1064,11 +1055,7 @@ static ALenum LoadData(ALbuffer *ALBuf, const ALvoid *data, ALsizei size, ALuint
ALvoid *temp;
assert(NewChannels == OrigChannels);
- assert(NewBytes == 4 || NewBytes == 2 || NewBytes == 1);
- if(OrigBytes == 8)
- assert(NewBytes == 4);
- else
- assert(NewBytes == OrigBytes);
+ assert(NewBytes == OrigBytes);
if((size%(OrigBytes*OrigChannels)) != 0)
return AL_INVALID_VALUE;
@@ -1125,7 +1112,7 @@ static void ConvertData(ALvoid *dst, const ALvoid *src, ALint origBytes, ALsizei
case 8:
for(i = 0;i < len;i++)
- ((ALfloat*)dst)[i] = ((ALdouble*)src)[i];
+ ((ALdouble*)dst)[i] = ((ALdouble*)src)[i];
break;
default: