From cb238f7ed3e603a77ed7b908248e634348fdc4f7 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 3 Aug 2014 15:38:58 -0600 Subject: [PATCH] resampling optimisation --- .../xcshareddata/QuakeSpasm.xccheckout | 41 ++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 37356 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../xcschemes/xcschememanagement.plist | 14 ++ Quake/q_sound.h | 1 + Quake/snd_dma.c | 4 +- Quake/snd_mix.c | 184 ++++++++++-------- 7 files changed, 169 insertions(+), 80 deletions(-) create mode 100644 MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcshareddata/QuakeSpasm.xccheckout create mode 100644 MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcuserdata/ericwa.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcshareddata/QuakeSpasm.xccheckout b/MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcshareddata/QuakeSpasm.xccheckout new file mode 100644 index 00000000..9cd610af --- /dev/null +++ b/MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcshareddata/QuakeSpasm.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 9B8B3A85-F6C1-4D37-B6BC-7F34FBF23BF8 + IDESourceControlProjectName + QuakeSpasm + IDESourceControlProjectOriginsDictionary + + 2BD2BDEE-EFDD-4965-A751-0185457382EC + https://github.com/ericwa/Quakespasm + + IDESourceControlProjectPath + MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + 2BD2BDEE-EFDD-4965-A751-0185457382EC + ../../.. + + IDESourceControlProjectURL + https://github.com/ericwa/Quakespasm + IDESourceControlProjectVersion + 110 + IDESourceControlProjectWCCIdentifier + 2BD2BDEE-EFDD-4965-A751-0185457382EC + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 2BD2BDEE-EFDD-4965-A751-0185457382EC + IDESourceControlWCCName + quakespasm + + + + diff --git a/MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcuserdata/ericwa.xcuserdatad/UserInterfaceState.xcuserstate b/MacOSX/QuakeSpasm.xcodeproj/project.xcworkspace/xcuserdata/ericwa.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..44cf0ab373511155a9e206afdec956ef102d1f7d GIT binary patch literal 37356 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 literal 0 HcmV?d00001 diff --git a/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..fe2b4541 --- /dev/null +++ b/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcschemes/xcschememanagement.plist b/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..36a83cff --- /dev/null +++ b/MacOSX/QuakeSpasm.xcodeproj/xcuserdata/ericwa.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SuppressBuildableAutocreation + + 8D1107260486CEB800E47090 + + primary + + + + + diff --git a/Quake/q_sound.h b/Quake/q_sound.h index 7e560717..eaf838df 100644 --- a/Quake/q_sound.h +++ b/Quake/q_sound.h @@ -169,6 +169,7 @@ extern vec3_t listener_up; extern cvar_t sndspeed; extern cvar_t snd_mixspeed; +extern cvar_t snd_filterquality; extern cvar_t sfxvolume; extern cvar_t loadas8bit; diff --git a/Quake/snd_dma.c b/Quake/snd_dma.c index 542a0b65..5e685c6d 100644 --- a/Quake/snd_dma.c +++ b/Quake/snd_dma.c @@ -77,6 +77,7 @@ cvar_t loadas8bit = {"loadas8bit", "0", CVAR_NONE}; cvar_t sndspeed = {"sndspeed", "11025", CVAR_NONE}; cvar_t snd_mixspeed = {"snd_mixspeed", "44100", CVAR_NONE}; +cvar_t snd_filterquality = {"snd_filterquality", "1", CVAR_NONE}; static cvar_t nosound = {"nosound", "0", CVAR_NONE}; static cvar_t ambient_level = {"ambient_level", "0.3", CVAR_NONE}; @@ -163,7 +164,8 @@ void S_Init (void) Cvar_RegisterVariable(&_snd_mixahead); Cvar_RegisterVariable(&sndspeed); Cvar_RegisterVariable(&snd_mixspeed); - + Cvar_RegisterVariable(&snd_filterquality); + if (safemode || COM_CheckParm("-nosound")) return; diff --git a/Quake/snd_mix.c b/Quake/snd_mix.c index 6d555b8a..4bdb212c 100644 --- a/Quake/snd_mix.c +++ b/Quake/snd_mix.c @@ -156,6 +156,7 @@ S_MakeBlackmanWindowKernel Based on equation 16-4 from "The Scientist and Engineer's Guide to Digital Signal Processing" +M must be even kernel has room for M+1 floats, f_c is the filter cutoff frequency, as a fraction of the samplerate ============== @@ -192,95 +193,124 @@ static void S_MakeBlackmanWindowKernel(float *kernel, int M, float f_c) } } -// must be divisible by 4 -#define FILTER_KERNEL_SIZE 384 +typedef struct { + float *memory; // kernelsize floats + float *kernel; // kernelsize floats + int kernelsize; // M+1, padded to be a multiple of 16 + int M; + int parity; // 0-3 + float f_c; +} filter_t; + +static void S_UpdateFilter(filter_t *filter, int M, float f_c) +{ + if (filter->f_c != f_c || filter->M != M) + { + if (filter->memory != NULL) free(filter->memory); + if (filter->kernel != NULL) free(filter->kernel); + + filter->M = M; + filter->f_c = f_c; + + filter->parity = 0; + if ((M + 1) % 16 == 0) + filter->kernelsize = (M + 1); + else + filter->kernelsize = (M + 1) + 16 - ((M + 1) % 16); + filter->memory = calloc(filter->kernelsize, sizeof(float)); + filter->kernel = calloc(filter->kernelsize, sizeof(float)); + + S_MakeBlackmanWindowKernel(filter->kernel, M, f_c); + } +} + +static void S_ApplyFilter(filter_t *filter, int *data, int stride, int count) +{ + int i, j; + float *input; + const int kernelsize = filter->kernelsize; + const float *kernel = filter->kernel; + int parity = 0; + + input = malloc(sizeof(float) * (filter->kernelsize + count)); + +// set up the input buffer +// memory holds the previous filter->kernelsize samples of input. + + memcpy(input, filter->memory, filter->kernelsize * sizeof(float)); + + for (i=0; ikernelsize+i] = data[i * stride] / (32768.0 * 256.0); + } + +// copy out the last filter->kernelsize samples to 'memory' for next time + + memcpy(filter->memory, input + count, filter->kernelsize * sizeof(float)); + +// apply the filter + + for (i=0; iparity = parity; + + free(input); +} /* ============== S_LowpassFilter lowpass filters 24-bit integer samples in 'data' (stored in 32-bit ints). - -f_c is the filter cutoff frequency, as a fraction of the samplerate memory must be an array of FILTER_KERNEL_SIZE floats ============== */ -static void S_LowpassFilter(float f_c, int *data, int stride, int count, - float *memory) +static void S_LowpassFilter(int *data, int stride, int count, + filter_t *memory) { - int i; + int M; + float bw; -// M is the "kernel size" parameter for makekernel() - must be even. -// FILTER_KERNEL_SIZE size is M+1, rounded up to be divisible by 4 - const int M = FILTER_KERNEL_SIZE - 2; - - float input[FILTER_KERNEL_SIZE + count]; - - static float kernel[FILTER_KERNEL_SIZE]; - static float kernel_fc; - - if (f_c <= 0 || f_c > 0.5) - return; - - if (count < FILTER_KERNEL_SIZE) + if (snd_filterquality.value == 0) { - Con_Warning("S_LowpassFilter: not enough samples"); - return; + M = 126; + bw = 0.90; + } + else + { + M = 222; + bw = 0.96; } -// prepare the kernel + float f_c = (bw * 11025 / 2.0) / 44100.0; - if (kernel_fc != f_c) - { - S_MakeBlackmanWindowKernel(kernel, M, f_c); - kernel_fc = f_c; - } + S_UpdateFilter(memory, M, f_c); -// set up the input buffer -// memory holds the previous FILTER_KERNEL_SIZE samples of input. - - for (i=0; ispeed) + if (sndspeed.value == 11025 && shm->speed == 44100) { - static float memory_l[FILTER_KERNEL_SIZE]; - static float memory_r[FILTER_KERNEL_SIZE]; - - const float cutoff_freq = (sndspeed.value * 0.5 * 0.96) / shm->speed; - - S_LowpassFilter(cutoff_freq, (int *)paintbuffer, 2, end - paintedtime, memory_l); - S_LowpassFilter(cutoff_freq, ((int *)paintbuffer) + 1, 2, end - paintedtime, memory_r); + static filter_t memory_l, memory_r; + S_LowpassFilter((int *)paintbuffer, 2, end - paintedtime, &memory_l); + S_LowpassFilter(((int *)paintbuffer) + 1, 2, end - paintedtime, &memory_r); } // paint in the music