Mercurial > pidgin
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; |