Make the SourceMix function a method of the ALsource struct

This commit is contained in:
Chris Robinson 2010-09-26 01:15:27 -07:00
parent 08fdc5fa98
commit 9fbd6c6c3f
4 changed files with 21 additions and 9 deletions

View File

@ -601,9 +601,9 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
} while(0)
static ALvoid MixSource(ALsource *Source, ALfloat (*DryBuffer)[OUTPUTCHANNELS],
ALuint SamplesToDo, ALfloat *ClickRemoval,
ALfloat *PendingClicks)
ALvoid MixSource(ALsource *Source, ALuint SamplesToDo,
ALfloat (*DryBuffer)[OUTPUTCHANNELS],
ALfloat *ClickRemoval, ALfloat *PendingClicks)
{
ALbufferlistitem *BufferListItem;
ALint64 DataSize64,DataPos64;
@ -749,9 +749,6 @@ static ALvoid MixSource(ALsource *Source, ALfloat (*DryBuffer)[OUTPUTCHANNELS],
Source->Buffer = BufferListItem->buffer;
}
#undef DO_MIX_MC
#undef DO_MIX_STEREO
#undef DO_MIX_MONO
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
{
@ -809,8 +806,8 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
(*src)->NeedsUpdate = AL_FALSE;
}
MixSource(*src, DryBuffer, SamplesToDo,
device->ClickRemoval, device->PendingClicks);
ALsource_Mix(*src, SamplesToDo, DryBuffer,
device->ClickRemoval, device->PendingClicks);
src++;
}

View File

@ -96,12 +96,17 @@ typedef struct ALsource
FILTER iirFilter;
ALfloat history[OUTPUTCHANNELS*2];
} Params;
ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);
ALvoid (*Mix)(struct ALsource *self, ALuint SamplesToDo,
ALfloat (*DryBuffer)[OUTPUTCHANNELS],
ALfloat *ClickRemoval, ALfloat *PendingClicks);
// Index to itself
ALuint source;
} ALsource;
#define ALsource_Update(s,a) ((s)->Update(s,a))
#define ALsource_Update(s,a) ((s)->Update(s,a))
#define ALsource_Mix(s,a,b,c,d) ((s)->Mix(s,a,b,c,d))
ALvoid ReleaseALSources(ALCcontext *Context);

View File

@ -189,6 +189,10 @@ ALvoid aluInitPanning(ALCdevice *Device);
ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
ALvoid MixSource(struct ALsource *Source, ALuint SamplesToDo,
ALfloat (*DryBuffer)[OUTPUTCHANNELS],
ALfloat *ClickRemoval, ALfloat *PendingClicks);
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
ALvoid aluHandleDisconnect(ALCdevice *device);

View File

@ -563,6 +563,8 @@ AL_API ALvoid AL_APIENTRY alSourcei(ALuint source,ALenum eParam,ALint lValue)
else
Source->Update = CalcNonAttnSourceParams;
Source->Mix = MixSource;
// Increment reference counter for buffer
buffer->refcount++;
}
@ -1593,10 +1595,14 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, const A
{
Frequency = buffer->frequency;
Format = buffer->eOriginalFormat;
if(aluChannelsFromFormat(buffer->format) == 1)
Source->Update = CalcSourceParams;
else
Source->Update = CalcNonAttnSourceParams;
Source->Mix = MixSource;
Source->NeedsUpdate = AL_TRUE;
}
else if(Frequency != buffer->frequency || Format != buffer->eOriginalFormat)