comparison libpurple/media/media.c @ 29155:41ae97b7e97e

Start to use the media backend code in PurpleMedia and PurpleMediaManager.
author maiku@pidgin.im
date Fri, 23 Oct 2009 02:11:33 +0000
parents 30e8ab2a4bc2
children 846a475a1573
comparison
equal deleted inserted replaced
29154:2f8151fed0ae 29155:41ae97b7e97e
28 28
29 #include "internal.h" 29 #include "internal.h"
30 30
31 #include "account.h" 31 #include "account.h"
32 #include "media.h" 32 #include "media.h"
33 #include "media/backend-fs2.h"
34 #include "media/backend-iface.h"
33 #include "mediamanager.h" 35 #include "mediamanager.h"
34 #include "network.h" 36 #include "network.h"
35 37
36 #include "debug.h" 38 #include "debug.h"
37 39
106 struct _PurpleMediaPrivate 108 struct _PurpleMediaPrivate
107 { 109 {
108 #ifdef USE_VV 110 #ifdef USE_VV
109 PurpleMediaManager *manager; 111 PurpleMediaManager *manager;
110 PurpleAccount *account; 112 PurpleAccount *account;
113 PurpleMediaBackend *backend;
111 FsConference *conference; 114 FsConference *conference;
112 gchar *conference_type; 115 gchar *conference_type;
113 gboolean initiator; 116 gboolean initiator;
114 gpointer prpl_data; 117 gpointer prpl_data;
115 118
339 342
340 purple_debug_info("media","purple_media_dispose\n"); 343 purple_debug_info("media","purple_media_dispose\n");
341 344
342 purple_media_manager_remove_media(priv->manager, PURPLE_MEDIA(media)); 345 purple_media_manager_remove_media(priv->manager, PURPLE_MEDIA(media));
343 346
344 if (priv->confbin) { 347 if (priv->backend) {
345 gst_element_set_locked_state(priv->confbin, TRUE); 348 g_object_unref(priv->backend);
346 gst_element_set_state(GST_ELEMENT(priv->confbin), 349 priv->backend = NULL;
347 GST_STATE_NULL);
348 gst_bin_remove(GST_BIN(purple_media_manager_get_pipeline(
349 priv->manager)), priv->confbin);
350 priv->confbin = NULL;
351 priv->conference = NULL;
352 } 350 }
353 351
354 for (iter = priv->streams; iter; iter = g_list_next(iter)) { 352 for (iter = priv->streams; iter; iter = g_list_next(iter)) {
355 PurpleMediaStream *stream = iter->data; 353 PurpleMediaStream *stream = iter->data;
356 if (stream->stream) { 354 if (stream->stream) {
411 409
412 G_OBJECT_CLASS(parent_class)->finalize(media); 410 G_OBJECT_CLASS(parent_class)->finalize(media);
413 } 411 }
414 412
415 static void 413 static void
416 purple_media_setup_pipeline(PurpleMedia *media)
417 {
418 GstBus *bus;
419 gchar *name;
420 GstElement *pipeline;
421
422 if (media->priv->conference == NULL || media->priv->manager == NULL)
423 return;
424
425 pipeline = purple_media_manager_get_pipeline(media->priv->manager);
426
427 name = g_strdup_printf("conf_%p",
428 media->priv->conference);
429 media->priv->confbin = gst_bin_new(name);
430 g_free(name);
431
432 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
433 g_signal_connect(G_OBJECT(bus), "message",
434 G_CALLBACK(media_bus_call), media);
435 gst_object_unref(bus);
436
437 gst_bin_add(GST_BIN(pipeline),
438 media->priv->confbin);
439 gst_bin_add(GST_BIN(media->priv->confbin),
440 GST_ELEMENT(media->priv->conference));
441 gst_element_set_state(GST_ELEMENT(media->priv->confbin),
442 GST_STATE_PLAYING);
443 }
444
445 static void
446 purple_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) 414 purple_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
447 { 415 {
448 PurpleMedia *media; 416 PurpleMedia *media;
449 g_return_if_fail(PURPLE_IS_MEDIA(object)); 417 g_return_if_fail(PURPLE_IS_MEDIA(object));
450 418
451 media = PURPLE_MEDIA(object); 419 media = PURPLE_MEDIA(object);
452 420
453 switch (prop_id) { 421 switch (prop_id) {
454 case PROP_MANAGER: 422 case PROP_MANAGER:
455 media->priv->manager = g_value_get_object(value); 423 media->priv->manager = g_value_dup_object(value);
456 g_object_ref(media->priv->manager);
457
458 purple_media_setup_pipeline(media);
459 break; 424 break;
460 case PROP_ACCOUNT: 425 case PROP_ACCOUNT:
461 media->priv->account = g_value_get_pointer(value); 426 media->priv->account = g_value_get_pointer(value);
462 break; 427 break;
463 case PROP_CONFERENCE: { 428 case PROP_CONFERENCE: {
464 if (media->priv->conference) 429 if (media->priv->conference)
465 gst_object_unref(media->priv->conference); 430 gst_object_unref(media->priv->conference);
466 media->priv->conference = g_value_get_object(value); 431 media->priv->conference = g_value_dup_object(value);
467 gst_object_ref(media->priv->conference);
468
469 purple_media_setup_pipeline(media);
470 break; 432 break;
471 } 433 }
472 case PROP_CONFERENCE_TYPE: 434 case PROP_CONFERENCE_TYPE:
473 media->priv->conference_type = 435 media->priv->conference_type =
474 g_value_dup_string(value); 436 g_value_dup_string(value);
437 /* Will eventually get this type from the media manager */
438 media->priv->backend = g_object_new(
439 PURPLE_TYPE_MEDIA_BACKEND_FS2,
440 "conference-type",
441 media->priv->conference_type,
442 "media", media,
443 NULL);
475 break; 444 break;
476 case PROP_INITIATOR: 445 case PROP_INITIATOR:
477 media->priv->initiator = g_value_get_boolean(value); 446 media->priv->initiator = g_value_get_boolean(value);
478 break; 447 break;
479 case PROP_PRPL_DATA: 448 case PROP_PRPL_DATA:
1628 purple_media_to_fs_stream_direction(type); 1597 purple_media_to_fs_stream_direction(type);
1629 gboolean is_nice = !strcmp(transmitter, "nice"); 1598 gboolean is_nice = !strcmp(transmitter, "nice");
1630 1599
1631 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE); 1600 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
1632 1601
1602 if (!purple_media_backend_add_stream(media->priv->backend,
1603 sess_id, who, type, initiator, transmitter,
1604 num_params, params)) {
1605 purple_debug_error("media", "Error adding stream.\n");
1606 return FALSE;
1607 }
1608
1609 /* XXX: Temporary call while integrating with backend */
1610 if (media->priv->conference == NULL) {
1611 GstBus *bus;
1612 media->priv->conference =
1613 purple_media_backend_fs2_get_conference(
1614 PURPLE_MEDIA_BACKEND_FS2(
1615 media->priv->backend));
1616 media->priv->confbin = GST_ELEMENT_PARENT(
1617 media->priv->conference);
1618 bus = gst_pipeline_get_bus(GST_PIPELINE(
1619 purple_media_manager_get_pipeline(
1620 purple_media_manager_get())));
1621 g_signal_connect(G_OBJECT(bus), "message",
1622 G_CALLBACK(media_bus_call), media);
1623 gst_object_unref(bus);
1624 }
1625
1633 session = purple_media_get_session(media, sess_id); 1626 session = purple_media_get_session(media, sess_id);
1634 1627
1635 if (!session) { 1628 if (!session) {
1636 GError *err = NULL; 1629 GError *err = NULL;
1637 GList *codec_conf = NULL, *iter = NULL; 1630 GList *codec_conf = NULL, *iter = NULL;