view src/voice_removal/voice_removal.c @ 2375:22641735c9b1

- fixed freezing on track end - remember that buffer_free() returns _free_ space, not used.
author Eugene Zagidullin <e.asphyx@gmail.com>
date Sun, 10 Feb 2008 14:46:28 +0300
parents 6acf1bda788b
children 1e67df1a1edc
line wrap: on
line source

/*
 * libxmmsstandard - XMMS plugin.
 * Copyright (C) 2000-2001 Konstantin Laevsky <debleek63@yahoo.com>
 *
 * audacious port of the voice removal code from libxmmsstandard
 * by Thomas Cort <linuxgeek@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 *
 */
#include "config.h"

#include <gtk/gtk.h>
#include <audacious/plugin.h>


static int apply_effect (gpointer *d, gint length, AFormat afmt,
			gint srate, gint nch);

static EffectPlugin xmms_plugin = {
	.description = "Voice Removal Plugin",
	.mod_samples = apply_effect,
};

EffectPlugin *voice_eplist[] = { &xmms_plugin, NULL };

DECLARE_PLUGIN(voice_removal, NULL, NULL, NULL, NULL, voice_eplist, NULL, NULL, NULL);

static int apply_effect (gpointer *d, gint length, AFormat afmt,
			gint srate, gint nch) {
	int x;
	int left, right;
	gint16 *dataptr = (gint16 *) * d;

	if (!((afmt == FMT_S16_NE) ||
		(afmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
		(afmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN))   ||
		(nch != 2)) {
		return length;
	}

	for (x = 0; x < length; x += 4) {
		left  = CLAMP(dataptr[1] - dataptr[0], -32768, 32767);
		right = CLAMP(dataptr[0] - dataptr[1], -32768, 32767);
		dataptr[0] = left;
		dataptr[1] = right;
		dataptr += 2;
	}

	return (length);
}