diff options
Diffstat (limited to 'ext/gconf/gstgconfaudiosink.c')
-rw-r--r-- | ext/gconf/gstgconfaudiosink.c | 117 |
1 files changed, 113 insertions, 4 deletions
diff --git a/ext/gconf/gstgconfaudiosink.c b/ext/gconf/gstgconfaudiosink.c index 5e409519..4929c25b 100644 --- a/ext/gconf/gstgconfaudiosink.c +++ b/ext/gconf/gstgconfaudiosink.c @@ -1,5 +1,6 @@ /* GStreamer * (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * (c) 2006 Jürg Billeter <j@bitron.ch> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -33,8 +34,19 @@ static GstStateChangeReturn gst_gconf_audio_sink_change_state (GstElement * element, GstStateChange transition); +enum +{ + PROP_0, + PROP_PROFILE +}; + GST_BOILERPLATE (GstGConfAudioSink, gst_gconf_audio_sink, GstBin, GST_TYPE_BIN); +static void gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + static void gst_gconf_audio_sink_base_init (gpointer klass) { @@ -55,14 +67,39 @@ gst_gconf_audio_sink_base_init (gpointer klass) gst_element_class_set_details (eklass, &gst_gconf_audio_sink_details); } +#define GST_TYPE_GCONF_PROFILE (gst_gconf_profile_get_type()) +static GType +gst_gconf_profile_get_type (void) +{ + static GType gconf_profile_type = 0; + static GEnumValue gconf_profiles[] = { + {GCONF_PROFILE_SOUNDS, "Sound Events", "sounds"}, + {GCONF_PROFILE_MUSIC, "Music and Movies", "music"}, + {GCONF_PROFILE_CHAT, "Audio/Video Conferencing", "chat"}, + {0, NULL, NULL} + }; + + if (!gconf_profile_type) { + gconf_profile_type = + g_enum_register_static ("GstGConfProfile", gconf_profiles); + } + return gconf_profile_type; +} + static void gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass) { GObjectClass *oklass = G_OBJECT_CLASS (klass); GstElementClass *eklass = GST_ELEMENT_CLASS (klass); + oklass->set_property = gst_gconf_audio_sink_set_property; + oklass->get_property = gst_gconf_audio_sink_get_property; oklass->dispose = gst_gconf_audio_sink_dispose; eklass->change_state = gst_gconf_audio_sink_change_state; + + g_object_class_install_property (oklass, PROP_PROFILE, + g_param_spec_enum ("profile", "Profile", "Profile", + GST_TYPE_GCONF_PROFILE, GCONF_PROFILE_SOUNDS, G_PARAM_READWRITE)); } /* @@ -88,6 +125,26 @@ gst_gconf_audio_sink_reset (GstGConfAudioSink * sink) g_free (sink->gconf_str); sink->gconf_str = NULL; + + if (sink->connection) { + gconf_client_notify_remove (sink->client, sink->connection); + sink->connection = 0; + } +} + +static const gchar * +get_gconf_key_for_profile (int profile) +{ + switch (profile) { + case GCONF_PROFILE_SOUNDS: + return GST_GCONF_DIR "/default/audiosink"; + case GCONF_PROFILE_MUSIC: + return GST_GCONF_DIR "/default/musicaudiosink"; + case GCONF_PROFILE_CHAT: + return GST_GCONF_DIR "/default/chataudiosink"; + default: + g_return_val_if_reached (NULL); + } } static void @@ -102,9 +159,11 @@ gst_gconf_audio_sink_init (GstGConfAudioSink * sink, sink->client = gconf_client_get_default (); gconf_client_add_dir (sink->client, GST_GCONF_DIR, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); - gconf_client_notify_add (sink->client, - GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY, - cb_toggle_element, sink, NULL, NULL); + + sink->profile = GCONF_PROFILE_SOUNDS; + sink->connection = gconf_client_notify_add (sink->client, + get_gconf_key_for_profile (sink->profile), cb_toggle_element, + sink, NULL, NULL); } static void @@ -113,6 +172,11 @@ gst_gconf_audio_sink_dispose (GObject * object) GstGConfAudioSink *sink = GST_GCONF_AUDIO_SINK (object); if (sink->client) { + if (sink->connection) { + gconf_client_notify_remove (sink->client, sink->connection); + sink->connection = 0; + } + g_object_unref (G_OBJECT (sink->client)); sink->client = NULL; } @@ -168,7 +232,7 @@ do_toggle_element (GstGConfAudioSink * sink) } GST_DEBUG_OBJECT (sink, "Creating new kid"); - if (!(sink->kid = gst_gconf_get_default_audio_sink ())) { + if (!(sink->kid = gst_gconf_get_default_audio_sink (sink->profile))) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render audio sink from GConf")); g_free (sink->gconf_str); @@ -189,6 +253,51 @@ do_toggle_element (GstGConfAudioSink * sink) } static void +gst_gconf_audio_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstGConfAudioSink *sink; + + g_return_if_fail (GST_IS_GCONF_AUDIO_SINK (object)); + + sink = GST_GCONF_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_PROFILE: + sink->profile = g_value_get_enum (value); + if (sink->connection) { + gconf_client_notify_remove (sink->client, sink->connection); + } + sink->connection = gconf_client_notify_add (sink->client, + get_gconf_key_for_profile (sink->profile), cb_toggle_element, + sink, NULL, NULL); + break; + default: + break; + } +} + +static void +gst_gconf_audio_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstGConfAudioSink *sink; + + g_return_if_fail (GST_IS_GCONF_AUDIO_SINK (object)); + + sink = GST_GCONF_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_PROFILE: + g_value_set_enum (value, sink->profile); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void cb_toggle_element (GConfClient * client, guint connection_id, GConfEntry * entry, gpointer data) { |