diff options
Diffstat (limited to 'libaf/af_format.c')
-rw-r--r-- | libaf/af_format.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/libaf/af_format.c b/libaf/af_format.c index 2777fdbc42..2969455ac1 100644 --- a/libaf/af_format.c +++ b/libaf/af_format.c @@ -3,6 +3,9 @@ AFMT_U16_LE, AFMT_U16_BE, AFMT_S32_LE and AFMT_S32_BE. */ +// Must be defined before any libc headers are included! +#define _ISOC9X_SOURCE + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -14,6 +17,14 @@ #include "../bswap.h" #include "../libvo/fastmemcpy.h" +// Integer to float conversion through lrintf() +#ifdef HAVE_LRINTF +#include <math.h> +long int lrintf(float); +#else +#define lrintf(x) ((int)(x)) +#endif + /* Functions used by play to convert the input audio to the correct format */ @@ -31,9 +42,9 @@ static void us2si(void* in, void* out, int len, int bps); // Change the number of bits per sample static void change_bps(void* in, void* out, int len, int inbps, int outbps); // From float to int signed -static void float2int(void* in, void* out, int len, int bps); +static void float2int(float* in, void* out, int len, int bps); // From signed int to float -static void int2float(void* in, void* out, int len, int bps); +static void int2float(void* in, float* out, int len, int bps); static af_data_t* play(struct af_instance_s* af, af_data_t* data); static af_data_t* play_swapendian(struct af_instance_s* af, af_data_t* data); @@ -488,48 +499,48 @@ static void change_bps(void* in, void* out, int len, int inbps, int outbps) } } -static void float2int(void* in, void* out, int len, int bps) +static void float2int(float* in, void* out, int len, int bps) { register int i; switch(bps){ case(1): for(i=0;i<len;i++) - ((int8_t*)out)[i] = (int)(127.0 * (1.0+((float*)in)[i])) - 127; + ((int8_t*)out)[i] = lrintf(127.0 * in[i]); break; case(2): for(i=0;i<len;i++) - ((int16_t*)out)[i] = (int)(32767.0 * (1.0+((float*)in)[i])) - 32767; + ((int16_t*)out)[i] = lrintf(32767.0 * in[i]); break; case(3): for(i=0;i<len;i++) - store24bit(out, i, (int)(2147483647.0 * (1.0+((float*)in)[i])) - 2147483647); + store24bit(out, i, lrintf(2147483647.0 * in[i])); break; case(4): for(i=0;i<len;i++) - ((int32_t*)out)[i] = (int)(2147483647.0 * (1.0+((float*)in)[i])) - 2147483647; + ((int32_t*)out)[i] = lrintf(2147483647.0 * in[i]); break; } } -static void int2float(void* in, void* out, int len, int bps) +static void int2float(void* in, float* out, int len, int bps) { register int i; switch(bps){ case(1): for(i=0;i<len;i++) - ((float*)out)[i]=(1.0/128.0)*((float)((int8_t*)in)[i]); + out[i]=(1.0/128.0)*((int8_t*)in)[i]; break; case(2): for(i=0;i<len;i++) - ((float*)out)[i]=(1.0/32768.0)*((float)((int16_t*)in)[i]); + out[i]=(1.0/32768.0)*((int16_t*)in)[i]; break; case(3): for(i=0;i<len;i++) - ((float*)out)[i]=(1.0/2147483648.0)*((float)((int32_t)load24bit(in, i))); + out[i]=(1.0/2147483648.0)*((int32_t)load24bit(in, i)); break; case(4): for(i=0;i<len;i++) - ((float*)out)[i]=(1.0/2147483648.0)*((float)((int32_t*)in)[i]); + out[i]=(1.0/2147483648.0)*((int32_t*)in)[i]; break; } } |