| 300 } |
300 } |
| 301 |
301 |
| 302 static void |
302 static void |
| 303 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
303 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
| 304 { |
304 { |
| |
305 GstElement *pipeline = purple_media_get_pipeline(media); |
| |
306 GtkWidget *send_widget = NULL, *recv_widget = NULL; |
| 305 GstElement *audiosendbin = NULL, *audiosendlevel = NULL; |
307 GstElement *audiosendbin = NULL, *audiosendlevel = NULL; |
| 306 GstElement *audiorecvbin = NULL, *audiorecvlevel = NULL; |
|
| 307 GstElement *videosendbin = NULL; |
308 GstElement *videosendbin = NULL; |
| 308 GstElement *videorecvbin = NULL; |
309 gboolean audiorecvbool = FALSE; |
| |
310 gboolean videorecvbool = FALSE; |
| |
311 GstBus *bus; |
| 309 |
312 |
| 310 GList *sessions = purple_media_get_session_names(media); |
313 GList *sessions = purple_media_get_session_names(media); |
| 311 |
314 |
| 312 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
315 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
| 313 PurpleMediaSessionType type = purple_media_get_session_type(media, sessions->data); |
316 PurpleMediaSessionType type = purple_media_get_session_type(media, sessions->data); |
| 315 if (!audiosendbin && (type & PURPLE_MEDIA_SEND_AUDIO)) { |
318 if (!audiosendbin && (type & PURPLE_MEDIA_SEND_AUDIO)) { |
| 316 purple_media_audio_init_src(&audiosendbin, &audiosendlevel); |
319 purple_media_audio_init_src(&audiosendbin, &audiosendlevel); |
| 317 purple_media_set_src(media, sessions->data, audiosendbin); |
320 purple_media_set_src(media, sessions->data, audiosendbin); |
| 318 gst_element_set_state(audiosendbin, GST_STATE_PLAYING); |
321 gst_element_set_state(audiosendbin, GST_STATE_PLAYING); |
| 319 } |
322 } |
| 320 if (!audiorecvbin && (type & PURPLE_MEDIA_RECV_AUDIO)) { |
323 if (!audiorecvbool && (type & PURPLE_MEDIA_RECV_AUDIO)) { |
| 321 purple_media_audio_init_recv(&audiorecvbin, &audiorecvlevel); |
324 audiorecvbool = TRUE; |
| 322 purple_media_set_sink(media, sessions->data, audiorecvbin); |
|
| 323 gst_element_set_state(audiorecvbin, GST_STATE_READY); |
|
| 324 } |
325 } |
| 325 } else if (type & PURPLE_MEDIA_VIDEO) { |
326 } else if (type & PURPLE_MEDIA_VIDEO) { |
| 326 if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) { |
327 if (!videosendbin && (type & PURPLE_MEDIA_SEND_VIDEO)) { |
| 327 purple_media_video_init_src(&videosendbin); |
328 purple_media_video_init_src(&videosendbin); |
| 328 purple_media_set_src(media, sessions->data, videosendbin); |
329 purple_media_set_src(media, sessions->data, videosendbin); |
| 329 gst_element_set_state(videosendbin, GST_STATE_PLAYING); |
330 gst_element_set_state(videosendbin, GST_STATE_PLAYING); |
| 330 } |
331 } |
| 331 if (!videorecvbin && (type & PURPLE_MEDIA_RECV_VIDEO)) { |
332 if (!videorecvbool && (type & PURPLE_MEDIA_RECV_VIDEO)) { |
| 332 purple_media_video_init_recv(&videorecvbin); |
333 videorecvbool = TRUE; |
| 333 purple_media_set_sink(media, sessions->data, videorecvbin); |
|
| 334 gst_element_set_state(videorecvbin, GST_STATE_READY); |
|
| 335 } |
334 } |
| 336 } |
335 } |
| 337 } |
336 } |
| 338 |
337 |
| 339 if (audiosendlevel || audiorecvlevel) { |
338 if (videorecvbool || audiorecvbool) { |
| 340 g_object_set(gtkmedia, "send-level", audiosendlevel, |
|
| 341 "recv-level", audiorecvlevel, |
|
| 342 NULL); |
|
| 343 } |
|
| 344 } |
|
| 345 |
|
| 346 static void |
|
| 347 pidgin_media_wait_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
|
| 348 { |
|
| 349 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_WAITING); |
|
| 350 } |
|
| 351 |
|
| 352 /* maybe we should have different callbacks for when we received the accept |
|
| 353 and we accepted ourselves */ |
|
| 354 static void |
|
| 355 pidgin_media_accept_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
|
| 356 { |
|
| 357 GtkWidget *send_widget = NULL, *recv_widget = NULL; |
|
| 358 |
|
| 359 GstElement *pipeline = purple_media_get_pipeline(media); |
|
| 360 GstElement *audiosendbin = NULL; |
|
| 361 GstElement *audiorecvbin = NULL; |
|
| 362 GstElement *videosendbin = NULL; |
|
| 363 GstElement *videorecvbin = NULL; |
|
| 364 GstBus *bus; |
|
| 365 |
|
| 366 pidgin_media_emit_message(gtkmedia, _("Call in progress.")); |
|
| 367 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED); |
|
| 368 |
|
| 369 purple_media_get_elements(media, &audiosendbin, &audiorecvbin, |
|
| 370 &videosendbin, &videorecvbin); |
|
| 371 |
|
| 372 if (videorecvbin || audiorecvbin) { |
|
| 373 recv_widget = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
339 recv_widget = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 374 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), |
340 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), |
| 375 recv_widget, TRUE, TRUE, 0); |
341 recv_widget, TRUE, TRUE, 0); |
| 376 gtk_widget_show(recv_widget); |
342 gtk_widget_show(recv_widget); |
| 377 } |
343 } |
| 380 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), |
346 gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), |
| 381 send_widget, TRUE, TRUE, 0); |
347 send_widget, TRUE, TRUE, 0); |
| 382 gtk_widget_show(send_widget); |
348 gtk_widget_show(send_widget); |
| 383 } |
349 } |
| 384 |
350 |
| 385 if (videorecvbin) { |
351 if (videorecvbool) { |
| 386 GtkWidget *aspect; |
352 GtkWidget *aspect; |
| 387 GtkWidget *remote_video; |
353 GtkWidget *remote_video; |
| 388 |
354 |
| 389 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); |
355 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); |
| 390 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); |
356 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); |
| 395 gtk_widget_set_size_request (GTK_WIDGET(remote_video), 100, -1); |
361 gtk_widget_set_size_request (GTK_WIDGET(remote_video), 100, -1); |
| 396 gtk_widget_show(remote_video); |
362 gtk_widget_show(remote_video); |
| 397 gtk_widget_show(aspect); |
363 gtk_widget_show(aspect); |
| 398 |
364 |
| 399 gtkmedia->priv->remote_video = remote_video; |
365 gtkmedia->priv->remote_video = remote_video; |
| 400 gst_element_set_state(videorecvbin, GST_STATE_PLAYING); |
|
| 401 } |
366 } |
| 402 if (videosendbin) { |
367 if (videosendbin) { |
| 403 GtkWidget *aspect; |
368 GtkWidget *aspect; |
| 404 GtkWidget *local_video; |
369 GtkWidget *local_video; |
| 405 GstElement *tee, *queue; |
|
| 406 |
370 |
| 407 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); |
371 aspect = gtk_aspect_frame_new(NULL, 0.5, 0.5, 4.0/3.0, FALSE); |
| 408 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); |
372 gtk_frame_set_shadow_type(GTK_FRAME(aspect), GTK_SHADOW_IN); |
| 409 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); |
373 gtk_box_pack_start(GTK_BOX(send_widget), aspect, TRUE, TRUE, 0); |
| 410 |
374 |
| 413 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1); |
377 gtk_widget_set_size_request (GTK_WIDGET(local_video), 100, -1); |
| 414 gtk_widget_show(local_video); |
378 gtk_widget_show(local_video); |
| 415 gtk_widget_show(aspect); |
379 gtk_widget_show(aspect); |
| 416 |
380 |
| 417 gtkmedia->priv->local_video = local_video; |
381 gtkmedia->priv->local_video = local_video; |
| 418 |
382 } |
| 419 tee = gst_bin_get_by_name(GST_BIN(videosendbin), "purplevideosrctee"); |
383 |
| 420 queue = gst_bin_get_by_name(GST_BIN(videosendbin), "purplelocalvideoqueue"); |
384 if (audiorecvbool) { |
| 421 gst_element_link(tee, queue); |
|
| 422 gst_object_unref(tee); |
|
| 423 gst_object_unref(queue); |
|
| 424 } |
|
| 425 |
|
| 426 if (audiorecvbin) { |
|
| 427 gtkmedia->priv->recv_progress = gtk_progress_bar_new(); |
385 gtkmedia->priv->recv_progress = gtk_progress_bar_new(); |
| 428 gtk_widget_set_size_request(gtkmedia->priv->recv_progress, 10, 70); |
386 gtk_widget_set_size_request(gtkmedia->priv->recv_progress, 10, 70); |
| 429 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(gtkmedia->priv->recv_progress), |
387 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(gtkmedia->priv->recv_progress), |
| 430 GTK_PROGRESS_BOTTOM_TO_TOP); |
388 GTK_PROGRESS_BOTTOM_TO_TOP); |
| 431 gtk_box_pack_end(GTK_BOX(recv_widget), |
389 gtk_box_pack_end(GTK_BOX(recv_widget), |
| 432 gtkmedia->priv->recv_progress, FALSE, FALSE, 0); |
390 gtkmedia->priv->recv_progress, FALSE, FALSE, 0); |
| 433 gtk_widget_show(gtkmedia->priv->recv_progress); |
391 gtk_widget_show(gtkmedia->priv->recv_progress); |
| 434 gst_element_set_state(audiorecvbin, GST_STATE_PLAYING); |
|
| 435 } |
392 } |
| 436 if (audiosendbin) { |
393 if (audiosendbin) { |
| 437 gtkmedia->priv->send_progress = gtk_progress_bar_new(); |
394 gtkmedia->priv->send_progress = gtk_progress_bar_new(); |
| 438 gtk_widget_set_size_request(gtkmedia->priv->send_progress, 10, 70); |
395 gtk_widget_set_size_request(gtkmedia->priv->send_progress, 10, 70); |
| 439 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(gtkmedia->priv->send_progress), |
396 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(gtkmedia->priv->send_progress), |
| 443 gtk_widget_show(gtkmedia->priv->send_progress); |
400 gtk_widget_show(gtkmedia->priv->send_progress); |
| 444 |
401 |
| 445 gtk_widget_show(gtkmedia->priv->mute); |
402 gtk_widget_show(gtkmedia->priv->mute); |
| 446 } |
403 } |
| 447 |
404 |
| |
405 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); |
| |
406 |
| |
407 if (videorecvbool || videosendbin) |
| |
408 gst_bus_set_sync_handler(bus, |
| |
409 (GstBusSyncHandler)create_window, gtkmedia); |
| |
410 |
| |
411 if (audiorecvbool || audiosendbin) |
| |
412 g_signal_connect(G_OBJECT(bus), "message::element", |
| |
413 G_CALLBACK(level_message_cb), gtkmedia); |
| |
414 |
| |
415 gst_object_unref(bus); |
| |
416 } |
| |
417 |
| |
418 static void |
| |
419 pidgin_media_wait_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
| |
420 { |
| |
421 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_WAITING); |
| |
422 } |
| |
423 |
| |
424 /* maybe we should have different callbacks for when we received the accept |
| |
425 and we accepted ourselves */ |
| |
426 static void |
| |
427 pidgin_media_accept_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
| |
428 { |
| |
429 GstElement *audiosendbin = NULL; |
| |
430 GstElement *audiorecvbin = NULL; |
| |
431 GstElement *videosendbin = NULL; |
| |
432 GstElement *videorecvbin = NULL; |
| |
433 |
| |
434 pidgin_media_emit_message(gtkmedia, _("Call in progress.")); |
| |
435 pidgin_media_set_state(gtkmedia, PIDGIN_MEDIA_ACCEPTED); |
| |
436 |
| |
437 purple_media_get_elements(media, &audiosendbin, &audiorecvbin, |
| |
438 &videosendbin, &videorecvbin); |
| |
439 |
| 448 if (audiorecvbin || audiosendbin || videorecvbin || videosendbin) |
440 if (audiorecvbin || audiosendbin || videorecvbin || videosendbin) |
| 449 gtk_widget_show(gtkmedia->priv->display); |
441 gtk_widget_show(gtkmedia->priv->display); |
| 450 |
|
| 451 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); |
|
| 452 if (audiorecvbin || audiosendbin) |
|
| 453 g_signal_connect(G_OBJECT(bus), "message::element", |
|
| 454 G_CALLBACK(level_message_cb), gtkmedia); |
|
| 455 if (videorecvbin || videosendbin) |
|
| 456 gst_bus_set_sync_handler(bus, (GstBusSyncHandler)create_window, gtkmedia); |
|
| 457 gst_object_unref(bus); |
|
| 458 } |
442 } |
| 459 |
443 |
| 460 static void |
444 static void |
| 461 pidgin_media_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
445 pidgin_media_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) |
| 462 { |
446 { |