Skip to content
Permalink
Browse files

audio: Replaced the resampler. Again.

This time it's using real math from a real whitepaper instead of my previous
amateur, fast-but-low-quality attempt. The new resampler does "bandlimited
interpolation," as described here: https://ccrma.stanford.edu/~jos/resample/

The output appears to sound cleaner, especially at high frequencies, and of
course works with non-power-of-two rate conversions.

There are some obvious optimizations to be done to this still, and there is
other fallout: this doesn't resample a buffer in-place, the 2-channels-Sint16
fast path is gone because this resampler does a _lot_ of floating point math.
There is a nasty hack to make it work with SDL_AudioCVT.

It's possible these issues are solvable, but they aren't solved as of yet.
Still, I hope this effort is slouching in the right direction.
  • Loading branch information
icculus committed Sep 21, 2017
1 parent 3c45e66 commit 1a3b95a11e54ed46950d56347dd0211973ab122f
Showing with 400 additions and 264 deletions.
  1. +2 −0 src/audio/SDL_audio.c
  2. +5 −0 src/audio/SDL_audio_c.h
  3. +183 −264 src/audio/SDL_audiocvt.c
  4. +210 −0 src/audio/kaiser_window.pl
@@ -1543,6 +1543,8 @@ SDL_AudioQuit(void)
#ifdef HAVE_LIBSAMPLERATE_H
UnloadLibSampleRate();
#endif

SDL_FreeResampleFilter();
}

#define NUM_FORMATS 10
@@ -69,6 +69,11 @@ extern SDL_AudioFilter SDL_Convert_F32_to_S16;
extern SDL_AudioFilter SDL_Convert_F32_to_U16;
extern SDL_AudioFilter SDL_Convert_F32_to_S32;

/* You need to call SDL_PrepareResampleFilter() before using the internal resampler.
SDL_AudioQuit() calls SDL_FreeResamplerFilter(), you should never call it yourself. */
int SDL_PrepareResampleFilter(void);
void SDL_FreeResampleFilter(void);


/* SDL_AudioStream is a new audio conversion interface. It
might eventually become a public API.

0 comments on commit 1a3b95a

Please sign in to comment.