Skip to content

Commit

Permalink
resampler: Work at double precision on x86-64 machines.
Browse files Browse the repository at this point in the history
We get audio artifacts if we don't work at the higher precision, but
this is painful on CPUs that have to use a software fallback for this,
so for now (that is, until we have a better solution), get better output
on amd64 chips, where the cost is less painful.
  • Loading branch information
icculus committed Feb 21, 2023
1 parent 357bc8c commit 1e5e8e2
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/audio/SDL_audiocvt.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,10 +278,18 @@ static int SDL_ResampleAudio(const int chans, const int inrate, const int outrat
const float *inbuf, const int inbuflen,
float *outbuf, const int outbuflen)
{
/* !!! FIXME: this produces artifacts if we don't work at double precision, but this turns out to
be a big performance hit. Until we can resolve this better, we force this to double
for amd64 CPUs, which should be able to take the hit for now, vs small embedded
things that might end up in a software fallback here. */
/* Note that this used to be double, but it looks like we can get by with float in most cases at
almost twice the speed on Intel processors, and orders of magnitude more
on CPUs that need a software fallback for double calculations. */
#if defined(_M_X64) || defined(__x86_64__)
typedef double ResampleFloatType;
#else
typedef float ResampleFloatType;
#endif

const ResampleFloatType finrate = (ResampleFloatType)inrate;
const ResampleFloatType ratio = ((float)outrate) / ((float)inrate);
Expand Down

0 comments on commit 1e5e8e2

Please # to comment.