diff options
author | Chris Robinson <[email protected]> | 2017-04-21 00:06:40 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2017-04-21 00:06:40 -0700 |
commit | 26b49c54afb9868115e495098ce69f2d2487c932 (patch) | |
tree | 9b0fb3d3c22ed4223839da3a40c5e71bf0f29174 | |
parent | 1e8ea59564d4082e164f2a7707df90b00f48a35b (diff) |
Store the resampler as part of the source
-rw-r--r-- | Alc/ALu.c | 2 | ||||
-rw-r--r-- | Alc/mixer.c | 4 | ||||
-rw-r--r-- | OpenAL32/Include/alSource.h | 1 | ||||
-rw-r--r-- | OpenAL32/Include/alu.h | 30 | ||||
-rw-r--r-- | OpenAL32/alSource.c | 2 |
5 files changed, 22 insertions, 17 deletions
@@ -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; |