resampler: Work at double precision on x86-64 machines.
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.main
parent
357bc8ca5c
commit
1e5e8e2fda
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue