aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2017-04-21 00:06:40 -0700
committerChris Robinson <[email protected]>2017-04-21 00:06:40 -0700
commit26b49c54afb9868115e495098ce69f2d2487c932 (patch)
tree9b0fb3d3c22ed4223839da3a40c5e71bf0f29174
parent1e8ea59564d4082e164f2a7707df90b00f48a35b (diff)
Store the resampler as part of the source
-rw-r--r--Alc/ALu.c2
-rw-r--r--Alc/mixer.c4
-rw-r--r--OpenAL32/Include/alSource.h1
-rw-r--r--OpenAL32/Include/alu.h30
-rw-r--r--OpenAL32/alSource.c2
5 files changed, 22 insertions, 17 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 065371d1..baa94148 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -455,6 +455,7 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p
else
voice->Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1);
BsincPrepare(voice->Step, &voice->ResampleState.bsinc);
+ voice->Resampler = SelectResampler(props->Resampler);
/* Calculate gains */
DryGain = clampf(SourceVolume, MinVolume, MaxVolume);
@@ -1095,6 +1096,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
else
voice->Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1);
BsincPrepare(voice->Step, &voice->ResampleState.bsinc);
+ voice->Resampler = SelectResampler(props->Resampler);
voice->Flags &= ~(VOICE_IS_HRTF | VOICE_HAS_NFC);
if(Device->Render_Mode == HrtfRender)
diff --git a/Alc/mixer.c b/Alc/mixer.c
index b1d014a7..2070f859 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -53,7 +53,6 @@ enum Resampler ResamplerDefault = LinearResampler;
static MixerFunc MixSamples = Mix_C;
static HrtfMixerFunc MixHrtfSamples = MixHrtf_C;
-static ResamplerFunc ResampleSamples = Resample_point32_C;
MixerFunc SelectMixer(void)
{
@@ -177,7 +176,6 @@ void aluInitMixer(void)
MixHrtfSamples = SelectHrtfMixer();
MixSamples = SelectMixer();
- ResampleSamples = SelectResampler(ResamplerDefault);
}
@@ -295,7 +293,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei
IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0);
Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ?
- Resample_copy32_C : ResampleSamples);
+ Resample_copy32_C : voice->Resampler);
Counter = (voice->Flags&VOICE_IS_MOVING) ? SamplesToDo : 0;
OutPos = 0;
diff --git a/OpenAL32/Include/alSource.h b/OpenAL32/Include/alSource.h
index d069abcd..f9cbc55b 100644
--- a/OpenAL32/Include/alSource.h
+++ b/OpenAL32/Include/alSource.h
@@ -43,6 +43,7 @@ typedef struct ALsource {
ALboolean HeadRelative;
ALboolean Looping;
enum DistanceModel DistanceModel;
+ enum Resampler Resampler;
ALboolean DirectChannels;
ALboolean DryGainHFAuto;
diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h
index 9b267d15..071ef3d2 100644
--- a/OpenAL32/Include/alu.h
+++ b/OpenAL32/Include/alu.h
@@ -40,6 +40,14 @@ struct ALvoice;
struct ALeffectslot;
+enum Resampler {
+ PointResampler,
+ LinearResampler,
+ FIR4Resampler,
+ BSincResampler,
+};
+extern enum Resampler ResamplerDefault;
+
/* The number of distinct scale and phase intervals within the filter table. */
#define BSINC_SCALE_BITS 4
#define BSINC_SCALE_COUNT (1<<BSINC_SCALE_BITS)
@@ -66,6 +74,11 @@ typedef union InterpState {
BsincState bsinc;
} InterpState;
+typedef const ALfloat* (*ResamplerFunc)(const InterpState *state,
+ const ALfloat *restrict src, ALsizei frac, ALint increment,
+ ALfloat *restrict dst, ALsizei dstlen
+);
+
typedef union aluVector {
alignas(16) ALfloat v[4];
@@ -172,6 +185,7 @@ struct ALvoiceProps {
ALfloat Orientation[2][3];
ALboolean HeadRelative;
enum DistanceModel DistanceModel;
+ enum Resampler Resampler;
ALboolean DirectChannels;
ALboolean DryGainHFAuto;
@@ -245,6 +259,8 @@ typedef struct ALvoice {
/** Current target parameters used for mixing. */
ALint Step;
+ ResamplerFunc Resampler;
+
ALuint Flags;
ALuint Offset; /* Number of output samples mixed since starting. */
@@ -272,11 +288,6 @@ typedef struct ALvoice {
void DeinitVoice(ALvoice *voice);
-typedef const ALfloat* (*ResamplerFunc)(const InterpState *state,
- const ALfloat *restrict src, ALsizei frac, ALint increment,
- ALfloat *restrict dst, ALsizei dstlen
-);
-
typedef void (*MixerFunc)(const ALfloat *data, ALsizei OutChans,
ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALfloat *CurrentGains,
const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos,
@@ -364,21 +375,12 @@ inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat v
}
-enum Resampler {
- PointResampler,
- LinearResampler,
- FIR4Resampler,
- BSincResampler,
-};
-extern enum Resampler ResamplerDefault;
-
enum HrtfRequestMode {
Hrtf_Default = 0,
Hrtf_Enable = 1,
Hrtf_Disable = 2,
};
-
void aluInitMixer(void);
MixerFunc SelectMixer(void);
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 757c96db..1caea5ef 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -2946,6 +2946,7 @@ static void InitSourceParams(ALsource *Source, ALsizei num_sends)
Source->HeadRelative = AL_FALSE;
Source->Looping = AL_FALSE;
Source->DistanceModel = DefaultDistanceModel;
+ Source->Resampler = ResamplerDefault;
Source->DirectChannels = AL_FALSE;
Source->StereoPan[0] = DEG2RAD( 30.0f);
@@ -3054,6 +3055,7 @@ static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_send
}
props->HeadRelative = source->HeadRelative;
props->DistanceModel = source->DistanceModel;
+ props->Resampler = source->Resampler;
props->DirectChannels = source->DirectChannels;
props->DryGainHFAuto = source->DryGainHFAuto;