diff -r 5157ec7a2b6f -r 841d24b3a2bc pidgin/gtkconv.c --- a/pidgin/gtkconv.c Fri Dec 28 17:14:52 2007 +0000 +++ b/pidgin/gtkconv.c Sat Dec 29 06:34:59 2007 +0000 @@ -46,6 +46,7 @@ #include "idle.h" #include "imgstore.h" #include "log.h" +#include "mediamanager.h" #include "notify.h" #include "prpl.h" #include "request.h" @@ -60,6 +61,7 @@ #include "gtkimhtml.h" #include "gtkimhtmltoolbar.h" #include "gtklog.h" +#include "gtkmedia.h" #include "gtkmenutray.h" #include "gtkpounce.h" #include "gtkprefs.h" @@ -4598,7 +4600,8 @@ GtkPolicyType imhtml_sw_hscroll; /* Setup the top part of the pane */ - vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtkconv->topvbox = vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); gtk_widget_show(vbox); /* Setup the info pane */ @@ -7549,6 +7552,58 @@ return TRUE; } +static void +pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv) +{ + purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); +} + +static void +pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) +{ + GstElement *sendbin, *src, *sendlevel; + GstElement *recvbin, *sink, *recvlevel; + GstPad *pad, *ghost; + + GtkWidget *gtkmedia; + PurpleConversation *conv; + PidginConversation *gtkconv; + + sendbin = gst_bin_new("sendbin"); + src = gst_element_factory_make("alsasrc", "asrc"); + sendlevel = gst_element_factory_make("level", "sendlevel"); + gst_bin_add_many(GST_BIN(sendbin), src, sendlevel, NULL); + gst_element_link(src, sendlevel); //, gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT, 8000, NULL)); + pad = gst_element_get_pad(sendlevel, "src"); + ghost = gst_ghost_pad_new("ghostsrc", pad); + gst_element_add_pad(sendbin, ghost); + g_object_set(G_OBJECT(sendlevel), "message", TRUE, NULL); + + recvbin = gst_bin_new("pidginrecvbin"); + sink = gst_element_factory_make("alsasink", "asink"); + g_object_set(G_OBJECT(sink), "sync", FALSE, NULL); + recvlevel = gst_element_factory_make("level", "recvlevel"); + gst_bin_add_many(GST_BIN(recvbin), sink, recvlevel, NULL); + gst_element_link(recvlevel, sink); + pad = gst_element_get_pad(recvlevel, "sink"); + ghost = gst_ghost_pad_new("ghostsink", pad); + gst_element_add_pad(recvbin, ghost); + g_object_set(G_OBJECT(recvlevel), "message", TRUE, NULL); + + purple_media_set_audio_src(media, sendbin); + purple_media_set_audio_sink(media, recvbin); + + gtkmedia = pidgin_media_new(media, sendlevel, recvlevel); + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, + purple_connection_get_account(purple_media_get_connection(media)), + purple_media_get_screenname(media)); + gtkconv = PIDGIN_CONVERSATION(conv); + gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0); + gtk_widget_show(gtkmedia); + g_signal_connect_swapped(G_OBJECT(media), "got-hangup", G_CALLBACK(gtk_widget_destroy), gtkmedia); + g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv); +} + void * pidgin_conversations_get_handle(void) { @@ -7645,6 +7700,8 @@ purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/conversations/im/hide_new", hide_new_pref_cb, NULL); + g_signal_connect(G_OBJECT(purple_media_manager_get()), "init-media", + G_CALLBACK(pidgin_conv_new_media_cb), NULL); /**********************************************************************