comparison finch/gntmedia.c @ 23821:12a16471f94e

Refactored PurpleMedia to make creating audio or video sessions virtually identical. Audio, video, and audio/video sessions now work. Also added videotestsrc to the video plugin preference.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 06 Jun 2008 07:43:03 +0000
parents cbe97caec684
children eb8c8a926589
comparison
equal deleted inserted replaced
23820:42e17cc5b6d2 23821:12a16471f94e
124 g_object_class_install_property(gobject_class, PROP_SEND_LEVEL, 124 g_object_class_install_property(gobject_class, PROP_SEND_LEVEL,
125 g_param_spec_object("send-level", 125 g_param_spec_object("send-level",
126 "Send level", 126 "Send level",
127 "The GstElement of this media's send 'level'", 127 "The GstElement of this media's send 'level'",
128 GST_TYPE_ELEMENT, 128 GST_TYPE_ELEMENT,
129 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); 129 G_PARAM_READWRITE));
130 g_object_class_install_property(gobject_class, PROP_RECV_LEVEL, 130 g_object_class_install_property(gobject_class, PROP_RECV_LEVEL,
131 g_param_spec_object("recv-level", 131 g_param_spec_object("recv-level",
132 "Receive level", 132 "Receive level",
133 "The GstElement of this media's recv 'level'", 133 "The GstElement of this media's recv 'level'",
134 GST_TYPE_ELEMENT, 134 GST_TYPE_ELEMENT,
135 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); 135 G_PARAM_READWRITE));
136 136
137 finch_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass), 137 finch_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass),
138 G_SIGNAL_RUN_LAST, 0, NULL, NULL, 138 G_SIGNAL_RUN_LAST, 0, NULL, NULL,
139 g_cclosure_marshal_VOID__STRING, 139 g_cclosure_marshal_VOID__STRING,
140 G_TYPE_NONE, 1, G_TYPE_STRING); 140 G_TYPE_NONE, 1, G_TYPE_STRING);
215 } 215 }
216 216
217 static void 217 static void
218 finch_media_ready_cb(PurpleMedia *media, FinchMedia *gntmedia) 218 finch_media_ready_cb(PurpleMedia *media, FinchMedia *gntmedia)
219 { 219 {
220 GstElement *element = purple_media_get_audio_pipeline(media); 220 GstElement *element = purple_media_get_pipeline(media);
221
222 GstElement *sendbin, *sendlevel;
223 GstElement *recvbin, *recvlevel;
224
225 GList *sessions = purple_media_get_session_names(media);
226
227 purple_media_audio_init_src(&sendbin, &sendlevel);
228 purple_media_audio_init_recv(&recvbin, &recvlevel);
229
230 for (; sessions; sessions = sessions->next) {
231 purple_media_set_src(media, sessions->data, sendbin);
232 purple_media_set_sink(media, sessions->data, recvbin);
233 }
234 g_list_free(sessions);
235
236 g_object_set(gntmedia, "send-level", &sendlevel,
237 "recv-level", &recvlevel,
238 NULL);
239
221 gst_bus_add_signal_watch(GST_BUS(gst_pipeline_get_bus(GST_PIPELINE(element)))); 240 gst_bus_add_signal_watch(GST_BUS(gst_pipeline_get_bus(GST_PIPELINE(element))));
222 g_signal_connect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), "message", G_CALLBACK(level_message_cb), gntmedia); 241 g_signal_connect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), "message", G_CALLBACK(level_message_cb), gntmedia);
223 } 242 }
224 243
225 static void 244 static void
375 break; 394 break;
376 } 395 }
377 } 396 }
378 397
379 GntWidget * 398 GntWidget *
380 finch_media_new(PurpleMedia *media, GstElement *sendlevel, GstElement *recvlevel) 399 finch_media_new(PurpleMedia *media)
381 { 400 {
382 return GNT_WIDGET(g_object_new(finch_media_get_type(), 401 return GNT_WIDGET(g_object_new(finch_media_get_type(),
383 "media", media, 402 "media", media,
384 "send-level", sendlevel,
385 "recv-level", recvlevel,
386 "vertical", FALSE, 403 "vertical", FALSE,
387 "homogeneous", FALSE, 404 "homogeneous", FALSE,
388 NULL)); 405 NULL));
389 } 406 }
390 407
397 } 414 }
398 415
399 static void 416 static void
400 finch_new_media(PurpleMediaManager *manager, PurpleMedia *media, gpointer null) 417 finch_new_media(PurpleMediaManager *manager, PurpleMedia *media, gpointer null)
401 { 418 {
402 GstElement *sendbin, *sendlevel;
403 GstElement *recvbin, *recvlevel;
404 GntWidget *gntmedia; 419 GntWidget *gntmedia;
405 PurpleConversation *conv; 420 PurpleConversation *conv;
406
407 purple_media_audio_init_src(&sendbin, &sendlevel);
408 purple_media_audio_init_recv(&recvbin, &recvlevel);
409
410 purple_media_set_audio_src(media, sendbin);
411 purple_media_set_audio_sink(media, recvbin);
412 421
413 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, 422 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM,
414 purple_connection_get_account(purple_media_get_connection(media)), 423 purple_connection_get_account(purple_media_get_connection(media)),
415 purple_media_get_screenname(media)); 424 purple_media_get_screenname(media));
416 425
417 gntmedia = finch_media_new(media, sendlevel, recvlevel); 426 gntmedia = finch_media_new(media);
418 g_signal_connect(G_OBJECT(gntmedia), "message", G_CALLBACK(gntmedia_message_cb), conv); 427 g_signal_connect(G_OBJECT(gntmedia), "message", G_CALLBACK(gntmedia_message_cb), conv);
419 FINCH_MEDIA(gntmedia)->priv->conv = conv; 428 FINCH_MEDIA(gntmedia)->priv->conv = conv;
420 finch_conversation_set_info_widget(conv, gntmedia); 429 finch_conversation_set_info_widget(conv, gntmedia);
421 } 430 }
422 431