[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