| 708 purple_debug_info("media", "connecting new src pad: %s\n", |
708 purple_debug_info("media", "connecting new src pad: %s\n", |
| 709 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); |
709 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); |
| 710 gst_element_set_state(pipeline, GST_STATE_PLAYING); |
710 gst_element_set_state(pipeline, GST_STATE_PLAYING); |
| 711 } |
711 } |
| 712 |
712 |
| 713 static void |
713 static gboolean |
| 714 purple_media_add_stream_internal(PurpleMedia *media, FsSession **session, GList **streams, |
714 purple_media_add_stream_internal(PurpleMedia *media, FsSession **session, GList **streams, |
| 715 GstElement *src, const gchar *who, FsMediaType type, |
715 GstElement *src, const gchar *who, FsMediaType type, |
| 716 FsStreamDirection type_direction, const gchar *transmitter) |
716 FsStreamDirection type_direction, const gchar *transmitter) |
| 717 { |
717 { |
| 718 char *cname = NULL; |
718 char *cname = NULL; |
| 722 FsParticipant *p = NULL; |
722 FsParticipant *p = NULL; |
| 723 FsStreamDirection *direction = NULL; |
723 FsStreamDirection *direction = NULL; |
| 724 FsSession *s = NULL; |
724 FsSession *s = NULL; |
| 725 |
725 |
| 726 if (!*session) { |
726 if (!*session) { |
| 727 *session = fs_conference_new_session(media->priv->conference, type, NULL); |
727 GError *err = NULL; |
| |
728 *session = fs_conference_new_session(media->priv->conference, type, &err); |
| |
729 |
| |
730 if (err != NULL) { |
| |
731 purple_debug_error("media", "Error creating session: %s\n", err->message); |
| |
732 g_error_free(err); |
| |
733 purple_conv_present_error(who, |
| |
734 purple_connection_get_account(purple_media_get_connection(media)), |
| |
735 _("Error creating session.")); |
| |
736 return FALSE; |
| |
737 } |
| |
738 |
| 728 if (src) { |
739 if (src) { |
| 729 GstPad *sinkpad; |
740 GstPad *sinkpad; |
| 730 GstPad *srcpad; |
741 GstPad *srcpad; |
| 731 g_object_get(*session, "sink-pad", &sinkpad, NULL); |
742 g_object_get(*session, "sink-pad", &sinkpad, NULL); |
| 732 srcpad = gst_element_get_static_pad(src, "ghostsrc"); |
743 srcpad = gst_element_get_static_pad(src, "ghostsrc"); |
| 780 G_CALLBACK(purple_media_candidate_pair_established), media); |
791 G_CALLBACK(purple_media_candidate_pair_established), media); |
| 781 } else if (*direction != type_direction) { |
792 } else if (*direction != type_direction) { |
| 782 /* change direction */ |
793 /* change direction */ |
| 783 g_object_set(stream, "direction", type_direction, NULL); |
794 g_object_set(stream, "direction", type_direction, NULL); |
| 784 } |
795 } |
| 785 } |
796 |
| 786 |
797 return TRUE; |
| 787 void |
798 } |
| |
799 |
| |
800 gboolean |
| 788 purple_media_add_stream(PurpleMedia *media, const gchar *who, |
801 purple_media_add_stream(PurpleMedia *media, const gchar *who, |
| 789 PurpleMediaStreamType type, |
802 PurpleMediaStreamType type, |
| 790 const gchar *transmitter) |
803 const gchar *transmitter) |
| 791 { |
804 { |
| 792 FsStreamDirection type_direction; |
805 FsStreamDirection type_direction; |
| 799 else if (type & PURPLE_MEDIA_RECV_AUDIO) |
812 else if (type & PURPLE_MEDIA_RECV_AUDIO) |
| 800 type_direction = FS_DIRECTION_RECV; |
813 type_direction = FS_DIRECTION_RECV; |
| 801 else |
814 else |
| 802 type_direction = FS_DIRECTION_NONE; |
815 type_direction = FS_DIRECTION_NONE; |
| 803 |
816 |
| 804 purple_media_add_stream_internal(media, &media->priv->audio_session, |
817 if (!purple_media_add_stream_internal(media, &media->priv->audio_session, |
| 805 &media->priv->audio_streams, |
818 &media->priv->audio_streams, |
| 806 media->priv->audio_src, who, |
819 media->priv->audio_src, who, |
| 807 FS_MEDIA_TYPE_AUDIO, type_direction, |
820 FS_MEDIA_TYPE_AUDIO, type_direction, |
| 808 transmitter); |
821 transmitter)) { |
| |
822 return FALSE; |
| |
823 } |
| 809 } |
824 } |
| 810 if (type & PURPLE_MEDIA_VIDEO) { |
825 if (type & PURPLE_MEDIA_VIDEO) { |
| 811 if (type & PURPLE_MEDIA_SEND_VIDEO && type & PURPLE_MEDIA_RECV_VIDEO) |
826 if (type & PURPLE_MEDIA_SEND_VIDEO && type & PURPLE_MEDIA_RECV_VIDEO) |
| 812 type_direction = FS_DIRECTION_BOTH; |
827 type_direction = FS_DIRECTION_BOTH; |
| 813 else if (type & PURPLE_MEDIA_SEND_VIDEO) |
828 else if (type & PURPLE_MEDIA_SEND_VIDEO) |
| 815 else if (type & PURPLE_MEDIA_RECV_VIDEO) |
830 else if (type & PURPLE_MEDIA_RECV_VIDEO) |
| 816 type_direction = FS_DIRECTION_RECV; |
831 type_direction = FS_DIRECTION_RECV; |
| 817 else |
832 else |
| 818 type_direction = FS_DIRECTION_NONE; |
833 type_direction = FS_DIRECTION_NONE; |
| 819 |
834 |
| 820 purple_media_add_stream_internal(media, &media->priv->video_session, |
835 if (!purple_media_add_stream_internal(media, &media->priv->video_session, |
| 821 &media->priv->video_streams, |
836 &media->priv->video_streams, |
| 822 media->priv->video_src, who, |
837 media->priv->video_src, who, |
| 823 FS_MEDIA_TYPE_VIDEO, type_direction, |
838 FS_MEDIA_TYPE_VIDEO, type_direction, |
| 824 transmitter); |
839 transmitter)) { |
| 825 } |
840 return FALSE; |
| |
841 } |
| |
842 } |
| |
843 return TRUE; |
| 826 } |
844 } |
| 827 |
845 |
| 828 void |
846 void |
| 829 purple_media_remove_stream(PurpleMedia *media, const gchar *who, PurpleMediaStreamType type) |
847 purple_media_remove_stream(PurpleMedia *media, const gchar *who, PurpleMediaStreamType type) |
| 830 { |
848 { |