in prpl/chat.c [365:443]
static void call_media_setup(ChimeCall *call, struct chime_chat *chat)
{
const gchar *name = chime_call_get_alert_body(call);
PurpleMediaManager *mgr = purple_media_manager_get();
chat->media = purple_media_manager_create_media(purple_media_manager_get(),
chat->conv->account,
"fsrtpconference",
name,
TRUE);
if (!chat->media) {
/* XX: Report error, but not with purple_media_error()! */
chime_call_set_silent(chat->call, TRUE);
return;
}
chat->media_connected = FALSE;
g_signal_connect(chat->media, "state-changed", G_CALLBACK(call_media_changed), chat);
g_signal_connect(chat->media, "stream-info", G_CALLBACK(call_stream_info), chat);
if (!purple_media_add_stream(chat->media, "chime", name,
PURPLE_MEDIA_AUDIO, TRUE,
"app", 0, NULL)) {
purple_media_error(chat->media, _("Error adding media stream\n"));
purple_media_end(chat->media, NULL, NULL);
chat->media = NULL;
chime_call_set_silent(chat->call, TRUE);
return;
}
gchar *srcname = g_strdup_printf("chime_src_%p", call);
gchar *sinkname = g_strdup_printf("chime_sink_%p", call);
gchar *srcpipe = g_strdup_printf("appsrc name=%s format=time do-timestamp=TRUE is-live=TRUE", srcname);
gchar *sinkpipe = g_strdup_printf("appsink name=%s async=false", sinkname);
PurpleMediaCandidate *cand =
purple_media_candidate_new(NULL, 1,
PURPLE_MEDIA_CANDIDATE_TYPE_HOST,
PURPLE_MEDIA_NETWORK_PROTOCOL_UDP,
sinkpipe, 16000);
g_object_set(cand, "username", srcpipe, NULL);
g_free(sinkpipe);
g_free(srcpipe);
GList *cands = g_list_append (NULL, cand);
purple_media_add_remote_candidates(chat->media, "chime", name, cands);
purple_media_candidate_list_free(cands);
GList *codecs = g_list_append(NULL,
purple_media_codec_new(97, "CHIME", PURPLE_MEDIA_AUDIO, 0));
g_object_set(codecs->data, "channels", 1, NULL);
if (!purple_media_set_remote_codecs(chat->media, "chime", name, codecs)) {
purple_media_codec_list_free(codecs);
purple_media_error(chat->media, _("Error setting Chime OPUS codec\n"));
purple_media_end(chat->media, NULL, NULL);
chat->media = NULL;
chime_call_set_silent(chat->call, TRUE);
return;
}
purple_media_codec_list_free(codecs);
GstElement *pipeline = purple_media_manager_get_pipeline(mgr);
GstElement *appsrc = gst_bin_get_by_name(GST_BIN(pipeline), srcname);
GstElement *appsink = gst_bin_get_by_name(GST_BIN(pipeline), sinkname);
g_free(srcname);
g_free(sinkname);
gst_app_src_set_size(GST_APP_SRC(appsrc), -1);
gst_app_src_set_max_bytes(GST_APP_SRC(appsrc), 100);
gst_app_src_set_stream_type(GST_APP_SRC(appsrc), GST_APP_STREAM_TYPE_STREAM);
chime_call_install_gst_app_callbacks(chat->call, GST_APP_SRC(appsrc), GST_APP_SINK(appsink));
g_object_unref(appsrc);
g_object_unref(appsink);
GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(purple_media_manager_get_pipeline(mgr)),
GST_DEBUG_GRAPH_SHOW_ALL, "chime conference graph");
}