From bf4b07cf12b689519b0a45263245980b6a7970ad Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 31 Jan 2005 11:46:01 +0000 Subject: now supports float based operation aswell git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14625 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libaf/af_extrastereo.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) (limited to 'libaf') 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)); -- cgit v1.2.3