diff options
author | reynaldo <reynaldo@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-05-13 08:46:31 +0000 |
---|---|---|
committer | reynaldo <reynaldo@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-05-13 08:46:31 +0000 |
commit | d6081d2977c71f61a47077dccd78d0ed54956147 (patch) | |
tree | d0b08816e78c69f997512764e43fd9ddd11de90a /libaf | |
parent | 963e5e2cf5c348b82b4f1c707b63f6b49ec497b8 (diff) | |
download | mpv-d6081d2977c71f61a47077dccd78d0ed54956147.tar.bz2 mpv-d6081d2977c71f61a47077dccd78d0ed54956147.tar.xz |
New karaoke af
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18471 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf')
-rw-r--r-- | libaf/Makefile | 1 | ||||
-rw-r--r-- | libaf/af.c | 2 | ||||
-rw-r--r-- | libaf/af_karaoke.c | 86 |
3 files changed, 89 insertions, 0 deletions
diff --git a/libaf/Makefile b/libaf/Makefile index 62419e88df..677df09625 100644 --- a/libaf/Makefile +++ b/libaf/Makefile @@ -14,6 +14,7 @@ SRCS=af.c \ af_format.c \ af_gate.c \ af_hrtf.c \ + af_karaoke.c \ af_pan.c \ af_resample.c \ af_sinesupress.c \ diff --git a/libaf/af.c b/libaf/af.c index 5e867c3486..c5c039c7ae 100644 --- a/libaf/af.c +++ b/libaf/af.c @@ -30,6 +30,7 @@ extern af_info_t af_info_hrtf; extern af_info_t af_info_ladspa; extern af_info_t af_info_center; extern af_info_t af_info_sinesupress; +extern af_info_t af_info_karaoke; static af_info_t* filter_list[]={ &af_info_dummy, @@ -59,6 +60,7 @@ static af_info_t* filter_list[]={ #endif &af_info_center, &af_info_sinesupress, + &af_info_karaoke, NULL }; diff --git a/libaf/af_karaoke.c b/libaf/af_karaoke.c new file mode 100644 index 0000000000..0b3666faed --- /dev/null +++ b/libaf/af_karaoke.c @@ -0,0 +1,86 @@ +/* + (c)2006 MPlayer / Reynaldo H. Verdejo Pinochet + Based on code by Alex Beregszaszi for his 'center' filter + + License: GPL + + Simple voice removal filter +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "af.h" + +// Data for specific instances of this filter + +// Initialization and runtime control +static int control(struct af_instance_s* af, int cmd, void* arg) +{ + switch(cmd){ + case AF_CONTROL_REINIT: + af->data->rate = ((af_data_t*)arg)->rate; + af->data->nch = ((af_data_t*)arg)->nch; + af->data->format= AF_FORMAT_FLOAT_NE; + af->data->bps = 4; + return af_test_output(af,(af_data_t*)arg); + } + return AF_UNKNOWN; +} + +// Deallocate memory +static void uninit(struct af_instance_s* af) +{ + if(af->data) + free(af->data); +} + +// Filter data through filter +static af_data_t* play(struct af_instance_s* af, af_data_t* data) +{ + af_data_t* c = data; // Current working data + float* a = c->audio; // Audio data + int len = c->len/4; // Number of samples in current audio block + int nch = c->nch; // Number of channels + register int i; + + /* + FIXME1 add a low band pass filter to avoid supressing + centered bass/drums + FIXME2 better calculated* atenuation factor + */ + + for(i=0;i<len;i+=nch) + { + a[i] = (a[i] - a[i+1]) * 0.7; + a[i+1]=a[i]; + } + + return c; +} + +// Allocate memory and set function pointers +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)); + + if(af->data == NULL) + return AF_ERROR; + + return AF_OK; +} + +// Description of this filter +af_info_t af_info_karaoke = { + "Simple karaoke/voice-removal audio filter", + "karaoke", + "Reynaldo H. Verdejo Pinochet", + "", + AF_FLAGS_NOT_REENTRANT, + open +}; |