Mercurial > mplayer.hg
changeset 13721:0c2e5c9476df
sine sweep generator
author | michael |
---|---|
date | Thu, 21 Oct 2004 12:10:55 +0000 |
parents | 821f464b4d90 |
children | 1bd6bd13193d |
files | libaf/Makefile libaf/af.c libaf/af_sweep.c |
diffstat | 3 files changed, 98 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libaf/Makefile Thu Oct 21 11:55:20 2004 +0000 +++ b/libaf/Makefile Thu Oct 21 12:10:55 2004 +0000 @@ -2,7 +2,7 @@ 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)
--- a/libaf/af.c Thu Oct 21 11:55:20 2004 +0000 +++ b/libaf/af.c Thu Oct 21 12:10:55 2004 +0000 @@ -26,6 +26,7 @@ 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 @@ #ifdef USE_LIBAVCODEC &af_info_lavcresample, #endif + &af_info_sweep, NULL };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libaf/af_sweep.c Thu Oct 21 12:10:55 2004 +0000 @@ -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 +}; +