diff options
-rw-r--r-- | Alc/mixvoice.cpp | 18 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 11 | ||||
-rw-r--r-- | OpenAL32/Include/alu.h | 5 |
3 files changed, 18 insertions, 16 deletions
diff --git a/Alc/mixvoice.cpp b/Alc/mixvoice.cpp index 78ceea26..9ba5079e 100644 --- a/Alc/mixvoice.cpp +++ b/Alc/mixvoice.cpp @@ -284,10 +284,9 @@ const ALfloat *DoFilters(BiquadFilter *lpfilter, BiquadFilter *hpfilter, } // namespace /* This function uses these device temp buffers. */ -#define SOURCE_DATA_BUF 0 -#define RESAMPLED_BUF 1 -#define FILTERED_BUF 2 -#define NFC_DATA_BUF 3 +#define RESAMPLED_BUF 0 +#define FILTERED_BUF 1 +#define NFC_DATA_BUF 2 ALboolean MixSource(ALvoice *voice, const ALuint SourceID, ALCcontext *Context, const ALsizei SamplesToDo) { ASSUME(SamplesToDo > 0); @@ -373,10 +372,11 @@ ALboolean MixSource(ALvoice *voice, const ALuint SourceID, ALCcontext *Context, /* +1 to get the src sample count, include padding. */ DataSize64 += 1 + MAX_RESAMPLE_PADDING*2; - auto SrcBufferSize = static_cast<ALsizei>(mini64(DataSize64, BUFFERSIZE+1)); - if(SrcBufferSize > BUFFERSIZE) + auto SrcBufferSize = static_cast<ALsizei>( + mini64(DataSize64, BUFFERSIZE + MAX_RESAMPLE_PADDING*2 + 1)); + if(SrcBufferSize > BUFFERSIZE + MAX_RESAMPLE_PADDING*2) { - SrcBufferSize = BUFFERSIZE; + SrcBufferSize = BUFFERSIZE + MAX_RESAMPLE_PADDING*2; /* If the source buffer got saturated, we can't fill the desired * dst size. Figure out how many samples we can actually mix from * this. @@ -397,7 +397,7 @@ ALboolean MixSource(ALvoice *voice, const ALuint SourceID, ALCcontext *Context, for(ALsizei chan{0};chan < NumChannels;chan++) { - ALfloat (&SrcData)[BUFFERSIZE] = Device->TempBuffer[SOURCE_DATA_BUF]; + auto &SrcData = Device->SourceData; /* Load the previous samples into the source data first, and clear the rest. */ auto srciter = std::copy(std::begin(voice->PrevSamples[chan]), @@ -553,7 +553,7 @@ ALboolean MixSource(ALvoice *voice, const ALuint SourceID, ALCcontext *Context, * be desirable. */ const ALfloat hfscale{(chan==0) ? voice->AmbiScales[0] : voice->AmbiScales[1]}; - ALfloat (&hfbuf)[BUFFERSIZE] = Device->TempBuffer[SOURCE_DATA_BUF]; + ALfloat (&hfbuf)[BUFFERSIZE] = Device->TempBuffer[FILTERED_BUF]; ALfloat (&lfbuf)[BUFFERSIZE] = Device->TempBuffer[RESAMPLED_BUF]; voice->AmbiSplitter[chan].process(hfbuf, lfbuf, ResampledData, DstBufferSize); diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index b696d7d9..f5d25926 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -547,7 +547,13 @@ struct BFChannelConfig { * to be a sensible size, however, as it constrains the max stepping value used * for mixing, as well as the maximum number of samples per mixing iteration. */ -#define BUFFERSIZE 2048 +#define BUFFERSIZE 1024 + +/* Maximum number of samples to pad on either end of a buffer for resampling. + * Note that both the beginning and end need padding! + */ +#define MAX_RESAMPLE_PADDING 24 + struct MixParams { /* Coefficient channel mapping for mixing to the buffer. */ @@ -632,7 +638,8 @@ struct ALCdevice { std::chrono::nanoseconds FixedLatency{0}; /* Temp storage used for mixer processing. */ - alignas(16) ALfloat TempBuffer[4][BUFFERSIZE]; + alignas(16) ALfloat SourceData[BUFFERSIZE + MAX_RESAMPLE_PADDING*2]; + alignas(16) ALfloat TempBuffer[3][BUFFERSIZE]; /* Mixing buffer used by the Dry mix, FOAOut, and Real out. */ al::vector<std::array<ALfloat,BUFFERSIZE>, 16> MixBuffer; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 6713c490..13362dea 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -31,11 +31,6 @@ enum class DistanceModel; #define MAX_PITCH 255 #define MAX_SENDS 16 -/* Maximum number of samples to pad on either end of a buffer for resampling. - * Note that both the beginning and end need padding! - */ -#define MAX_RESAMPLE_PADDING 24 - struct BSincTable; struct ALsource; |