changeset 14791:df515839c8a9

100l for me, lrintf is better. now fixed so it should be prototyped, and should work even if there is no prototype
author rfelker
date Thu, 24 Feb 2005 16:48:18 +0000
parents fa645382285f
children 6c12ee26fab9
files libaf/af_format.c
diffstat 1 files changed, 23 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libaf/af_format.c	Thu Feb 24 15:22:04 2005 +0000
+++ b/libaf/af_format.c	Thu Feb 24 16:48:18 2005 +0000
@@ -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 @@
 // 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 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;
   }	
 }