Mercurial > pidgin
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 |