# HG changeset patch # User Mike Ruprecht # Date 1216328506 0 # Node ID 1c68f78414b75cef51e29bd448f4ed6ba6d38390 # Parent e23b447aa5ca35ccd1688bb4cbefd56e20758cd7 Set the media pipeline to PLAYING immediately after initialization (and a few other changes to make it actually work and not hang). diff -r e23b447aa5ca -r 1c68f78414b7 libpurple/media.c --- a/libpurple/media.c Wed Jul 16 21:55:08 2008 +0000 +++ b/libpurple/media.c Thu Jul 17 21:01:46 2008 +0000 @@ -219,10 +219,22 @@ purple_media_finalize (GObject *media) { PurpleMediaPrivate *priv = PURPLE_MEDIA_GET_PRIVATE(media); + GList *sessions = g_hash_table_get_values(priv->sessions); purple_debug_info("media","purple_media_finalize\n"); g_free(priv->name); + for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { + PurpleMediaSession *session = sessions->data; + GList *streams = g_hash_table_get_values(session->streams); + + for (; streams; streams = g_list_delete_link(streams, streams)) { + g_object_unref(streams->data); + } + + g_object_unref(session->session); + } + if (priv->pipeline) { gst_element_set_state(priv->pipeline, GST_STATE_NULL); gst_object_unref(priv->pipeline); @@ -928,11 +940,9 @@ purple_media_src_pad_added_cb(FsStream *stream, GstPad *srcpad, FsCodec *codec, PurpleMediaSession *session) { - GstElement *pipeline = purple_media_get_pipeline(session->media); GstPad *sinkpad = gst_element_get_static_pad(session->sink, "ghostsink"); purple_debug_info("media", "connecting new src pad: %s\n", gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); - gst_element_set_state(pipeline, GST_STATE_PLAYING); } static gboolean diff -r e23b447aa5ca -r 1c68f78414b7 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Wed Jul 16 21:55:08 2008 +0000 +++ b/libpurple/mediamanager.c Thu Jul 17 21:01:46 2008 +0000 @@ -135,20 +135,24 @@ { PurpleMedia *media; FsConference *conference = FS_CONFERENCE(gst_element_factory_make(conference_type, NULL)); - GstStateChangeReturn ret = gst_element_set_state(GST_ELEMENT(conference), GST_STATE_READY); - - if (ret == GST_STATE_CHANGE_FAILURE) { - purple_conv_present_error(remote_user, - purple_connection_get_account(gc), - _("Error creating conference.")); - return NULL; - } + GstStateChangeReturn ret; media = PURPLE_MEDIA(g_object_new(purple_media_get_type(), "screenname", remote_user, "connection", gc, "farsight-conference", conference, NULL)); + + ret = gst_element_set_state(purple_media_get_pipeline(media), GST_STATE_PLAYING); + + if (ret == GST_STATE_CHANGE_FAILURE) { + purple_conv_present_error(remote_user, + purple_connection_get_account(gc), + _("Error creating conference.")); + g_object_unref(media); + return NULL; + } + manager->priv->medias = g_list_append(manager->priv->medias, media); g_signal_emit(manager, purple_media_manager_signals[INIT_MEDIA], 0, media); return media; diff -r e23b447aa5ca -r 1c68f78414b7 libpurple/protocols/jabber/jingle.c --- a/libpurple/protocols/jabber/jingle.c Wed Jul 16 21:55:08 2008 +0000 +++ b/libpurple/protocols/jabber/jingle.c Thu Jul 17 21:01:46 2008 +0000 @@ -819,8 +819,7 @@ if (purple_media_candidates_prepared(media, remote_jid)) { jabber_iq_send(jabber_jingle_session_create_session_accept(session)); - purple_debug_info("jingle", "Sent session accept, starting stream\n"); - gst_element_set_state(purple_media_get_pipeline(session->media), GST_STATE_PLAYING); + purple_debug_info("jingle", "Sent session accept.\n"); jabber_jingle_session_set_state(session, ACTIVE); } else jabber_jingle_session_set_state(session, ACCEPTED); @@ -922,9 +921,7 @@ jabber_jingle_session_get_remote_jid(session))) { jabber_iq_send(jabber_jingle_session_create_session_accept(session)); - purple_debug_info("jingle", "Sent session accept, starting stream\n"); - gst_element_set_state(purple_media_get_pipeline(session->media), - GST_STATE_PLAYING); + purple_debug_info("jingle", "Sent session accept.\n"); jabber_jingle_session_set_state(session, ACTIVE); } } @@ -1223,9 +1220,7 @@ if (!strcmp(action, "session-accept")) { purple_media_got_accept(jabber_jingle_session_get_media(session)); - purple_debug_info("jingle", "Got session-accept, starting stream\n"); - gst_element_set_state(purple_media_get_pipeline(session->media), - GST_STATE_PLAYING); + purple_debug_info("jingle", "Got session-accept"); } jabber_iq_send(jabber_jingle_session_create_ack(session, jingle)); @@ -1332,8 +1327,6 @@ /* maybe we should look at the reasoncode to determine if it was a hangup or a reject, and call different callbacks to purple_media */ - gst_element_set_state(purple_media_get_pipeline(session->media), GST_STATE_NULL); - purple_media_got_hangup(jabber_jingle_session_get_media(session)); jabber_iq_send(jabber_jingle_session_create_ack(session, jingle)); jabber_jingle_session_destroy(session); diff -r e23b447aa5ca -r 1c68f78414b7 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Wed Jul 16 21:55:08 2008 +0000 +++ b/pidgin/gtkmedia.c Thu Jul 17 21:01:46 2008 +0000 @@ -288,15 +288,12 @@ static void pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) { - GstElement *element = purple_media_get_pipeline(media); - GstElement *audiosendbin = NULL, *audiosendlevel = NULL; GstElement *audiorecvbin = NULL, *audiorecvlevel = NULL; GstElement *videosendbin = NULL; GstElement *videorecvbin = NULL; GList *sessions = purple_media_get_session_names(media); - GstBus *bus; for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_AUDIO) { @@ -306,6 +303,9 @@ purple_media_audio_init_recv(&audiorecvbin, &audiorecvlevel); purple_media_set_src(media, sessions->data, audiosendbin); purple_media_set_sink(media, sessions->data, audiorecvbin); + + gst_element_set_state(audiosendbin, GST_STATE_READY); + gst_element_set_state(audiorecvbin, GST_STATE_READY); } else if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_VIDEO) { if (!videosendbin) purple_media_video_init_src(&videosendbin); @@ -313,6 +313,9 @@ purple_media_video_init_recv(&videorecvbin); purple_media_set_src(media, sessions->data, videosendbin); purple_media_set_sink(media, sessions->data, videorecvbin); + + gst_element_set_state(videosendbin, GST_STATE_READY); + gst_element_set_state(videorecvbin, GST_STATE_READY); } } @@ -321,14 +324,6 @@ "recv-level", audiorecvlevel, NULL); } - - bus = gst_pipeline_get_bus(GST_PIPELINE(element)); - gst_bus_add_signal_watch(GST_BUS(bus)); - g_signal_connect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), - "message", G_CALLBACK(level_message_cb), gtkmedia); - if (videorecvbin || videosendbin) - gst_bus_set_sync_handler(bus, (GstBusSyncHandler)create_window, gtkmedia); - gst_object_unref(bus); } static void @@ -344,10 +339,12 @@ { GtkWidget *send_widget = NULL, *recv_widget = NULL; + GstElement *pipeline = purple_media_get_pipeline(media); GstElement *audiosendbin = NULL; GstElement *audiorecvbin = NULL; GstElement *videosendbin = NULL; GstElement *videorecvbin = NULL; + GstBus *bus; pidgin_media_emit_message(gtkmedia, _("Call in progress.")); pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED); @@ -392,6 +389,9 @@ gtkmedia->priv->local_video = local_video; gtkmedia->priv->remote_video = remote_video; + + gst_element_set_state(videosendbin, GST_STATE_PLAYING); + gst_element_set_state(videorecvbin, GST_STATE_PLAYING); } if (audiorecvbin || audiosendbin) { @@ -415,7 +415,20 @@ gtk_widget_show(gtkmedia->priv->send_progress); gtk_widget_show(gtkmedia->priv->recv_progress); + + gst_element_set_state(audiosendbin, GST_STATE_PLAYING); + gst_element_set_state(audiorecvbin, GST_STATE_PLAYING); } + + bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); + if (audiorecvbin || audiosendbin) { + gst_bus_add_signal_watch(GST_BUS(bus)); + g_signal_connect(G_OBJECT(bus), "message", + G_CALLBACK(level_message_cb), gtkmedia); + } + if (videorecvbin || videosendbin) + gst_bus_set_sync_handler(bus, (GstBusSyncHandler)create_window, gtkmedia); + gst_object_unref(bus); } static void