changeset 14624:7b7c94b5e78a

now supports float based operation aswell
author alex
date Mon, 31 Jan 2005 11:46:01 +0000
parents 108fcc2e5d01
children e85e3894520f
files libaf/af_extrastereo.c
diffstat 1 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/libaf/af_extrastereo.c	Mon Jan 31 11:43:36 2005 +0000
+++ b/libaf/af_extrastereo.c	Mon Jan 31 11:46:01 2005 +0000
@@ -25,22 +25,35 @@
     float mul;
 }af_extrastereo_t;
 
+static af_data_t* play_s16(struct af_instance_s* af, af_data_t* data);
+static af_data_t* play_float(struct af_instance_s* af, af_data_t* data);
+
 // Initialization and runtime control
 static int control(struct af_instance_s* af, int cmd, void* arg)
 {
   af_extrastereo_t* s   = (af_extrastereo_t*)af->setup; 
 
   switch(cmd){
-  case AF_CONTROL_REINIT:
+  case AF_CONTROL_REINIT:{
     // Sanity check
     if(!arg) return AF_ERROR;
     
     af->data->rate   = ((af_data_t*)arg)->rate;
     af->data->nch    = 2;
-    af->data->format = AF_FORMAT_S16_NE;
-    af->data->bps    = 2;
+    if (((af_data_t*)arg)->format == AF_FORMAT_FLOAT_NE)
+    {
+	af->data->format = AF_FORMAT_FLOAT_NE;
+	af->data->bps = 4;
+	af->play = play_float;
+    }// else
+    {
+	af->data->format = AF_FORMAT_S16_NE;
+	af->data->bps = 2;
+	af->play = play_s16;
+    }
 
     return af_test_output(af,(af_data_t*)arg);
+  }
   case AF_CONTROL_COMMAND_LINE:{
     float f;
     sscanf((char*)arg,"%f", &f);
@@ -67,7 +80,7 @@
 }
 
 // Filter data through filter
-static af_data_t* play(struct af_instance_s* af, af_data_t* data)
+static af_data_t* play_s16(struct af_instance_s* af, af_data_t* data)
 {
   af_extrastereo_t *s = af->setup;
   register int i = 0;
@@ -89,11 +102,33 @@
   return data;
 }
 
+static af_data_t* play_float(struct af_instance_s* af, af_data_t* data)
+{
+  af_extrastereo_t *s = af->setup;
+  register int i = 0;
+  float *a = (float*)data->audio;	// Audio data
+  int len = data->len/4;		// Number of samples
+  float avg, l, r;
+  
+  for (i = 0; i < len; i+=2)
+  {
+    avg = (a[i] + a[i + 1]) / 2;
+    
+    l = avg + (s->mul * (a[i] - avg));
+    r = avg + (s->mul * (a[i + 1] - avg));
+    
+    a[i] = af_softclip(l);
+    a[i + 1] = af_softclip(r);
+  }
+
+  return data;
+}
+
 // Allocate memory and set function pointers
 static int open(af_instance_t* af){
   af->control=control;
   af->uninit=uninit;
-  af->play=play;
+  af->play=play_s16;
   af->mul.n=1;
   af->mul.d=1;
   af->data=calloc(1,sizeof(af_data_t));