summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libaf/Makefile2
-rw-r--r--libaf/af.c2
-rw-r--r--libaf/af_sweep.c95
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
+};
+