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