diff options
-rw-r--r-- | libaf/Makefile | 2 | ||||
-rw-r--r-- | libaf/af.c | 2 | ||||
-rw-r--r-- | libaf/af_sweep.c | 95 |
3 files changed, 98 insertions, 1 deletions
diff --git a/libaf/Makefile b/libaf/Makefile index 3eacc3b7f6..abeb2b015f 100644 --- a/libaf/Makefile +++ b/libaf/Makefile @@ -2,7 +2,7 @@ include ../config.mak LIBNAME = libaf.a -SRCS=af.c af_mp.c af_dummy.c af_delay.c af_channels.c af_format.c af_resample.c window.c filter.c af_volume.c af_equalizer.c af_tools.c af_comp.c af_gate.c af_pan.c af_surround.c af_sub.c af_export.c af_volnorm.c af_extrastereo.c af_lavcresample.c +SRCS=af.c af_mp.c af_dummy.c af_delay.c af_channels.c af_format.c af_resample.c window.c filter.c af_volume.c af_equalizer.c af_tools.c af_comp.c af_gate.c af_pan.c af_surround.c af_sub.c af_export.c af_volnorm.c af_extrastereo.c af_lavcresample.c af_sweep.c OBJS=$(SRCS:.c=.o) diff --git a/libaf/af.c b/libaf/af.c index 9189ce0b37..ed9affd37b 100644 --- a/libaf/af.c +++ b/libaf/af.c @@ -26,6 +26,7 @@ extern af_info_t af_info_export; extern af_info_t af_info_volnorm; extern af_info_t af_info_extrastereo; extern af_info_t af_info_lavcresample; +extern af_info_t af_info_sweep; static af_info_t* filter_list[]={ &af_info_dummy, @@ -48,6 +49,7 @@ static af_info_t* filter_list[]={ #ifdef USE_LIBAVCODEC &af_info_lavcresample, #endif + &af_info_sweep, NULL }; diff --git a/libaf/af_sweep.c b/libaf/af_sweep.c new file mode 100644 index 0000000000..ee2c97ddb3 --- /dev/null +++ b/libaf/af_sweep.c @@ -0,0 +1,95 @@ +// Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at> +// #inlcude <GPL_v2.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <inttypes.h> +#include <math.h> + +#include "../config.h" +#include "af.h" + +typedef struct af_sweep_s{ + double x; + double delta; +}af_sweept; + + +// Initialization and runtime control +static int control(struct af_instance_s* af, int cmd, void* arg) +{ + af_sweept* s = (af_sweept*)af->setup; + af_data_t *data= (af_data_t*)arg; + + switch(cmd){ + case AF_CONTROL_REINIT: + if(data->format != (AF_FORMAT_SI | AF_FORMAT_NE)) + return AF_ERROR; + + af->data->nch = data->nch; + af->data->format = AF_FORMAT_SI | AF_FORMAT_NE; + af->data->bps = 2; + af->data->rate = data->rate; + + return AF_OK; + case AF_CONTROL_COMMAND_LINE: + sscanf((char*)arg,"%lf", &s->delta); + return AF_OK; +/* case AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET: + af->data->rate = *(int*)arg; + return AF_OK;*/ + } + return AF_UNKNOWN; +} + +// Deallocate memory +static void uninit(struct af_instance_s* af) +{ + if(af->data) + free(af->data); + if(af->setup){ + af_sweept *s = af->setup; + free(s); + } +} + +// Filter data through filter +static af_data_t* play(struct af_instance_s* af, af_data_t* data) +{ + af_sweept *s = af->setup; + int i, j; + int16_t *in = (int16_t*)data->audio; + int chans = data->nch; + int in_len = data->len/(2*chans); + + for(i=0; i<in_len; i++){ + for(j=0; j<chans; j++) + in[i*chans+j]= 32000*sin(s->x*s->x); + s->x += s->delta; + if(2*s->x*s->delta >= 3.141592) s->x=0; + } + + return data; +} + +static int open(af_instance_t* af){ + af->control=control; + af->uninit=uninit; + af->play=play; + af->mul.n=1; + af->mul.d=1; + af->data=calloc(1,sizeof(af_data_t)); + af->setup=calloc(1,sizeof(af_sweept)); + return AF_OK; +} + +af_info_t af_info_sweep = { + "sine sweep", + "sweep", + "Michael Niedermayer", + "", + AF_FLAGS_REENTRANT, + open +}; + |