summaryrefslogtreecommitdiffstats
path: root/libaf
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-31 11:46:01 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-31 11:46:01 +0000
commitbf4b07cf12b689519b0a45263245980b6a7970ad (patch)
tree5c17da0cfde0041e5f54691c8c09d8e168b7d309 /libaf
parent4ec530c8a07ca6550e61b4e03af9d90efb3d2b2d (diff)
downloadmpv-bf4b07cf12b689519b0a45263245980b6a7970ad.tar.bz2
mpv-bf4b07cf12b689519b0a45263245980b6a7970ad.tar.xz
now supports float based operation aswell
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14625 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf')
-rw-r--r--libaf/af_extrastereo.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/libaf/af_extrastereo.c b/libaf/af_extrastereo.c
index f04ef080f7..6342e677d4 100644
--- a/libaf/af_extrastereo.c
+++ b/libaf/af_extrastereo.c
@@ -25,22 +25,35 @@ typedef struct af_extrastereo_s
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 @@ static void uninit(struct af_instance_s* af)
}
// 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 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data)
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));