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 {