summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2010-11-26 02:53:15 -0800
committerChris Robinson <[email protected]>2010-11-26 02:53:15 -0800
commit7287b5cd3c251fb33a002a90508db398be52cd2c (patch)
tree685299b506b1a7c3e1439c4c2fbe64b2ca11d7d5
parent0692cf304d92d546f2ab5252df58d3a82a2cfb72 (diff)
Make the buffer padding size dependent on the resampler
-rw-r--r--Alc/mixer.c35
-rw-r--r--OpenAL32/Include/alBuffer.h3
-rw-r--r--OpenAL32/Include/alSource.h11
3 files changed, 31 insertions, 18 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 2e7a92f3..b9aa18b3 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -626,6 +626,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
ALuint BuffersPlayed;
ALboolean Looping;
ALuint increment;
+ resampler_t Resampler;
ALenum State;
ALuint i, j;
ALint64 DataSize64;
@@ -637,6 +638,8 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
DataPosFrac = Source->position_fraction;
Looping = Source->bLooping;
increment = Source->Params.Step;
+ Resampler = (increment == FRACTIONONE) ? POINT_RESAMPLER :
+ Source->Resampler;
/* Get buffer info */
FrameSize = Channels = Bytes = 0;
@@ -661,6 +664,8 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
j = 0;
do {
+ const ALuint BufferPrePadding = ResamplerPrePadding[Resampler];
+ const ALuint BufferPadding = ResamplerPadding[Resampler];
ALubyte StackData[STACK_DATA_SIZE];
ALubyte *SrcData = StackData;
ALuint SrcDataSize = 0;
@@ -671,7 +676,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
DataSize64 *= increment;
DataSize64 += DataPosFrac+FRACTIONMASK;
DataSize64 >>= FRACTIONBITS;
- DataSize64 += BUFFER_PADDING+BUFFER_PREPADDING;
+ DataSize64 += BufferPadding+BufferPrePadding;
DataSize64 *= FrameSize;
BufferSize = min(DataSize64, STACK_DATA_SIZE);
@@ -689,11 +694,11 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
{
Looping = AL_FALSE;
- if(DataPosInt >= BUFFER_PREPADDING)
- pos = (DataPosInt-BUFFER_PREPADDING)*FrameSize;
+ if(DataPosInt >= BufferPrePadding)
+ pos = (DataPosInt-BufferPrePadding)*FrameSize;
else
{
- DataSize = (BUFFER_PREPADDING-DataPosInt)*FrameSize;
+ DataSize = (BufferPrePadding-DataPosInt)*FrameSize;
DataSize = min(BufferSize, DataSize);
memset(&SrcData[SrcDataSize], (Bytes==1)?0x80:0, DataSize);
@@ -724,17 +729,17 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
if(DataPosInt >= LoopStart)
{
pos = DataPosInt-LoopStart;
- while(pos < BUFFER_PREPADDING)
+ while(pos < BufferPrePadding)
pos += LoopEnd-LoopStart;
- pos -= BUFFER_PREPADDING;
+ pos -= BufferPrePadding;
pos += LoopStart;
pos *= FrameSize;
}
- else if(DataPosInt >= BUFFER_PREPADDING)
- pos = (DataPosInt-BUFFER_PREPADDING)*FrameSize;
+ else if(DataPosInt >= BufferPrePadding)
+ pos = (DataPosInt-BufferPrePadding)*FrameSize;
else
{
- DataSize = (BUFFER_PREPADDING-DataPosInt)*FrameSize;
+ DataSize = (BufferPrePadding-DataPosInt)*FrameSize;
DataSize = min(BufferSize, DataSize);
memset(&SrcData[SrcDataSize], (Bytes==1)?0x80:0, DataSize);
@@ -770,11 +775,11 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
ALbufferlistitem *BufferListIter = BufferListItem;
ALuint pos;
- if(DataPosInt >= BUFFER_PREPADDING)
- pos = (DataPosInt-BUFFER_PREPADDING)*FrameSize;
+ if(DataPosInt >= BufferPrePadding)
+ pos = (DataPosInt-BufferPrePadding)*FrameSize;
else
{
- pos = (BUFFER_PREPADDING-DataPosInt)*FrameSize;
+ pos = (BufferPrePadding-DataPosInt)*FrameSize;
while(pos > 0)
{
if(!BufferListIter->prev && !Looping)
@@ -846,7 +851,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
/* Figure out how many samples we can mix. */
DataSize64 = SrcDataSize / FrameSize;
- DataSize64 -= BUFFER_PADDING+BUFFER_PREPADDING;
+ DataSize64 -= BufferPadding+BufferPrePadding;
DataSize64 <<= FRACTIONBITS;
DataSize64 -= increment;
@@ -864,8 +869,8 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
break;
}
- SrcData += BUFFER_PREPADDING*FrameSize;
- switch((increment != FRACTIONONE) ? Source->Resampler : POINT_RESAMPLER)
+ SrcData += BufferPrePadding*FrameSize;
+ switch(Resampler)
{
case POINT_RESAMPLER:
if(Bytes == 4)
diff --git a/OpenAL32/Include/alBuffer.h b/OpenAL32/Include/alBuffer.h
index 9ba3217d..e11fe210 100644
--- a/OpenAL32/Include/alBuffer.h
+++ b/OpenAL32/Include/alBuffer.h
@@ -7,9 +7,6 @@
extern "C" {
#endif
-#define BUFFER_PADDING 2
-#define BUFFER_PREPADDING 1
-
typedef struct ALbuffer
{
ALvoid *data;
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index d60416b6..4af7f99d 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -22,6 +22,17 @@ typedef enum {
} resampler_t;
extern resampler_t DefaultResampler;
+static const ALsizei ResamplerPadding[RESAMPLER_MAX] = {
+ 0, /* Point */
+ 1, /* Linear */
+ 2, /* Cubic */
+};
+static const ALsizei ResamplerPrePadding[RESAMPLER_MAX] = {
+ 0, /* Point */
+ 0, /* Linear */
+ 1, /* Cubic */
+};
+
typedef struct ALbufferlistitem
{
struct ALbuffer *buffer;