summaryrefslogtreecommitdiffstats
path: root/gst-libs/gst/mixer
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/mixer')
-rw-r--r--gst-libs/gst/mixer/Makefile.am20
-rw-r--r--gst-libs/gst/mixer/mixer.c82
-rw-r--r--gst-libs/gst/mixer/mixer.h52
-rw-r--r--gst-libs/gst/mixer/mixermarshal.list2
-rw-r--r--gst-libs/gst/mixer/mixertrack.h7
5 files changed, 144 insertions, 19 deletions
diff --git a/gst-libs/gst/mixer/Makefile.am b/gst-libs/gst/mixer/Makefile.am
index 193b5a10..f62ab4c8 100644
--- a/gst-libs/gst/mixer/Makefile.am
+++ b/gst-libs/gst/mixer/Makefile.am
@@ -9,5 +9,23 @@ noinst_LTLIBRARIES = libgstmixer.la
libgstmixer_la_SOURCES = \
mixer.c \
- mixertrack.c
+ mixertrack.c \
+ mixermarshal.c
libgstmixer_la_CFLAGS = $(GST_CFLAGS)
+
+BUILT_SOURCES = \
+ mixermarshal.c \
+ mixermarshal.h
+built_headers = \
+ mixermarshal.h
+
+EXTRA_DIST = mixermarshal.list
+
+mixermarshal.h: mixermarshal.list
+ glib-genmarshal --header --prefix=gst_mixer_marshal $^ > mixermarshal.h.tmp
+ mv mixermarshal.h.tmp mixermarshal.h
+
+mixermarshal.c: mixermarshal.list
+ echo "#include \"mixermarshal.h\"" >> mixermarshal.c.tmp
+ glib-genmarshal --body --prefix=gst_mixer_marshal $^ >> mixermarshal.c.tmp
+ mv mixermarshal.c.tmp mixermarshal.c
diff --git a/gst-libs/gst/mixer/mixer.c b/gst-libs/gst/mixer/mixer.c
index 28d10e6a..cbdfdad4 100644
--- a/gst-libs/gst/mixer/mixer.c
+++ b/gst-libs/gst/mixer/mixer.c
@@ -24,9 +24,19 @@
#endif
#include "mixer.h"
+#include "mixermarshal.h"
+
+enum {
+ MUTE_TOGGLED,
+ RECORD_TOGGLED,
+ VOLUME_CHANGED,
+ LAST_SIGNAL
+};
static void gst_mixer_class_init (GstMixerClass *klass);
+static guint gst_mixer_signals[LAST_SIGNAL] = { 0 };
+
GType
gst_mixer_get_type (void)
{
@@ -49,7 +59,7 @@ gst_mixer_get_type (void)
"GstMixer",
&gst_mixer_info, 0);
g_type_interface_add_prerequisite (gst_mixer_type,
- GST_TYPE_INTERFACE);
+ GST_TYPE_IMPLEMENTS_INTERFACE);
}
return gst_mixer_type;
@@ -58,6 +68,34 @@ gst_mixer_get_type (void)
static void
gst_mixer_class_init (GstMixerClass *klass)
{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ gst_mixer_signals[RECORD_TOGGLED] =
+ g_signal_new ("record_toggled",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, record_toggled),
+ NULL, NULL,
+ gst_mixer_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 1,
+ GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
+ gst_mixer_signals[MUTE_TOGGLED] =
+ g_signal_new ("mute_toggled",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, mute_toggled),
+ NULL, NULL,
+ gst_mixer_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 1,
+ GST_TYPE_MIXER_TRACK, G_TYPE_BOOLEAN);
+ gst_mixer_signals[VOLUME_CHANGED] =
+ g_signal_new ("volume_changed",
+ GST_TYPE_MIXER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstMixerClass, volume_changed),
+ NULL, NULL,
+ gst_mixer_marshal_VOID__OBJECT_POINTER, G_TYPE_NONE, 1,
+ GST_TYPE_MIXER_TRACK, G_TYPE_POINTER);
+
+ initialized = TRUE;
+ }
+
/* default virtual functions */
klass->list_tracks = NULL;
klass->set_volume = NULL;
@@ -131,3 +169,45 @@ gst_mixer_set_record (GstMixer *mixer,
klass->set_record (mixer, track, record);
}
}
+
+void
+gst_mixer_mute_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute)
+{
+ g_signal_emit (G_OBJECT (mixer),
+ gst_mixer_signals[MUTE_TOGGLED], 0,
+ track, mute);
+
+ g_signal_emit_by_name (G_OBJECT (track),
+ "mute_toggled",
+ mute);
+}
+
+void
+gst_mixer_record_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record)
+{
+ g_signal_emit (G_OBJECT (mixer),
+ gst_mixer_signals[RECORD_TOGGLED], 0,
+ track, record);
+
+ g_signal_emit_by_name (G_OBJECT (track),
+ "record_toggled",
+ record);
+}
+
+void
+gst_mixer_volume_changed (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes)
+{
+ g_signal_emit (G_OBJECT (mixer),
+ gst_mixer_signals[VOLUME_CHANGED], 0,
+ track, volumes);
+
+ g_signal_emit_by_name (G_OBJECT (track),
+ "volume_changed",
+ volumes);
+}
diff --git a/gst-libs/gst/mixer/mixer.h b/gst-libs/gst/mixer/mixer.h
index 6ee49e3a..c60c8e9b 100644
--- a/gst-libs/gst/mixer/mixer.h
+++ b/gst-libs/gst/mixer/mixer.h
@@ -30,11 +30,11 @@ 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))
+ (GST_IMPLEMENTS_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))
+ (GST_IMPLEMENTS_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) \
@@ -62,25 +62,47 @@ typedef struct _GstMixerClass {
GstMixerTrack *track,
gboolean record);
+ /* signals */
+ void (* mute_toggled) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gboolean mute);
+ void (* record_toggled) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gboolean record);
+ void (* volume_changed) (GstMixer *mixer,
+ GstMixerTrack *channel,
+ gint *volumes);
+
GST_CLASS_PADDING
} GstMixerClass;
GType gst_mixer_get_type (void);
/* virtual class function wrappers */
-const GList * gst_mixer_list_tracks (GstMixer *mixer);
-void gst_mixer_set_volume (GstMixer *mixer,
- GstMixerTrack *track,
- gint *volumes);
-void gst_mixer_get_volume (GstMixer *mixer,
- GstMixerTrack *track,
- gint *volumes);
-void gst_mixer_set_mute (GstMixer *mixer,
- GstMixerTrack *track,
- gboolean mute);
-void gst_mixer_set_record (GstMixer *mixer,
- GstMixerTrack *track,
- gboolean record);
+const GList * gst_mixer_list_tracks (GstMixer *mixer);
+void gst_mixer_set_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+void gst_mixer_get_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
+void gst_mixer_set_mute (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute);
+void gst_mixer_set_record (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record);
+
+/* trigger signals */
+void gst_mixer_mute_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean mute);
+void gst_mixer_record_toggled (GstMixer *mixer,
+ GstMixerTrack *track,
+ gboolean record);
+void gst_mixer_volume_changed (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes);
G_END_DECLS
diff --git a/gst-libs/gst/mixer/mixermarshal.list b/gst-libs/gst/mixer/mixermarshal.list
new file mode 100644
index 00000000..ac2cd6b8
--- /dev/null
+++ b/gst-libs/gst/mixer/mixermarshal.list
@@ -0,0 +1,2 @@
+VOID:OBJECT,BOOLEAN
+VOID:OBJECT,POINTER
diff --git a/gst-libs/gst/mixer/mixertrack.h b/gst-libs/gst/mixer/mixertrack.h
index cb010822..1ee1e9d4 100644
--- a/gst-libs/gst/mixer/mixertrack.h
+++ b/gst-libs/gst/mixer/mixertrack.h
@@ -71,12 +71,15 @@ typedef struct _GstMixerTrack {
typedef struct _GstMixerTrackClass {
GObjectClass parent;
+ /* signals */
void (* mute_toggled) (GstMixerTrack *channel,
- gboolean on);
+ gboolean mute);
void (* record_toggled) (GstMixerTrack *channel,
- gboolean on);
+ gboolean record);
void (* volume_changed) (GstMixerTrack *channel,
gint *volumes);
+
+ GST_CLASS_PADDING
} GstMixerTrackClass;
GType gst_mixer_track_get_type (void);