Mercurial > pidgin.yaz
comparison pidgin/gtkmedia.c @ 25706:1c68f78414b7
Set the media pipeline to PLAYING immediately after initialization
(and a few other changes to make it actually work and not hang).
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Thu, 17 Jul 2008 21:01:46 +0000 |
parents | a1a1f44cdecc |
children | 4eae2d40f11b |
comparison
equal
deleted
inserted
replaced
25705:e23b447aa5ca | 25706:1c68f78414b7 |
---|---|
286 } | 286 } |
287 | 287 |
288 static void | 288 static void |
289 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) | 289 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
290 { | 290 { |
291 GstElement *element = purple_media_get_pipeline(media); | |
292 | |
293 GstElement *audiosendbin = NULL, *audiosendlevel = NULL; | 291 GstElement *audiosendbin = NULL, *audiosendlevel = NULL; |
294 GstElement *audiorecvbin = NULL, *audiorecvlevel = NULL; | 292 GstElement *audiorecvbin = NULL, *audiorecvlevel = NULL; |
295 GstElement *videosendbin = NULL; | 293 GstElement *videosendbin = NULL; |
296 GstElement *videorecvbin = NULL; | 294 GstElement *videorecvbin = NULL; |
297 | 295 |
298 GList *sessions = purple_media_get_session_names(media); | 296 GList *sessions = purple_media_get_session_names(media); |
299 GstBus *bus; | |
300 | 297 |
301 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { | 298 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
302 if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_AUDIO) { | 299 if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_AUDIO) { |
303 if (!audiosendbin) | 300 if (!audiosendbin) |
304 purple_media_audio_init_src(&audiosendbin, &audiosendlevel); | 301 purple_media_audio_init_src(&audiosendbin, &audiosendlevel); |
305 if (!audiorecvbin) | 302 if (!audiorecvbin) |
306 purple_media_audio_init_recv(&audiorecvbin, &audiorecvlevel); | 303 purple_media_audio_init_recv(&audiorecvbin, &audiorecvlevel); |
307 purple_media_set_src(media, sessions->data, audiosendbin); | 304 purple_media_set_src(media, sessions->data, audiosendbin); |
308 purple_media_set_sink(media, sessions->data, audiorecvbin); | 305 purple_media_set_sink(media, sessions->data, audiorecvbin); |
306 | |
307 gst_element_set_state(audiosendbin, GST_STATE_READY); | |
308 gst_element_set_state(audiorecvbin, GST_STATE_READY); | |
309 } else if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_VIDEO) { | 309 } else if (purple_media_get_session_type(media, sessions->data) & PURPLE_MEDIA_VIDEO) { |
310 if (!videosendbin) | 310 if (!videosendbin) |
311 purple_media_video_init_src(&videosendbin); | 311 purple_media_video_init_src(&videosendbin); |
312 if (!videorecvbin) | 312 if (!videorecvbin) |
313 purple_media_video_init_recv(&videorecvbin); | 313 purple_media_video_init_recv(&videorecvbin); |
314 purple_media_set_src(media, sessions->data, videosendbin); | 314 purple_media_set_src(media, sessions->data, videosendbin); |
315 purple_media_set_sink(media, sessions->data, videorecvbin); | 315 purple_media_set_sink(media, sessions->data, videorecvbin); |
316 | |
317 gst_element_set_state(videosendbin, GST_STATE_READY); | |
318 gst_element_set_state(videorecvbin, GST_STATE_READY); | |
316 } | 319 } |
317 } | 320 } |
318 | 321 |
319 if (audiosendlevel && audiorecvlevel) { | 322 if (audiosendlevel && audiorecvlevel) { |
320 g_object_set(gtkmedia, "send-level", audiosendlevel, | 323 g_object_set(gtkmedia, "send-level", audiosendlevel, |
321 "recv-level", audiorecvlevel, | 324 "recv-level", audiorecvlevel, |
322 NULL); | 325 NULL); |
323 } | 326 } |
324 | |
325 bus = gst_pipeline_get_bus(GST_PIPELINE(element)); | |
326 gst_bus_add_signal_watch(GST_BUS(bus)); | |
327 g_signal_connect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), | |
328 "message", G_CALLBACK(level_message_cb), gtkmedia); | |
329 if (videorecvbin || videosendbin) | |
330 gst_bus_set_sync_handler(bus, (GstBusSyncHandler)create_window, gtkmedia); | |
331 gst_object_unref(bus); | |
332 } | 327 } |
333 | 328 |
334 static void | 329 static void |
335 pidgin_media_wait_cb(PurpleMedia *media, PidginMedia *gtkmedia) | 330 pidgin_media_wait_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
336 { | 331 { |
342 static void | 337 static void |
343 pidgin_media_accept_cb(PurpleMedia *media, PidginMedia *gtkmedia) | 338 pidgin_media_accept_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
344 { | 339 { |
345 GtkWidget *send_widget = NULL, *recv_widget = NULL; | 340 GtkWidget *send_widget = NULL, *recv_widget = NULL; |
346 | 341 |
342 GstElement *pipeline = purple_media_get_pipeline(media); | |
347 GstElement *audiosendbin = NULL; | 343 GstElement *audiosendbin = NULL; |
348 GstElement *audiorecvbin = NULL; | 344 GstElement *audiorecvbin = NULL; |
349 GstElement *videosendbin = NULL; | 345 GstElement *videosendbin = NULL; |
350 GstElement *videorecvbin = NULL; | 346 GstElement *videorecvbin = NULL; |
347 GstBus *bus; | |
351 | 348 |
352 pidgin_media_emit_message(gtkmedia, _("Call in progress.")); | 349 pidgin_media_emit_message(gtkmedia, _("Call in progress.")); |
353 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED); | 350 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED); |
354 | 351 |
355 purple_media_get_elements(media, &audiosendbin, &audiorecvbin, | 352 purple_media_get_elements(media, &audiosendbin, &audiorecvbin, |
390 gtk_widget_show(local_video); | 387 gtk_widget_show(local_video); |
391 gtk_widget_show(aspect); | 388 gtk_widget_show(aspect); |
392 | 389 |
393 gtkmedia->priv->local_video = local_video; | 390 gtkmedia->priv->local_video = local_video; |
394 gtkmedia->priv->remote_video = remote_video; | 391 gtkmedia->priv->remote_video = remote_video; |
392 | |
393 gst_element_set_state(videosendbin, GST_STATE_PLAYING); | |
394 gst_element_set_state(videorecvbin, GST_STATE_PLAYING); | |
395 } | 395 } |
396 | 396 |
397 if (audiorecvbin || audiosendbin) { | 397 if (audiorecvbin || audiosendbin) { |
398 gtk_widget_show(gtkmedia->priv->display); | 398 gtk_widget_show(gtkmedia->priv->display); |
399 | 399 |
413 gtk_box_pack_start(GTK_BOX(recv_widget), | 413 gtk_box_pack_start(GTK_BOX(recv_widget), |
414 gtkmedia->priv->recv_progress, FALSE, FALSE, 0); | 414 gtkmedia->priv->recv_progress, FALSE, FALSE, 0); |
415 | 415 |
416 gtk_widget_show(gtkmedia->priv->send_progress); | 416 gtk_widget_show(gtkmedia->priv->send_progress); |
417 gtk_widget_show(gtkmedia->priv->recv_progress); | 417 gtk_widget_show(gtkmedia->priv->recv_progress); |
418 } | 418 |
419 gst_element_set_state(audiosendbin, GST_STATE_PLAYING); | |
420 gst_element_set_state(audiorecvbin, GST_STATE_PLAYING); | |
421 } | |
422 | |
423 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); | |
424 if (audiorecvbin || audiosendbin) { | |
425 gst_bus_add_signal_watch(GST_BUS(bus)); | |
426 g_signal_connect(G_OBJECT(bus), "message", | |
427 G_CALLBACK(level_message_cb), gtkmedia); | |
428 } | |
429 if (videorecvbin || videosendbin) | |
430 gst_bus_set_sync_handler(bus, (GstBusSyncHandler)create_window, gtkmedia); | |
431 gst_object_unref(bus); | |
419 } | 432 } |
420 | 433 |
421 static void | 434 static void |
422 pidgin_media_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) | 435 pidgin_media_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
423 { | 436 { |