changeset 18470:0ea3c732d72d

New karaoke af
author reynaldo
date Sat, 13 May 2006 08:46:31 +0000
parents 241102f92b13
children aa9ae54516c3
files AUTHORS ChangeLog DOCS/man/en/mplayer.1 DOCS/tech/MAINTAINERS libaf/Makefile libaf/af.c libaf/af_karaoke.c
diffstat 7 files changed, 105 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Sat May 13 07:22:36 2006 +0000
+++ b/AUTHORS	Sat May 13 08:46:31 2006 +0000
@@ -767,6 +767,8 @@
     * mp_msg transition on unmaintained libao2 drivers
     * translatables to help_mp on input/libmpdemux
     * .wpl playlist support hack
+    * karaoke audio filter
+    * TOOLS/qepdvcd.sh
 
 Wigren, Per <wigren@home.se>
     * bmovl - Bitmap Overlay video filter
--- a/ChangeLog	Sat May 13 07:22:36 2006 +0000
+++ b/ChangeLog	Sat May 13 08:46:31 2006 +0000
@@ -569,6 +569,7 @@
     * big-endian fixes in rgb2rgb converter
     * yuv2rgb Altivec optimization fixes
     * support for LADSPA plugins
+    * new proof-of-concept karaoke (voice removal) filter
 
     GUI:
     * unified audio options dialog, also for ALSA
--- a/DOCS/man/en/mplayer.1	Sat May 13 07:22:36 2006 +0000
+++ b/DOCS/man/en/mplayer.1	Sat May 13 08:46:31 2006 +0000
@@ -4538,6 +4538,18 @@
 Noise gate filter similar to the comp audio filter.
 This filter is untested, maybe even unusable.
 .
+.TP
+.B karaoke\ \ \ 
+Simple voice removal filter.
+.
+This filter exploits the fact that voice is usually recorded with
+mono gear and later 'center' mixed on the final audio stream.
+.
+Beware that this filter will in fact turn your signal into mono.
+.
+Works well over 2 channel tracks; Don't ever bother trying it on anything
+but 2 chan stereo.
+.
 .
 .
 .SH "VIDEO FILTERS"
--- a/DOCS/tech/MAINTAINERS	Sat May 13 07:22:36 2006 +0000
+++ b/DOCS/tech/MAINTAINERS	Sat May 13 08:46:31 2006 +0000
@@ -123,6 +123,7 @@
     * general: Alex Beregszaszi
     * af_ladspa.c - Ivo van Poorten
     * af_equalizer.c - Reynaldo H. Verdejo Pinochet
+    * af_karaoke.c - Reynaldo H. Verdejo Pinochet
 
 libvo drivers:
     * vo_3dfx.c - OBSOLETED, use xv or tdfxfb
--- a/libaf/Makefile	Sat May 13 07:22:36 2006 +0000
+++ b/libaf/Makefile	Sat May 13 08:46:31 2006 +0000
@@ -14,6 +14,7 @@
      af_format.c \
      af_gate.c \
      af_hrtf.c \
+     af_karaoke.c \
      af_pan.c \
      af_resample.c \
      af_sinesupress.c \
--- a/libaf/af.c	Sat May 13 07:22:36 2006 +0000
+++ b/libaf/af.c	Sat May 13 08:46:31 2006 +0000
@@ -30,6 +30,7 @@
 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 @@
 #endif
    &af_info_center,
    &af_info_sinesupress,
+   &af_info_karaoke,
    NULL 
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libaf/af_karaoke.c	Sat May 13 08:46:31 2006 +0000
@@ -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
+};