static gboolean gst_gsettings_video_sink_reset (GstGSettingsVideoSink * sink) { gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); if (sink->changed_id) { g_signal_handler_disconnect (sink->settings, sink->changed_id); sink->changed_id = 0; } if (sink->loop) { g_main_loop_quit (sink->loop); g_main_loop_unref (sink->loop); sink->loop = NULL; } if (sink->settings) { g_object_unref (sink->settings); sink->settings = NULL; } GST_OBJECT_LOCK (sink); g_free (sink->gsettings_str); sink->gsettings_str = NULL; GST_OBJECT_UNLOCK (sink); return TRUE; }
static void gst_gconf_audio_sink_reset (GstGConfAudioSink * sink) { gst_switch_sink_set_child (GST_SWITCH_SINK (sink), NULL); g_free (sink->gconf_str); sink->gconf_str = NULL; }
static gboolean gst_gsettings_video_sink_change_child (GstGSettingsVideoSink * sink) { gchar *new_string; GError *err = NULL; GstElement *new_kid; GST_OBJECT_LOCK (sink); new_string = g_settings_get_string (sink->settings, GST_GSETTINGS_KEY_VIDEOSINK); if (new_string != NULL && sink->gsettings_str != NULL && (strlen (new_string) == 0 || strcmp (sink->gsettings_str, new_string) == 0)) { g_free (new_string); GST_DEBUG_OBJECT (sink, "GSettings key was updated, but it didn't change. Ignoring"); GST_OBJECT_UNLOCK (sink); return TRUE; } GST_OBJECT_UNLOCK (sink); GST_DEBUG_OBJECT (sink, "GSettings key changed from '%s' to '%s'", GST_STR_NULL (sink->gsettings_str), GST_STR_NULL (new_string)); if (new_string) { new_kid = gst_parse_bin_from_description (new_string, TRUE, &err); if (err) { GST_ERROR_OBJECT (sink, "error creating bin '%s': %s", new_string, err->message); g_error_free (err); } } else { new_kid = NULL; } if (new_kid == NULL) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render video sink from GSettings")); goto fail; } if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { GST_WARNING_OBJECT (sink, "Failed to update child element"); goto fail; } g_free (sink->gsettings_str); sink->gsettings_str = new_string; return TRUE; fail: g_free (new_string); return FALSE; }
static gboolean do_change_child (GstGConfAudioSink * sink) { const gchar *key; gchar *new_gconf_str; GstElement *new_kid; if (sink->profile == GCONF_PROFILE_NONE) return FALSE; /* Can't switch to a 'NONE' sink */ key = gst_gconf_get_key_for_sink_profile (sink->profile); new_gconf_str = gst_gconf_get_string (key); GST_LOG_OBJECT (sink, "old gconf string: %s", GST_STR_NULL (sink->gconf_str)); GST_LOG_OBJECT (sink, "new gconf string: %s", GST_STR_NULL (new_gconf_str)); if (new_gconf_str != NULL && sink->gconf_str != NULL && (strlen (new_gconf_str) == 0 || strcmp (sink->gconf_str, new_gconf_str) == 0)) { g_free (new_gconf_str); GST_DEBUG_OBJECT (sink, "GConf key was updated, but it didn't change. Ignoring"); return TRUE; } GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'", GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str)); GST_DEBUG_OBJECT (sink, "Creating new child for profile %d", sink->profile); new_kid = gst_gconf_render_bin_with_default (new_gconf_str, DEFAULT_AUDIOSINK); if (new_kid == NULL) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render audio sink from GConf")); goto fail; } if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { GST_WARNING_OBJECT (sink, "Failed to update child element"); goto fail; } g_free (sink->gconf_str); sink->gconf_str = new_gconf_str; GST_DEBUG_OBJECT (sink, "done changing gconf audio sink"); return TRUE; fail: g_free (new_gconf_str); return FALSE; }
static void gst_switch_sink_dispose (GObject * object) { GstSwitchSink *sink = GST_SWITCH_SINK (object); GstObject *new_kid, *kid; GST_OBJECT_LOCK (sink); new_kid = GST_OBJECT_CAST (sink->new_kid); sink->new_kid = NULL; kid = GST_OBJECT_CAST (sink->kid); sink->kid = NULL; GST_OBJECT_UNLOCK (sink); gst_object_replace (&new_kid, NULL); gst_object_replace (&kid, NULL); GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); }
static GstStateChangeReturn gst_switch_sink_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstSwitchSink *sink = GST_SWITCH_SINK (element); ret = GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS, change_state, (element, transition), GST_STATE_CHANGE_SUCCESS); switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: if (!gst_switch_sink_reset (sink)) ret = GST_STATE_CHANGE_FAILURE; break; default: break; } return ret; }
static gboolean gst_gsettings_audio_sink_change_child (GstGSettingsAudioSink * sink) { const gchar *key = NULL; gchar *new_string; GError *err = NULL; GstElement *new_kid; GST_OBJECT_LOCK (sink); switch (sink->profile) { case GST_GSETTINGS_AUDIOSINK_PROFILE_SOUNDS: key = GST_GSETTINGS_KEY_SOUNDS_AUDIOSINK; break; case GST_GSETTINGS_AUDIOSINK_PROFILE_MUSIC: key = GST_GSETTINGS_KEY_MUSIC_AUDIOSINK; break; case GST_GSETTINGS_AUDIOSINK_PROFILE_CHAT: key = GST_GSETTINGS_KEY_CHAT_AUDIOSINK; break; default: break; } new_string = g_settings_get_string (sink->settings, key); if (new_string != NULL && sink->gsettings_str != NULL && (strlen (new_string) == 0 || strcmp (sink->gsettings_str, new_string) == 0)) { g_free (new_string); GST_DEBUG_OBJECT (sink, "GSettings key was updated, but it didn't change. Ignoring"); GST_OBJECT_UNLOCK (sink); return TRUE; } GST_OBJECT_UNLOCK (sink); GST_DEBUG_OBJECT (sink, "GSettings key changed from '%s' to '%s'", GST_STR_NULL (sink->gsettings_str), GST_STR_NULL (new_string)); if (new_string) { new_kid = gst_parse_bin_from_description (new_string, TRUE, &err); if (err) { GST_ERROR_OBJECT (sink, "error creating bin '%s': %s", new_string, err->message); g_error_free (err); } } else { new_kid = NULL; } if (new_kid == NULL) { GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL), ("Failed to render audio sink from GSettings")); goto fail; } if (!gst_switch_sink_set_child (GST_SWITCH_SINK (sink), new_kid)) { GST_WARNING_OBJECT (sink, "Failed to update child element"); goto fail; } g_free (sink->gsettings_str); sink->gsettings_str = new_string; return TRUE; fail: g_free (new_string); return FALSE; }