summaryrefslogtreecommitdiffstats
path: root/gst/stereo
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2001-12-22 23:26:33 +0000
committerAndy Wingo <wingo@pobox.com>2001-12-22 23:26:33 +0000
commitad6ed7da2d0d15eecc924dfe408320652481e885 (patch)
tree5adb0cfc1d7b419d6b4246f616400dca7678bac0 /gst/stereo
parente5d9d6e2a512540848f5d38e01b9678a1ef5c761 (diff)
downloadgst-plugins-bad-ad6ed7da2d0d15eecc924dfe408320652481e885.tar.gz
gst-plugins-bad-ad6ed7da2d0d15eecc924dfe408320652481e885.tar.bz2
gst-plugins-bad-ad6ed7da2d0d15eecc924dfe408320652481e885.zip
Initial revision
Original commit message from CVS: Initial revision
Diffstat (limited to 'gst/stereo')
-rw-r--r--gst/stereo/.gitignore7
-rw-r--r--gst/stereo/Makefile.am10
-rw-r--r--gst/stereo/README3
-rw-r--r--gst/stereo/gststereo.c226
-rw-r--r--gst/stereo/gststereo.h68
5 files changed, 314 insertions, 0 deletions
diff --git a/gst/stereo/.gitignore b/gst/stereo/.gitignore
new file mode 100644
index 00000000..08f5ed37
--- /dev/null
+++ b/gst/stereo/.gitignore
@@ -0,0 +1,7 @@
+Makefile
+Makefile.in
+*.o
+*.lo
+*.la
+.deps
+.libs
diff --git a/gst/stereo/Makefile.am b/gst/stereo/Makefile.am
new file mode 100644
index 00000000..69e18c72
--- /dev/null
+++ b/gst/stereo/Makefile.am
@@ -0,0 +1,10 @@
+filterdir = $(libdir)/gst
+
+filter_LTLIBRARIES = libgststereo.la
+
+libgststereo_la_SOURCES = gststereo.c
+libgststereo_la_CFLAGS = $(GST_CFLAGS)
+
+noinst_HEADERS = gststereo.h
+
+EXTRA_DIST = README
diff --git a/gst/stereo/README b/gst/stereo/README
new file mode 100644
index 00000000..a61e66ae
--- /dev/null
+++ b/gst/stereo/README
@@ -0,0 +1,3 @@
+This effect is borrowed from xmms-0.6.1, though I mangled it so badly in
+the process of copying it over that the xmms people probably won't want
+any credit for it ;-)
diff --git a/gst/stereo/gststereo.c b/gst/stereo/gststereo.c
new file mode 100644
index 00000000..622dd5d4
--- /dev/null
+++ b/gst/stereo/gststereo.c
@@ -0,0 +1,226 @@
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gststereo.h>
+
+
+static GstElementDetails stereo_details = {
+ "Stereo effect",
+ "Filter/Effect",
+ "Muck with the stereo signal, enhance it's 'stereo-ness'",
+ VERSION,
+ "Erik Walthinsen <omega@cse.ogi.edu>",
+ "(C) 1999",
+};
+
+
+/* Stereo signals and args */
+enum {
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_ACTIVE,
+ ARG_STEREO
+};
+
+
+static void gst_stereo_class_init (GstStereoClass *klass);
+static void gst_stereo_init (GstStereo *stereo);
+
+static void gst_stereo_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+static void gst_stereo_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
+
+static void gst_stereo_chain (GstPad *pad, GstBuffer *buf);
+
+static GstElementClass *parent_class = NULL;
+//static guint gst_stereo_signals[LAST_SIGNAL] = { 0 };
+
+GType
+gst_stereo_get_type(void) {
+ static GType stereo_type = 0;
+
+ if (!stereo_type) {
+ static const GTypeInfo stereo_info = {
+ sizeof(GstStereoClass), NULL,
+ NULL,
+ (GClassInitFunc)gst_stereo_class_init,
+ NULL,
+ NULL,
+ sizeof(GstStereo),
+ 0,
+ (GInstanceInitFunc)gst_stereo_init,
+ };
+ stereo_type = g_type_register_static(GST_TYPE_ELEMENT, "GstStereo", &stereo_info, 0);
+ }
+ return stereo_type;
+}
+
+static void
+gst_stereo_class_init (GstStereoClass *klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = g_type_class_ref(GST_TYPE_ELEMENT);
+
+ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_ACTIVE,
+ g_param_spec_int("active","active","active",
+ G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME
+ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_STEREO,
+ g_param_spec_float("stereo","stereo","stereo",
+ 0.0,1.0,0.0,G_PARAM_READWRITE)); // CHECKME
+
+ gobject_class->set_property = gst_stereo_set_property;
+ gobject_class->get_property = gst_stereo_get_property;
+}
+
+static void
+gst_stereo_init (GstStereo *stereo)
+{
+ stereo->sinkpad = gst_pad_new("sink",GST_PAD_SINK);
+ gst_element_add_pad(GST_ELEMENT(stereo),stereo->sinkpad);
+ gst_pad_set_chain_function(stereo->sinkpad,gst_stereo_chain);
+ stereo->srcpad = gst_pad_new("src",GST_PAD_SRC);
+ gst_element_add_pad(GST_ELEMENT(stereo),stereo->srcpad);
+
+ stereo->active = FALSE;
+ stereo->stereo = 2.5;
+}
+
+static void
+gst_stereo_chain (GstPad *pad,GstBuffer *buf)
+{
+ GstStereo *stereo;
+ gint16 *data;
+ gint samples;
+ gint i;
+ gdouble avg,ldiff,rdiff,tmp,mul;
+
+ g_return_if_fail(pad != NULL);
+ g_return_if_fail(GST_IS_PAD(pad));
+ g_return_if_fail(buf != NULL);
+
+ stereo = GST_STEREO(GST_OBJECT_PARENT (pad));
+ g_return_if_fail(stereo != NULL);
+ g_return_if_fail(GST_IS_STEREO(stereo));
+
+// FIXME
+// if (buf->meta)
+// memcpy(&stereo->meta,buf->meta,sizeof(stereo->meta));
+
+ if (stereo->active) {
+
+ //if (stereo->meta.channels == 2 && stereo->meta.format == AFMT_S16_LE) {
+ data = (gint16 *)GST_BUFFER_DATA(buf);
+ samples = GST_BUFFER_SIZE(buf) / 2;
+ mul = stereo->stereo;
+ for (i = 0; i < samples / 2; i += 2) {
+ avg = (data[i] + data[i + 1]) / 2;
+ ldiff = data[i] - avg;
+ rdiff = data[i + 1] - avg;
+
+ tmp = avg + ldiff * mul;
+ if (tmp < -32768)
+ tmp = -32768;
+ if (tmp > 32767)
+ tmp = 32767;
+ data[i] = tmp;
+
+ tmp = avg + rdiff * mul;
+ if (tmp < -32768)
+ tmp = -32768;
+ if (tmp > 32767)
+ tmp = 32767;
+ data[i + 1] = tmp;
+ }
+ //}
+ }
+
+ gst_pad_push(stereo->srcpad,buf);
+}
+
+static void
+gst_stereo_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+ GstStereo *stereo;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_STEREO(object));
+ stereo = GST_STEREO(object);
+
+ switch (prop_id) {
+ case ARG_ACTIVE:
+ stereo->active = g_value_get_int (value);
+ break;
+ case ARG_STEREO:
+ stereo->stereo = g_value_get_float (value) * 10.0;
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_stereo_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ GstStereo *stereo;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_STEREO(object));
+ stereo = GST_STEREO(object);
+
+ switch (prop_id) {
+ case ARG_ACTIVE:
+ g_value_set_int (value, stereo->active);
+ break;
+ case ARG_STEREO:
+ g_value_set_float (value, stereo->stereo / 10.0);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+plugin_init (GModule *module, GstPlugin *plugin)
+{
+ GstElementFactory *factory;
+
+ factory = gst_elementfactory_new("stereo",GST_TYPE_STEREO,
+ &stereo_details);
+ g_return_val_if_fail(factory != NULL, FALSE);
+ gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
+
+ return TRUE;
+}
+
+GstPluginDesc plugin_desc = {
+ GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "stereo",
+ plugin_init
+};
+
diff --git a/gst/stereo/gststereo.h b/gst/stereo/gststereo.h
new file mode 100644
index 00000000..f775f850
--- /dev/null
+++ b/gst/stereo/gststereo.h
@@ -0,0 +1,68 @@
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_STEREO_H__
+#define __GST_STEREO_H__
+
+
+#include <config.h>
+#include <gst/gst.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#define GST_TYPE_STEREO \
+ (gst_stereo_get_type())
+#define GST_STEREO(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STEREO,GstStereo))
+#define GST_STEREO_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STEREO,GstStereo))
+#define GST_IS_STEREO(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STEREO))
+#define GST_IS_STEREO_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STEREO))
+
+typedef struct _GstStereo GstStereo;
+typedef struct _GstStereoClass GstStereoClass;
+
+struct _GstStereo {
+ GstElement element;
+
+ GstPad *sinkpad,*srcpad;
+
+ gint8 active;
+ gfloat stereo;
+};
+
+struct _GstStereoClass {
+ GstElementClass parent_class;
+};
+
+GType gst_stereo_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GST_STEREO_H__ */