pidgin/gtkmedia.c

branch
maiku.vv
changeset 26151
218a4f61cf0d
parent 26143
673b6665624d
child 26158
3c52c0332696
equal deleted inserted replaced
26150:951503fc5456 26151:218a4f61cf0d
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 {

mercurial