comparison libpurple/media/media.c @ 29158:ae81f8baa148

Transfer some GStreamer message handling to the Farsight 2 media backend.
author maiku@pidgin.im
date Fri, 23 Oct 2009 19:59:12 +0000
parents e85df0170905
children efeb21092ed2
comparison
equal deleted inserted replaced
29157:e85df0170905 29158:ae81f8baa148
1063 !PURPLE_IS_MEDIA(media) || 1063 !PURPLE_IS_MEDIA(media) ||
1064 media->priv->conference != 1064 media->priv->conference !=
1065 FS_CONFERENCE(GST_MESSAGE_SRC(msg))) 1065 FS_CONFERENCE(GST_MESSAGE_SRC(msg)))
1066 break; 1066 break;
1067 1067
1068 if (gst_structure_has_name(msg->structure, "farsight-error")) { 1068 if (gst_structure_has_name(msg->structure,
1069 FsError error_no;
1070 gst_structure_get_enum(msg->structure, "error-no",
1071 FS_TYPE_ERROR, (gint*)&error_no);
1072 switch (error_no) {
1073 case FS_ERROR_NO_CODECS:
1074 purple_media_error(media, _("No codecs found. Install some GStreamer codecs found in GStreamer plugins packages."));
1075 purple_media_end(media, NULL, NULL);
1076 break;
1077 case FS_ERROR_NO_CODECS_LEFT:
1078 purple_media_error(media, _("No codecs left. Your codec preferences in fs-codecs.conf are too strict."));
1079 purple_media_end(media, NULL, NULL);
1080 break;
1081 case FS_ERROR_UNKNOWN_CNAME:
1082 /*
1083 * Unknown CName is only a problem for the
1084 * multicast transmitter which isn't used.
1085 * It is also deprecated.
1086 */
1087 break;
1088 default:
1089 purple_debug_error("media", "farsight-error: %i: %s\n", error_no,
1090 gst_structure_get_string(msg->structure, "error-msg"));
1091 break;
1092 }
1093
1094 if (FS_ERROR_IS_FATAL(error_no)) {
1095 purple_media_error(media, _("A non-recoverable Farsight2 error has occurred."));
1096 purple_media_end(media, NULL, NULL);
1097 }
1098 } else if (gst_structure_has_name(msg->structure,
1099 "farsight-new-local-candidate")) { 1069 "farsight-new-local-candidate")) {
1100 FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream")); 1070 FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream"));
1101 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "candidate")); 1071 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "candidate"));
1102 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); 1072 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream);
1103 purple_media_new_local_candidate_cb(stream, local_candidate, session); 1073 purple_media_new_local_candidate_cb(stream, local_candidate, session);
1112 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "local-candidate")); 1082 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "local-candidate"));
1113 FsCandidate *remote_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "remote-candidate")); 1083 FsCandidate *remote_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "remote-candidate"));
1114 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); 1084 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream);
1115 purple_media_candidate_pair_established_cb(stream, local_candidate, remote_candidate, session); 1085 purple_media_candidate_pair_established_cb(stream, local_candidate, remote_candidate, session);
1116 } else if (gst_structure_has_name(msg->structure, 1086 } else if (gst_structure_has_name(msg->structure,
1117 "farsight-recv-codecs-changed")) {
1118 GList *codecs = g_value_get_boxed(gst_structure_get_value(msg->structure, "codecs"));
1119 FsCodec *codec = codecs->data;
1120 purple_debug_info("media", "farsight-recv-codecs-changed: %s\n", codec->encoding_name);
1121
1122 } else if (gst_structure_has_name(msg->structure,
1123 "farsight-component-state-changed")) {
1124 FsStreamState fsstate = g_value_get_enum(gst_structure_get_value(msg->structure, "state"));
1125 guint component = g_value_get_uint(gst_structure_get_value(msg->structure, "component"));
1126 const gchar *state;
1127 switch (fsstate) {
1128 case FS_STREAM_STATE_FAILED:
1129 state = "FAILED";
1130 break;
1131 case FS_STREAM_STATE_DISCONNECTED:
1132 state = "DISCONNECTED";
1133 break;
1134 case FS_STREAM_STATE_GATHERING:
1135 state = "GATHERING";
1136 break;
1137 case FS_STREAM_STATE_CONNECTING:
1138 state = "CONNECTING";
1139 break;
1140 case FS_STREAM_STATE_CONNECTED:
1141 state = "CONNECTED";
1142 break;
1143 case FS_STREAM_STATE_READY:
1144 state = "READY";
1145 break;
1146 default:
1147 state = "UNKNOWN";
1148 break;
1149 }
1150 purple_debug_info("media", "farsight-component-state-changed: component: %u state: %s\n", component, state);
1151 } else if (gst_structure_has_name(msg->structure,
1152 "farsight-send-codec-changed")) {
1153 FsCodec *codec = g_value_get_boxed(gst_structure_get_value(msg->structure, "codec"));
1154 gchar *codec_str = fs_codec_to_string(codec);
1155 purple_debug_info("media", "farsight-send-codec-changed: codec: %s\n", codec_str);
1156 g_free(codec_str);
1157 } else if (gst_structure_has_name(msg->structure,
1158 "farsight-codecs-changed")) { 1087 "farsight-codecs-changed")) {
1159 GList *sessions = g_hash_table_get_values(PURPLE_MEDIA(media)->priv->sessions); 1088 GList *sessions = g_hash_table_get_values(PURPLE_MEDIA(media)->priv->sessions);
1160 FsSession *fssession = g_value_get_object(gst_structure_get_value(msg->structure, "session")); 1089 FsSession *fssession = g_value_get_object(gst_structure_get_value(msg->structure, "session"));
1161 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { 1090 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
1162 PurpleMediaSession *session = sessions->data; 1091 PurpleMediaSession *session = sessions->data;
1168 break; 1097 break;
1169 } 1098 }
1170 } 1099 }
1171 } 1100 }
1172 break; 1101 break;
1173 }
1174 case GST_MESSAGE_ERROR: {
1175 GstElement *element = GST_ELEMENT(GST_MESSAGE_SRC(msg));
1176 GstElement *lastElement = NULL;
1177 while (!GST_IS_PIPELINE(element)) {
1178 if (element == media->priv->confbin) {
1179 purple_media_error(media, _("Conference error"));
1180 purple_media_end(media, NULL, NULL);
1181 break;
1182 }
1183 lastElement = element;
1184 element = GST_ELEMENT_PARENT(element);
1185 }
1186 if (GST_IS_PIPELINE(element)) {
1187 GList *sessions = g_hash_table_get_values(media->priv->sessions);
1188 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
1189 PurpleMediaSession *session = sessions->data;
1190
1191 if (session->src == lastElement) {
1192 if (session->type & PURPLE_MEDIA_AUDIO)
1193 purple_media_error(media, _("Error with your microphone"));
1194 else
1195 purple_media_error(media, _("Error with your webcam"));
1196 purple_media_end(media, NULL, NULL);
1197 break;
1198 }
1199 }
1200 g_list_free(sessions);
1201 }
1202 } 1102 }
1203 default: 1103 default:
1204 break; 1104 break;
1205 } 1105 }
1206 1106