comparison pidgin/gtkconv.c @ 25637:92e71f6e10d4

Patch from Marcus Lundblad ('mlundblad') to improve audio support in xmpp. It's now possible to initiate an audio session, sometimes. It's somewhat buggy. Some other issues also need to be resolved: * Properly get rid of the compile warnings * Rename the serv_ functions with proper namespacing. * Possibly rename the purple_media_ functions that don't deal with a PurpleMedia (e.g. purple_media_audio_init_src) to something different, e.g. purple_media_util_, or even purple_gst_util etc.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Sat, 22 Mar 2008 04:45:46 +0000
parents e4a4bc86c547
children befeece4dd48
comparison
equal deleted inserted replaced
25636:e4a4bc86c547 25637:92e71f6e10d4
1170 1170
1171 gtk_widget_show_all(gtkwin->dialogs.search); 1171 gtk_widget_show_all(gtkwin->dialogs.search);
1172 gtk_widget_grab_focus(s->entry); 1172 gtk_widget_grab_focus(s->entry);
1173 } 1173 }
1174 1174
1175 #ifdef USE_FARSIGHT
1176 /* Forward declare this here, because I want to keep VV-related stuff together
1177 for now */
1178 static void
1179 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget);
1180
1181 #endif
1182
1175 static void 1183 static void
1176 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget) 1184 menu_send_file_cb(gpointer data, guint action, GtkWidget *widget)
1177 { 1185 {
1178 PidginWindow *win = data; 1186 PidginWindow *win = data;
1179 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); 1187 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
2945 "<StockItem>", GTK_STOCK_SAVE_AS }, 2953 "<StockItem>", GTK_STOCK_SAVE_AS },
2946 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR }, 2954 { N_("/Conversation/Clea_r Scrollback"), "<CTL>L", menu_clear_cb, 0, "<StockItem>", GTK_STOCK_CLEAR },
2947 2955
2948 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL }, 2956 { "/Conversation/sep1", NULL, NULL, 0, "<Separator>", NULL },
2949 2957
2958 #ifdef USE_FARSIGHT
2959 { N_("/Conversation/_Voice Call..."), NULL, menu_initiate_voice_call_cb, 0,
2960 "<StockItem>", PIDGIN_STOCK_TOOLBAR_CALL},
2961 #endif
2962
2950 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE }, 2963 { N_("/Conversation/Se_nd File..."), NULL, menu_send_file_cb, 0, "<StockItem>", PIDGIN_STOCK_TOOLBAR_SEND_FILE },
2951 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb, 2964 { N_("/Conversation/Add Buddy _Pounce..."), NULL, menu_add_pounce_cb,
2952 0, "<Item>", NULL }, 2965 0, "<Item>", NULL },
2953 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0, 2966 { N_("/Conversation/_Get Info"), "<CTL>O", menu_get_info_cb, 0,
2954 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO }, 2967 "<StockItem>", PIDGIN_STOCK_TOOLBAR_USER_INFO },
3246 3259
3247 win->menu.view_log = 3260 win->menu.view_log =
3248 gtk_item_factory_get_widget(win->menu.item_factory, 3261 gtk_item_factory_get_widget(win->menu.item_factory,
3249 N_("/Conversation/View Log")); 3262 N_("/Conversation/View Log"));
3250 3263
3264 #ifdef USE_FARSIGHT
3265 win->menu.call =
3266 gtk_item_factory_get_widget(win->menu.item_factory,
3267 N_("/Conversation/Voice Call..."));
3268 #endif
3269
3251 /* --- */ 3270 /* --- */
3252 3271
3253 win->menu.send_file = 3272 win->menu.send_file =
3254 gtk_item_factory_get_widget(win->menu.item_factory, 3273 gtk_item_factory_get_widget(win->menu.item_factory,
3255 N_("/Conversation/Send File...")); 3274 N_("/Conversation/Send File..."));
6317 conv->features |= PURPLE_CONNECTION_NO_IMAGES; 6336 conv->features |= PURPLE_CONNECTION_NO_IMAGES;
6318 6337
6319 if(conv->features & PURPLE_CONNECTION_NO_IMAGES) 6338 if(conv->features & PURPLE_CONNECTION_NO_IMAGES)
6320 buttons &= ~GTK_IMHTML_IMAGE; 6339 buttons &= ~GTK_IMHTML_IMAGE;
6321 6340
6341 #ifdef USE_FARSIGHT
6342 /* check if account support voice calls, and if the current buddy
6343 supports it */
6344 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
6345 if (serv_can_do_media(gc, purple_conversation_get_name(conv),
6346 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO)) {
6347 buttons |= GTK_IMHTML_CALL;
6348 gtk_widget_set_sensitive(win->menu.call, TRUE);
6349 } else {
6350 buttons &= ~GTK_IMHTML_CALL;
6351 gtk_widget_set_sensitive(win->menu.call, FALSE);
6352 }
6353 } else if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
6354 /* for now, don't care about chats... */
6355 buttons &= ~GTK_IMHTML_CALL;
6356 gtk_widget_set_sensitive(win->menu.call, FALSE);
6357 } else {
6358 buttons &= ~GTK_IMHTML_CALL;
6359 gtk_widget_set_sensitive(win->menu.call, FALSE);
6360 }
6361 #endif
6362
6322 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); 6363 gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
6323 if (account != NULL) 6364 if (account != NULL)
6324 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account)); 6365 gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
6325 6366
6326 /* Deal with menu items */ 6367 /* Deal with menu items */
6840 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); 6881 gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
6841 #if GTK_CHECK_VERSION(2,4,0) 6882 #if GTK_CHECK_VERSION(2,4,0)
6842 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE); 6883 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event), FALSE);
6843 #endif 6884 #endif
6844 gtk_widget_add_events(event, 6885 gtk_widget_add_events(event,
6845 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); 6886 GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK);
6846 g_signal_connect(G_OBJECT(event), "button-press-event", 6887 g_signal_connect(G_OBJECT(event), "button-press-event",
6847 G_CALLBACK(icon_menu), gtkconv); 6888 G_CALLBACK(icon_menu), gtkconv);
6848 6889
6849 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL); 6890 pidgin_tooltip_setup_for_widget(event, gtkconv, pidgin_conv_create_tooltip, NULL);
6850 gtk_widget_show(event); 6891 gtk_widget_show(event);
7573 } 7614 }
7574 7615
7575 return TRUE; 7616 return TRUE;
7576 } 7617 }
7577 7618
7619
7620 #ifdef USE_FARSIGHT
7621
7578 static void 7622 static void
7579 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv) 7623 pidgin_gtkmedia_message_cb(PidginMedia *media, const char *msg, PurpleConversation *conv)
7580 { 7624 {
7581 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); 7625 purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
7582 } 7626 }
7583 7627
7584 static void 7628 static void
7585 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) 7629 menu_initiate_voice_call_cb(gpointer data, guint action, GtkWidget *widget)
7586 { 7630 {
7631 PidginWindow *win = (PidginWindow *)data;
7632 GtkWidget *gtkmedia = NULL;
7633 PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
7634 PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv);
7635
7636 PurpleConnection *gc = purple_conversation_get_gc(conv);
7637 PurplePluginProtocolInfo *prpl = gc->prpl;
7638 PurpleMediaManager *manager = purple_media_manager_get();
7639
7640 PurpleMedia *media =
7641 serv_initiate_media(gc,
7642 purple_conversation_get_name(conv),
7643 PURPLE_MEDIA_RECV_AUDIO & PURPLE_MEDIA_SEND_AUDIO);
7587 GstElement *sendbin, *src, *sendlevel; 7644 GstElement *sendbin, *src, *sendlevel;
7588 GstElement *recvbin, *sink, *recvlevel; 7645 GstElement *recvbin, *sink, *recvlevel;
7589 GstPad *pad, *ghost; 7646 GstPad *pad, *ghost;
7590 7647
7648 purple_media_audio_init_src(&sendbin, &sendlevel);
7649 purple_media_audio_init_recv(&recvbin, &recvlevel);
7650
7651 purple_media_set_audio_src(media, sendbin);
7652 purple_media_set_audio_sink(media, recvbin);
7653
7654 gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_WAITING, sendlevel, recvlevel);
7655
7656 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7657 gtk_widget_show(gtkmedia);
7658 g_signal_connect(G_OBJECT(gtkmedia), "message",
7659 G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7660 /* need to setup handler for accept, reject and if we hangup here... */
7661 }
7662
7663 static void
7664 pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul)
7665 {
7666 GstElement *sendbin, *src, *sendlevel;
7667 GstElement *recvbin, *sink, *recvlevel;
7668 GstPad *pad, *ghost;
7669
7591 GtkWidget *gtkmedia; 7670 GtkWidget *gtkmedia;
7592 PurpleConversation *conv; 7671 PurpleConversation *conv;
7593 PidginConversation *gtkconv; 7672 PidginConversation *gtkconv;
7594 7673
7595 sendbin = gst_bin_new("sendbin"); 7674 purple_media_audio_init_src(&sendbin, &sendlevel);
7596 src = gst_element_factory_make("alsasrc", "asrc"); 7675 purple_media_audio_init_recv(&recvbin, &recvlevel);
7597 sendlevel = gst_element_factory_make("level", "sendlevel");
7598 gst_bin_add_many(GST_BIN(sendbin), src, sendlevel, NULL);
7599 gst_element_link(src, sendlevel); //, gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT, 8000, NULL));
7600 pad = gst_element_get_pad(sendlevel, "src");
7601 ghost = gst_ghost_pad_new("ghostsrc", pad);
7602 gst_element_add_pad(sendbin, ghost);
7603 g_object_set(G_OBJECT(sendlevel), "message", TRUE, NULL);
7604
7605 recvbin = gst_bin_new("pidginrecvbin");
7606 sink = gst_element_factory_make("alsasink", "asink");
7607 g_object_set(G_OBJECT(sink), "sync", FALSE, NULL);
7608 recvlevel = gst_element_factory_make("level", "recvlevel");
7609 gst_bin_add_many(GST_BIN(recvbin), sink, recvlevel, NULL);
7610 gst_element_link(recvlevel, sink);
7611 pad = gst_element_get_pad(recvlevel, "sink");
7612 ghost = gst_ghost_pad_new("ghostsink", pad);
7613 gst_element_add_pad(recvbin, ghost);
7614 g_object_set(G_OBJECT(recvlevel), "message", TRUE, NULL);
7615 7676
7616 purple_media_set_audio_src(media, sendbin); 7677 purple_media_set_audio_src(media, sendbin);
7617 purple_media_set_audio_sink(media, recvbin); 7678 purple_media_set_audio_sink(media, recvbin);
7618 7679
7619 gtkmedia = pidgin_media_new(media, sendlevel, recvlevel); 7680 gtkmedia = pidgin_media_new(media, PIDGIN_MEDIA_REQUESTED, sendlevel, recvlevel);
7620 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, 7681 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
7621 purple_connection_get_account(purple_media_get_connection(media)), 7682 purple_connection_get_account(purple_media_get_connection(media)),
7622 purple_media_get_screenname(media)); 7683 purple_media_get_screenname(media));
7623 gtkconv = PIDGIN_CONVERSATION(conv); 7684 gtkconv = PIDGIN_CONVERSATION(conv);
7624 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0); 7685 gtk_box_pack_start(GTK_BOX(gtkconv->topvbox), gtkmedia, FALSE, FALSE, 0);
7625 gtk_widget_show(gtkmedia); 7686 gtk_widget_show(gtkmedia);
7626 g_signal_connect_swapped(G_OBJECT(media), "got-hangup", G_CALLBACK(gtk_widget_destroy), gtkmedia);
7627 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv); 7687 g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv);
7628 } 7688 }
7689
7690 #endif
7629 7691
7630 void * 7692 void *
7631 pidgin_conversations_get_handle(void) 7693 pidgin_conversations_get_handle(void)
7632 { 7694 {
7633 static int handle; 7695 static int handle;