# HG changeset patch # User alex # Date 1107171961 0 # Node ID 7b7c94b5e78ad16d0e22e08f4bda71a53f0f9e61 # Parent 108fcc2e5d01cec8295bdb6bafc82aab58a649d1 now supports float based operation aswell diff -r 108fcc2e5d01 -r 7b7c94b5e78a libaf/af_extrastereo.c --- 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));