[MPlayer-cvslog] CVS: main/libaf af_extrastereo.c,1.4,1.5

Alex Beregszaszi syncmail at mplayerhq.hu
Mon Jan 31 12:46:04 CET 2005


CVS change done by Alex Beregszaszi

Update of /cvsroot/mplayer/main/libaf
In directory mail:/var2/tmp/cvs-serv30874

Modified Files:
	af_extrastereo.c 
Log Message:
now supports float based operation aswell

Index: af_extrastereo.c
===================================================================
RCS file: /cvsroot/mplayer/main/libaf/af_extrastereo.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- af_extrastereo.c	27 Dec 2004 17:30:13 -0000	1.4
+++ af_extrastereo.c	31 Jan 2005 11:46:01 -0000	1.5
@@ -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));




More information about the MPlayer-cvslog mailing list