Mercurial > pidgin
diff libpurple/mediamanager.c @ 26114:730e760ca39f
Move pipeline creation into the media manager.
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Fri, 20 Feb 2009 08:36:07 +0000 |
parents | 76104100cb87 |
children | 6cf36f68033c |
line wrap: on
line diff
--- a/libpurple/mediamanager.c Thu Feb 19 11:29:08 2009 +0000 +++ b/libpurple/mediamanager.c Fri Feb 20 08:36:07 2009 +0000 @@ -38,6 +38,7 @@ struct _PurpleMediaManagerPrivate { + GstElement *pipeline; GList *medias; GList *elements; @@ -144,6 +145,62 @@ return manager; } +static gboolean +pipeline_bus_call(GstBus *bus, GstMessage *msg, PurpleMediaManager *manager) +{ + switch(GST_MESSAGE_TYPE(msg)) { + case GST_MESSAGE_EOS: + purple_debug_info("mediamanager", "End of Stream\n"); + break; + case GST_MESSAGE_ERROR: { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error(msg, &err, &debug); + + purple_debug_error("mediamanager", + "gst pipeline error: %s\n", + err->message); + g_error_free(err); + + if (debug) { + purple_debug_error("mediamanager", + "Debug details: %s\n", debug); + g_free (debug); + } + break; + } + default: + break; + } + return TRUE; +} + +GstElement * +purple_media_manager_get_pipeline(PurpleMediaManager *manager) +{ + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL); + + if (manager->priv->pipeline == NULL) { + GstBus *bus; + manager->priv->pipeline = gst_pipeline_new(NULL); + + bus = gst_pipeline_get_bus( + GST_PIPELINE(manager->priv->pipeline)); + gst_bus_add_signal_watch(GST_BUS(bus)); + g_signal_connect(G_OBJECT(bus), "message", + G_CALLBACK(pipeline_bus_call), manager); + gst_bus_set_sync_handler(bus, + gst_bus_sync_signal_handler, NULL); + gst_object_unref(bus); + + gst_element_set_state(manager->priv->pipeline, + GST_STATE_PLAYING); + } + + return manager->priv->pipeline; +} + PurpleMedia * purple_media_manager_create_media(PurpleMediaManager *manager, PurpleConnection *gc,