Select the mixer during a source update
This commit is contained in:
parent
913c70557d
commit
1fc44d5788
@ -147,6 +147,10 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Channels = ALBuffer->FmtChannels;
|
Channels = ALBuffer->FmtChannels;
|
||||||
|
|
||||||
|
ALSource->Params.DoMix = ((Device->Flags&DEVICE_USE_HRTF) ?
|
||||||
|
SelectHrtfMixer(ALBuffer, (ALSource->Params.Step==FRACTIONONE)) :
|
||||||
|
SelectMixer(ALBuffer, (ALSource->Params.Step==FRACTIONONE)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferListItem = BufferListItem->next;
|
BufferListItem = BufferListItem->next;
|
||||||
@ -654,6 +658,10 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext)
|
|||||||
if(ALSource->Params.Step == 0)
|
if(ALSource->Params.Step == 0)
|
||||||
ALSource->Params.Step = 1;
|
ALSource->Params.Step = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ALSource->Params.DoMix = ((Device->Flags&DEVICE_USE_HRTF) ?
|
||||||
|
SelectHrtfMixer(ALBuffer, (ALSource->Params.Step==FRACTIONONE)) :
|
||||||
|
SelectMixer(ALBuffer, (ALSource->Params.Step==FRACTIONONE)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
BufferListItem = BufferListItem->next;
|
BufferListItem = BufferListItem->next;
|
||||||
|
76
Alc/mixer.c
76
Alc/mixer.c
@ -383,23 +383,18 @@ DECL_TEMPLATE(ALbyte, cubic8)
|
|||||||
|
|
||||||
|
|
||||||
#define DECL_TEMPLATE(sampler) \
|
#define DECL_TEMPLATE(sampler) \
|
||||||
static void Select_##sampler(ALsource *Source, enum FmtType FmtType) \
|
static MixerFunc Select_##sampler(enum FmtType FmtType) \
|
||||||
{ \
|
{ \
|
||||||
switch(FmtType) \
|
switch(FmtType) \
|
||||||
{ \
|
{ \
|
||||||
case FmtByte: \
|
case FmtByte: \
|
||||||
Source->DoMix = Mix_ALbyte_##sampler##8; \
|
return Mix_ALbyte_##sampler##8; \
|
||||||
Source->DoHrtfMix = Mix_Hrtf_ALbyte_##sampler##8; \
|
|
||||||
break; \
|
|
||||||
case FmtShort: \
|
case FmtShort: \
|
||||||
Source->DoMix = Mix_ALshort_##sampler##16; \
|
return Mix_ALshort_##sampler##16; \
|
||||||
Source->DoHrtfMix = Mix_Hrtf_ALshort_##sampler##16; \
|
|
||||||
break; \
|
|
||||||
case FmtFloat: \
|
case FmtFloat: \
|
||||||
Source->DoMix = Mix_ALfloat_##sampler##32; \
|
return Mix_ALfloat_##sampler##32; \
|
||||||
Source->DoHrtfMix = Mix_Hrtf_ALfloat_##sampler##32; \
|
|
||||||
break; \
|
|
||||||
} \
|
} \
|
||||||
|
return NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DECL_TEMPLATE(point)
|
DECL_TEMPLATE(point)
|
||||||
@ -408,24 +403,59 @@ DECL_TEMPLATE(cubic)
|
|||||||
|
|
||||||
#undef DECL_TEMPLATE
|
#undef DECL_TEMPLATE
|
||||||
|
|
||||||
|
MixerFunc SelectMixer(ALbuffer *Buffer, resampler_t Resampler)
|
||||||
ALvoid SelectMixer(ALsource *Source, ALbuffer *Buffer)
|
|
||||||
{
|
{
|
||||||
switch(Source->Resampler)
|
switch(Resampler)
|
||||||
{
|
{
|
||||||
case POINT_RESAMPLER:
|
case POINT_RESAMPLER:
|
||||||
Select_point(Source, Buffer->FmtType);
|
return Select_point(Buffer->FmtType);
|
||||||
break;
|
|
||||||
case LINEAR_RESAMPLER:
|
case LINEAR_RESAMPLER:
|
||||||
Select_lerp(Source, Buffer->FmtType);
|
return Select_lerp(Buffer->FmtType);
|
||||||
break;
|
|
||||||
case CUBIC_RESAMPLER:
|
case CUBIC_RESAMPLER:
|
||||||
Select_cubic(Source, Buffer->FmtType);
|
return Select_cubic(Buffer->FmtType);
|
||||||
break;
|
|
||||||
case RESAMPLER_MIN:
|
case RESAMPLER_MIN:
|
||||||
case RESAMPLER_MAX:
|
case RESAMPLER_MAX:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DECL_TEMPLATE(sampler) \
|
||||||
|
static MixerFunc Select_Hrtf_##sampler(enum FmtType FmtType) \
|
||||||
|
{ \
|
||||||
|
switch(FmtType) \
|
||||||
|
{ \
|
||||||
|
case FmtByte: \
|
||||||
|
return Mix_Hrtf_ALbyte_##sampler##8; \
|
||||||
|
case FmtShort: \
|
||||||
|
return Mix_Hrtf_ALshort_##sampler##16; \
|
||||||
|
case FmtFloat: \
|
||||||
|
return Mix_Hrtf_ALfloat_##sampler##32; \
|
||||||
|
} \
|
||||||
|
return NULL; \
|
||||||
|
}
|
||||||
|
|
||||||
|
DECL_TEMPLATE(point)
|
||||||
|
DECL_TEMPLATE(lerp)
|
||||||
|
DECL_TEMPLATE(cubic)
|
||||||
|
|
||||||
|
#undef DECL_TEMPLATE
|
||||||
|
|
||||||
|
MixerFunc SelectHrtfMixer(ALbuffer *Buffer, resampler_t Resampler)
|
||||||
|
{
|
||||||
|
switch(Resampler)
|
||||||
|
{
|
||||||
|
case POINT_RESAMPLER:
|
||||||
|
return Select_Hrtf_point(Buffer->FmtType);
|
||||||
|
case LINEAR_RESAMPLER:
|
||||||
|
return Select_Hrtf_lerp(Buffer->FmtType);
|
||||||
|
case CUBIC_RESAMPLER:
|
||||||
|
return Select_Hrtf_cubic(Buffer->FmtType);
|
||||||
|
case RESAMPLER_MIN:
|
||||||
|
case RESAMPLER_MAX:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -656,12 +686,8 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
|
|||||||
BufferSize = min(BufferSize, (SamplesToDo-OutPos));
|
BufferSize = min(BufferSize, (SamplesToDo-OutPos));
|
||||||
|
|
||||||
SrcData += BufferPrePadding*FrameSize;
|
SrcData += BufferPrePadding*FrameSize;
|
||||||
if((Device->Flags&DEVICE_USE_HRTF))
|
Source->Params.DoMix(Source, Device, SrcData, &DataPosInt, &DataPosFrac,
|
||||||
ALsource_DoHrtfMix(Source, Device, SrcData, &DataPosInt, &DataPosFrac,
|
OutPos, SamplesToDo, BufferSize);
|
||||||
OutPos, SamplesToDo, BufferSize);
|
|
||||||
else
|
|
||||||
ALsource_DoMix(Source, Device, SrcData, &DataPosInt, &DataPosFrac,
|
|
||||||
OutPos, SamplesToDo, BufferSize);
|
|
||||||
OutPos += BufferSize;
|
OutPos += BufferSize;
|
||||||
|
|
||||||
/* Handle looping sources */
|
/* Handle looping sources */
|
||||||
|
@ -15,15 +15,6 @@ extern "C" {
|
|||||||
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
|
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
|
||||||
#define SRC_HISTORY_MASK (SRC_HISTORY_LENGTH-1)
|
#define SRC_HISTORY_MASK (SRC_HISTORY_LENGTH-1)
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
POINT_RESAMPLER = 0,
|
|
||||||
LINEAR_RESAMPLER,
|
|
||||||
CUBIC_RESAMPLER,
|
|
||||||
|
|
||||||
RESAMPLER_MAX,
|
|
||||||
RESAMPLER_MIN = -1,
|
|
||||||
RESAMPLER_DEFAULT = LINEAR_RESAMPLER
|
|
||||||
} resampler_t;
|
|
||||||
extern resampler_t DefaultResampler;
|
extern resampler_t DefaultResampler;
|
||||||
|
|
||||||
extern const ALsizei ResamplerPadding[RESAMPLER_MAX];
|
extern const ALsizei ResamplerPadding[RESAMPLER_MAX];
|
||||||
@ -100,6 +91,8 @@ typedef struct ALsource
|
|||||||
|
|
||||||
/* Current target parameters used for mixing */
|
/* Current target parameters used for mixing */
|
||||||
struct {
|
struct {
|
||||||
|
MixerFunc DoMix;
|
||||||
|
|
||||||
ALint Step;
|
ALint Step;
|
||||||
|
|
||||||
ALfloat HrtfCoeffs[MAXCHANNELS][HRIR_LENGTH][2];
|
ALfloat HrtfCoeffs[MAXCHANNELS][HRIR_LENGTH][2];
|
||||||
@ -122,21 +115,11 @@ typedef struct ALsource
|
|||||||
ALboolean NeedsUpdate;
|
ALboolean NeedsUpdate;
|
||||||
|
|
||||||
ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);
|
ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);
|
||||||
ALvoid (*DoMix)(struct ALsource *self, ALCdevice *Device,
|
|
||||||
const ALvoid *RESTRICT data,
|
|
||||||
ALuint *DataPosInt, ALuint *DataPosFrac,
|
|
||||||
ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize);
|
|
||||||
ALvoid (*DoHrtfMix)(struct ALsource *self, ALCdevice *Device,
|
|
||||||
const ALvoid *RESTRICT data,
|
|
||||||
ALuint *DataPosInt, ALuint *DataPosFrac,
|
|
||||||
ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize);
|
|
||||||
|
|
||||||
// Index to itself
|
// Index to itself
|
||||||
ALuint source;
|
ALuint source;
|
||||||
} ALsource;
|
} ALsource;
|
||||||
#define ALsource_Update(s,a) ((s)->Update(s,a))
|
#define ALsource_Update(s,a) ((s)->Update(s,a))
|
||||||
#define ALsource_DoMix(s,a,b,c,d,e,f,g) ((s)->DoMix(s,a,b,c,d,e,f,g))
|
|
||||||
#define ALsource_DoHrtfMix(s,a,b,c,d,e,f,g) ((s)->DoHrtfMix(s,a,b,c,d,e,f,g))
|
|
||||||
|
|
||||||
ALvoid ReleaseALSources(ALCcontext *Context);
|
ALvoid ReleaseALSources(ALCcontext *Context);
|
||||||
|
|
||||||
|
@ -61,6 +61,25 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct ALsource;
|
||||||
|
struct ALbuffer;
|
||||||
|
|
||||||
|
typedef ALvoid (*MixerFunc)(struct ALsource *self, ALCdevice *Device,
|
||||||
|
const ALvoid *RESTRICT data,
|
||||||
|
ALuint *DataPosInt, ALuint *DataPosFrac,
|
||||||
|
ALuint OutPos, ALuint SamplesToDo,
|
||||||
|
ALuint BufferSize);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
POINT_RESAMPLER = 0,
|
||||||
|
LINEAR_RESAMPLER,
|
||||||
|
CUBIC_RESAMPLER,
|
||||||
|
|
||||||
|
RESAMPLER_MAX,
|
||||||
|
RESAMPLER_MIN = -1,
|
||||||
|
RESAMPLER_DEFAULT = LINEAR_RESAMPLER
|
||||||
|
} resampler_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FRONT_LEFT = 0,
|
FRONT_LEFT = 0,
|
||||||
FRONT_RIGHT,
|
FRONT_RIGHT,
|
||||||
@ -110,16 +129,15 @@ static __inline ALdouble cubic(ALdouble val0, ALdouble val1, ALdouble val2, ALdo
|
|||||||
return a0*mu*mu2 + a1*mu2 + a2*mu + a3;
|
return a0*mu*mu2 + a1*mu2 + a2*mu + a3;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ALsource;
|
|
||||||
struct ALbuffer;
|
|
||||||
|
|
||||||
ALvoid aluInitPanning(ALCdevice *Device);
|
ALvoid aluInitPanning(ALCdevice *Device);
|
||||||
ALint aluCart2LUTpos(ALfloat re, ALfloat im);
|
ALint aluCart2LUTpos(ALfloat re, ALfloat im);
|
||||||
|
|
||||||
ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
|
ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
|
||||||
ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
|
ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
|
||||||
|
|
||||||
ALvoid SelectMixer(struct ALsource *Source, struct ALbuffer *Buffer);
|
MixerFunc SelectMixer(struct ALbuffer *Buffer, resampler_t Resampler);
|
||||||
|
MixerFunc SelectHrtfMixer(struct ALbuffer *Buffer, resampler_t Resampler);
|
||||||
|
|
||||||
ALvoid MixSource(struct ALsource *Source, ALCdevice *Device, ALuint SamplesToDo);
|
ALvoid MixSource(struct ALsource *Source, ALCdevice *Device, ALuint SamplesToDo);
|
||||||
|
|
||||||
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
|
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
|
||||||
|
@ -581,7 +581,6 @@ AL_API ALvoid AL_APIENTRY alSourcei(ALuint source,ALenum eParam,ALint lValue)
|
|||||||
Source->Update = CalcSourceParams;
|
Source->Update = CalcSourceParams;
|
||||||
else
|
else
|
||||||
Source->Update = CalcNonAttnSourceParams;
|
Source->Update = CalcNonAttnSourceParams;
|
||||||
SelectMixer(Source, buffer);
|
|
||||||
|
|
||||||
// Increment reference counter for buffer
|
// Increment reference counter for buffer
|
||||||
buffer->refcount++;
|
buffer->refcount++;
|
||||||
@ -1639,7 +1638,6 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei n, const A
|
|||||||
Source->Update = CalcSourceParams;
|
Source->Update = CalcSourceParams;
|
||||||
else
|
else
|
||||||
Source->Update = CalcNonAttnSourceParams;
|
Source->Update = CalcNonAttnSourceParams;
|
||||||
SelectMixer(Source, buffer);
|
|
||||||
|
|
||||||
Source->NeedsUpdate = AL_TRUE;
|
Source->NeedsUpdate = AL_TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user