comparison libpurple/media/media.c @ 29557:1fdc75c94c22

Move Farsight 2's local-candidates-prepared signal to the Fs2 media backend.
author maiku@pidgin.im
date Mon, 26 Oct 2009 18:02:06 +0000
parents 74e75fc3481e
children cb843608e183
comparison
equal deleted inserted replaced
29556:74e75fc3481e 29557:1fdc75c94c22
139 static void purple_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); 139 static void purple_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
140 140
141 static void purple_media_new_local_candidate_cb(PurpleMediaBackend *backend, 141 static void purple_media_new_local_candidate_cb(PurpleMediaBackend *backend,
142 const gchar *sess_id, const gchar *participant, 142 const gchar *sess_id, const gchar *participant,
143 PurpleMediaCandidate *candidate, PurpleMedia *media); 143 PurpleMediaCandidate *candidate, PurpleMedia *media);
144 static void purple_media_candidates_prepared_cb(FsStream *stream, 144 static void purple_media_candidates_prepared_cb(PurpleMediaBackend *backend,
145 PurpleMediaSession *session); 145 const gchar *sess_id, const gchar *name, PurpleMedia *media);
146 static void purple_media_candidate_pair_established_cb( 146 static void purple_media_candidate_pair_established_cb(
147 PurpleMediaBackend *backend, 147 PurpleMediaBackend *backend,
148 const gchar *sess_id, const gchar *name, 148 const gchar *sess_id, const gchar *name,
149 PurpleMediaCandidate *local_candidate, 149 PurpleMediaCandidate *local_candidate,
150 PurpleMediaCandidate *remote_candidate, 150 PurpleMediaCandidate *remote_candidate,
448 "active-candidate-pair", 448 "active-candidate-pair",
449 G_CALLBACK( 449 G_CALLBACK(
450 purple_media_candidate_pair_established_cb), 450 purple_media_candidate_pair_established_cb),
451 media); 451 media);
452 g_signal_connect(media->priv->backend, 452 g_signal_connect(media->priv->backend,
453 "candidates-prepared",
454 G_CALLBACK(
455 purple_media_candidates_prepared_cb),
456 media);
457 g_signal_connect(media->priv->backend,
453 "codecs-changed", 458 "codecs-changed",
454 G_CALLBACK( 459 G_CALLBACK(
455 purple_media_codecs_changed_cb), 460 purple_media_codecs_changed_cb),
456 media); 461 media);
457 g_signal_connect(media->priv->backend, 462 g_signal_connect(media->priv->backend,
986 #endif 991 #endif
987 } 992 }
988 #endif /* USE_GSTREAMER */ 993 #endif /* USE_GSTREAMER */
989 994
990 #ifdef USE_VV 995 #ifdef USE_VV
991 static PurpleMediaSession *
992 purple_media_session_from_fs_stream(PurpleMedia *media, FsStream *stream)
993 {
994 FsSession *fssession;
995 GList *values;
996
997 g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
998 g_return_val_if_fail(FS_IS_STREAM(stream), NULL);
999
1000 g_object_get(stream, "session", &fssession, NULL);
1001
1002 values = g_hash_table_get_values(media->priv->sessions);
1003
1004 for (; values; values = g_list_delete_link(values, values)) {
1005 PurpleMediaSession *session = values->data;
1006
1007 if (session->session == fssession) {
1008 g_list_free(values);
1009 g_object_unref(fssession);
1010 return session;
1011 }
1012 }
1013
1014 g_object_unref(fssession);
1015 return NULL;
1016 }
1017
1018 static gboolean 996 static gboolean
1019 media_bus_call(GstBus *bus, GstMessage *msg, PurpleMedia *media) 997 media_bus_call(GstBus *bus, GstMessage *msg, PurpleMedia *media)
1020 { 998 {
1021 switch(GST_MESSAGE_TYPE(msg)) { 999 switch(GST_MESSAGE_TYPE(msg)) {
1022 case GST_MESSAGE_ELEMENT: { 1000 case GST_MESSAGE_ELEMENT: {
1066 percent = 1.0; 1044 percent = 1.0;
1067 1045
1068 g_signal_emit(media, purple_media_signals[LEVEL], 1046 g_signal_emit(media, purple_media_signals[LEVEL],
1069 0, session->id, participant, percent); 1047 0, session->id, participant, percent);
1070 break; 1048 break;
1071 }
1072 if (!FS_IS_CONFERENCE(GST_MESSAGE_SRC(msg)) ||
1073 !PURPLE_IS_MEDIA(media) ||
1074 media->priv->conference !=
1075 FS_CONFERENCE(GST_MESSAGE_SRC(msg)))
1076 break;
1077
1078 if (gst_structure_has_name(msg->structure,
1079 "farsight-local-candidates-prepared")) {
1080 FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream"));
1081 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream);
1082 purple_media_candidates_prepared_cb(stream, session);
1083 } 1049 }
1084 break; 1050 break;
1085 } 1051 }
1086 default: 1052 default:
1087 break; 1053 break;
1270 g_signal_emit(session->media, purple_media_signals[NEW_CANDIDATE], 1236 g_signal_emit(session->media, purple_media_signals[NEW_CANDIDATE],
1271 0, session->id, participant, candidate); 1237 0, session->id, participant, candidate);
1272 } 1238 }
1273 1239
1274 static void 1240 static void
1275 purple_media_candidates_prepared_cb(FsStream *stream, PurpleMediaSession *session) 1241 purple_media_candidates_prepared_cb(PurpleMediaBackend *backend,
1276 { 1242 const gchar *sess_id, const gchar *name, PurpleMedia *media)
1277 gchar *name; 1243 {
1278 FsParticipant *participant;
1279 PurpleMediaStream *stream_data; 1244 PurpleMediaStream *stream_data;
1280 1245
1281 g_return_if_fail(FS_IS_STREAM(stream)); 1246 g_return_if_fail(PURPLE_IS_MEDIA(media));
1282 g_return_if_fail(session != NULL); 1247
1283 1248 stream_data = purple_media_get_stream(media, sess_id, name);
1284 g_object_get(stream, "participant", &participant, NULL);
1285 g_object_get(participant, "cname", &name, NULL);
1286 g_object_unref(participant);
1287
1288 stream_data = purple_media_get_stream(session->media, session->id, name);
1289 stream_data->candidates_prepared = TRUE; 1249 stream_data->candidates_prepared = TRUE;
1290 1250
1291 g_signal_emit(session->media, 1251 g_signal_emit(media, purple_media_signals[CANDIDATES_PREPARED],
1292 purple_media_signals[CANDIDATES_PREPARED], 1252 0, sess_id, name);
1293 0, session->id, name);
1294
1295 g_free(name);
1296 } 1253 }
1297 1254
1298 /* callback called when a pair of transport candidates (local and remote) 1255 /* callback called when a pair of transport candidates (local and remote)
1299 * has been established */ 1256 * has been established */
1300 static void 1257 static void