Interface example: a mixer
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sat, 13 Sep 2003 01:20:04 +0000 (01:20 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sat, 13 Sep 2003 01:20:04 +0000 (01:20 +0000)
Original commit message from CVS:
Interface example: a mixer

configure.ac
gst-libs/gst/Makefile.am
gst-libs/gst/interfaces/mixer.c [new file with mode: 0644]
gst-libs/gst/interfaces/mixer.h [new file with mode: 0644]
gst-libs/gst/mixer/Makefile.am [new file with mode: 0644]
gst-libs/gst/mixer/mixer.c [new file with mode: 0644]
gst-libs/gst/mixer/mixer.h [new file with mode: 0644]

index c3274be..8311823 100644 (file)
@@ -1282,6 +1282,7 @@ gst-libs/gst/floatcast/Makefile
 gst-libs/gst/gconf/Makefile
 gst-libs/gst/idct/Makefile
 gst-libs/gst/media-info/Makefile
+gst-libs/gst/mixer/Makefile
 gst-libs/gst/play/Makefile
 gst-libs/gst/resample/Makefile
 gst-libs/gst/riff/Makefile
index 22175db..2501244 100644 (file)
@@ -5,7 +5,8 @@ GCONF_DIR=
 endif
 
 SUBDIRS = audio idct resample riff floatcast \
-               $(GCONF_DIR) media-info play video
+               $(GCONF_DIR) media-info mixer \
+               play video
 
 DIST_SUBDIRS = audio idct resample riff floatcast \
-               gconf media-info play video
+               gconf media-info mixer play video
diff --git a/gst-libs/gst/interfaces/mixer.c b/gst-libs/gst/interfaces/mixer.c
new file mode 100644 (file)
index 0000000..3e6ce63
--- /dev/null
@@ -0,0 +1,134 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * mixer.c: mixer design virtual class function wrappers
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/mixer/mixer.h>
+
+static void    gst_mixer_class_init    (GstMixerClass *klass);
+
+GType
+gst_mixer_get_type (void)
+{
+  static GType gst_mixer_type = 0;
+
+  if (!gst_mixer_type) {
+    static const GTypeInfo gst_mixer_info = {
+      sizeof (GstMixerClass),
+      (GBaseInitFunc) gst_mixer_class_init,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0,
+      0,
+      NULL,
+    };
+
+    gst_mixer_type = g_type_register_static (G_TYPE_INTERFACE,
+                                            "GstMixer",
+                                            &gst_mixer_info, 0);
+    g_type_interface_add_prerequisite (gst_mixer_type,
+                                      GST_TYPE_INTERFACE);
+  }
+
+  return gst_mixer_type;
+}
+
+static void
+gst_mixer_class_init (GstMixerClass *klass)
+{
+  /* default virtual functions */
+  klass->list_channels = NULL;
+  klass->set_volume = NULL;
+  klass->get_volume = NULL;
+  klass->set_mute = NULL;
+  klass->set_record = NULL;
+}
+
+const GList *
+gst_mixer_list_channels        (GstMixer *mixer)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->list_channels) {
+    return klass->list_channels (mixer);
+  }
+
+  return NULL;
+}
+
+void
+gst_mixer_set_volume (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gint            *volumes)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_volume) {
+    klass->set_volume (mixer, channel, volumes);
+  }
+}
+
+void
+gst_mixer_get_volume (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gint            *volumes)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->get_volume) {
+    klass->get_volume (mixer, channel, volumes);
+  } else {
+    gint i;
+
+    for (i = 0; i < channel->num_channels; i++) {
+      volumes[i] = 0;
+    }
+  }
+}
+
+void
+gst_mixer_set_mute (GstMixer        *mixer,
+                   GstMixerChannel *channel,
+                   gboolean         mute)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_mute) {
+    klass->set_mute (mixer, channel, mute);
+  }
+}
+
+void
+gst_mixer_set_record (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gboolean         record)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_record) {
+    klass->set_record (mixer, channel, record);
+  }
+}
diff --git a/gst-libs/gst/interfaces/mixer.h b/gst-libs/gst/interfaces/mixer.h
new file mode 100644 (file)
index 0000000..dab226e
--- /dev/null
@@ -0,0 +1,107 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * mixer.h: mixer interface design
+ *
+ * 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_MIXER_H__
+#define __GST_MIXER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_MIXER \
+  (gst_mixer_get_type ())
+#define GST_MIXER(obj) \
+  (GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER, GstMixer))
+#define GST_MIXER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER, GstMixerClass))
+#define GST_IS_MIXER(obj) \
+  (GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER))
+#define GST_IS_MIXER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER))
+#define GST_MIXER_GET_CLASS(inst) \
+  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_MIXER, GstMixerClass))
+
+/* I fully realise that this naming being used here is confusing.
+ * A channel is referred to both as the number of simultaneous
+ * sound streams the input can handle as well as the in-/output
+ * itself. We need to fix this some day, I just cannot come up
+ * with something better.
+ */
+
+#define GST_MIXER_CHANNEL_INPUT  (1<<0)
+#define GST_MIXER_CHANNEL_OUTPUT (1<<1)
+#define GST_MIXER_CHANNEL_MUTE   (1<<2)
+#define GST_MIXER_CHANNEL_RECORD (1<<3)
+
+typedef struct _GstMixerChannel {
+  gchar *label;
+  gint   num_channels,
+         flags,
+        min_volume, max_volume;
+} GstMixerChannel;
+
+#define GST_MIXER_CHANNEL_HAS_FLAG(channel, flag) \
+  ((channel)->flags & flag)
+
+typedef struct _GstMixer GstMixer;
+
+typedef struct _GstMixerClass {
+  GTypeInterface klass;
+
+  /* virtual functions */
+  const GList *  (* list_channels) (GstMixer        *mixer);
+
+  void           (* set_volume)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gint            *volumes);
+  void           (* get_volume)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gint            *volumes);
+
+  void           (* set_mute)      (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gboolean         mute);
+  void           (* set_record)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gboolean         record);
+} GstMixerClass;
+
+GType          gst_mixer_get_type      (void);
+
+/* virtual class function wrappers */
+const GList *  gst_mixer_list_channels (GstMixer        *mixer);
+void           gst_mixer_set_volume    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gint            *volumes);
+void           gst_mixer_get_volume    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gint            *volumes);
+void           gst_mixer_set_mute      (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gboolean         mute);
+void           gst_mixer_set_record    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gboolean         record);
+
+G_END_DECLS
+
+#endif /* __GST_MIXER_H__ */
diff --git a/gst-libs/gst/mixer/Makefile.am b/gst-libs/gst/mixer/Makefile.am
new file mode 100644 (file)
index 0000000..de67658
--- /dev/null
@@ -0,0 +1,10 @@
+lib_LTLIBRARIES = libgstmixer.la
+
+libgstmixer_la_SOURCES = mixer.c
+
+libgstmixerincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/mixer
+libgstmixerinclude_HEADERS = mixer.h
+
+libgstmixer_la_LIBADD =
+libgstmixer_la_CFLAGS = $(GST_CFLAGS) $(GST_OPT_CFLAGS)
+libgstmixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
diff --git a/gst-libs/gst/mixer/mixer.c b/gst-libs/gst/mixer/mixer.c
new file mode 100644 (file)
index 0000000..3e6ce63
--- /dev/null
@@ -0,0 +1,134 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * mixer.c: mixer design virtual class function wrappers
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/mixer/mixer.h>
+
+static void    gst_mixer_class_init    (GstMixerClass *klass);
+
+GType
+gst_mixer_get_type (void)
+{
+  static GType gst_mixer_type = 0;
+
+  if (!gst_mixer_type) {
+    static const GTypeInfo gst_mixer_info = {
+      sizeof (GstMixerClass),
+      (GBaseInitFunc) gst_mixer_class_init,
+      NULL,
+      NULL,
+      NULL,
+      NULL,
+      0,
+      0,
+      NULL,
+    };
+
+    gst_mixer_type = g_type_register_static (G_TYPE_INTERFACE,
+                                            "GstMixer",
+                                            &gst_mixer_info, 0);
+    g_type_interface_add_prerequisite (gst_mixer_type,
+                                      GST_TYPE_INTERFACE);
+  }
+
+  return gst_mixer_type;
+}
+
+static void
+gst_mixer_class_init (GstMixerClass *klass)
+{
+  /* default virtual functions */
+  klass->list_channels = NULL;
+  klass->set_volume = NULL;
+  klass->get_volume = NULL;
+  klass->set_mute = NULL;
+  klass->set_record = NULL;
+}
+
+const GList *
+gst_mixer_list_channels        (GstMixer *mixer)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->list_channels) {
+    return klass->list_channels (mixer);
+  }
+
+  return NULL;
+}
+
+void
+gst_mixer_set_volume (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gint            *volumes)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_volume) {
+    klass->set_volume (mixer, channel, volumes);
+  }
+}
+
+void
+gst_mixer_get_volume (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gint            *volumes)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->get_volume) {
+    klass->get_volume (mixer, channel, volumes);
+  } else {
+    gint i;
+
+    for (i = 0; i < channel->num_channels; i++) {
+      volumes[i] = 0;
+    }
+  }
+}
+
+void
+gst_mixer_set_mute (GstMixer        *mixer,
+                   GstMixerChannel *channel,
+                   gboolean         mute)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_mute) {
+    klass->set_mute (mixer, channel, mute);
+  }
+}
+
+void
+gst_mixer_set_record (GstMixer        *mixer,
+                     GstMixerChannel *channel,
+                     gboolean         record)
+{
+  GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
+
+  if (klass->set_record) {
+    klass->set_record (mixer, channel, record);
+  }
+}
diff --git a/gst-libs/gst/mixer/mixer.h b/gst-libs/gst/mixer/mixer.h
new file mode 100644 (file)
index 0000000..dab226e
--- /dev/null
@@ -0,0 +1,107 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ *                    2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * mixer.h: mixer interface design
+ *
+ * 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_MIXER_H__
+#define __GST_MIXER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_MIXER \
+  (gst_mixer_get_type ())
+#define GST_MIXER(obj) \
+  (GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER, GstMixer))
+#define GST_MIXER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER, GstMixerClass))
+#define GST_IS_MIXER(obj) \
+  (GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER))
+#define GST_IS_MIXER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER))
+#define GST_MIXER_GET_CLASS(inst) \
+  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_MIXER, GstMixerClass))
+
+/* I fully realise that this naming being used here is confusing.
+ * A channel is referred to both as the number of simultaneous
+ * sound streams the input can handle as well as the in-/output
+ * itself. We need to fix this some day, I just cannot come up
+ * with something better.
+ */
+
+#define GST_MIXER_CHANNEL_INPUT  (1<<0)
+#define GST_MIXER_CHANNEL_OUTPUT (1<<1)
+#define GST_MIXER_CHANNEL_MUTE   (1<<2)
+#define GST_MIXER_CHANNEL_RECORD (1<<3)
+
+typedef struct _GstMixerChannel {
+  gchar *label;
+  gint   num_channels,
+         flags,
+        min_volume, max_volume;
+} GstMixerChannel;
+
+#define GST_MIXER_CHANNEL_HAS_FLAG(channel, flag) \
+  ((channel)->flags & flag)
+
+typedef struct _GstMixer GstMixer;
+
+typedef struct _GstMixerClass {
+  GTypeInterface klass;
+
+  /* virtual functions */
+  const GList *  (* list_channels) (GstMixer        *mixer);
+
+  void           (* set_volume)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gint            *volumes);
+  void           (* get_volume)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gint            *volumes);
+
+  void           (* set_mute)      (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gboolean         mute);
+  void           (* set_record)    (GstMixer        *mixer,
+                                   GstMixerChannel *channel,
+                                   gboolean         record);
+} GstMixerClass;
+
+GType          gst_mixer_get_type      (void);
+
+/* virtual class function wrappers */
+const GList *  gst_mixer_list_channels (GstMixer        *mixer);
+void           gst_mixer_set_volume    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gint            *volumes);
+void           gst_mixer_get_volume    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gint            *volumes);
+void           gst_mixer_set_mute      (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gboolean         mute);
+void           gst_mixer_set_record    (GstMixer        *mixer,
+                                        GstMixerChannel *channel,
+                                        gboolean         record);
+
+G_END_DECLS
+
+#endif /* __GST_MIXER_H__ */