comparison libpurple/media.c @ 23801:43b3b9ff6028

Added better Farsight error handling. Fixes several crash bugs related to missing GStreamer/Farsight plugins.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Tue, 27 May 2008 02:24:03 +0000
parents 6bf2dfb350c0
children cbe97caec684
comparison
equal deleted inserted replaced
23800:4b9b265a8100 23801:43b3b9ff6028
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 {