From 19a418f2731ff98d176bc7cd903b9949b7a32a16 Mon Sep 17 00:00:00 2001 From: Jakub Adam Date: Thu, 15 Jul 2010 17:25:13 +0200 Subject: [PATCH] audio: cleanup resources on end of call Added sipe_session_add_call for creating media sessions. Remove the session on end of call, it remained in memory until logout. Call sipe_backend_media_free to release resources allocated in backend. Was defined in backend but never called. --- src/api/sipe-backend.h | 1 + src/core/sipe-media.c | 51 +++++++++++++++++++++++++++++++---------------- src/core/sipe-session.c | 22 ++++++++++++++++++++ src/core/sipe-session.h | 16 +++++++++++++++ src/purple/purple-media.c | 22 +++++++++++++++----- 5 files changed, 90 insertions(+), 22 deletions(-) diff --git a/src/api/sipe-backend.h b/src/api/sipe-backend.h index bad959cb..0a9bb281 100644 --- a/src/api/sipe-backend.h +++ b/src/api/sipe-backend.h @@ -272,6 +272,7 @@ struct sipe_backend_media *sipe_backend_media_new(struct sipe_core_public *sipe_ struct sipe_media_call *call, const gchar *participant, gboolean initiator); +void sipe_backend_media_free(struct sipe_backend_media *media); struct sipe_backend_stream *sipe_backend_media_add_stream(struct sipe_backend_media *media, const gchar *participant, SipeMediaType type, gboolean use_nice, diff --git a/src/core/sipe-media.c b/src/core/sipe-media.c index a27f2db6..f843c511 100644 --- a/src/core/sipe-media.c +++ b/src/core/sipe-media.c @@ -52,7 +52,6 @@ struct sipe_media_call_private { struct sipe_backend_stream *voice_stream; - gchar *remote_ip; guint16 remote_port; GSList *sdp_attrs; @@ -86,10 +85,18 @@ static void sipe_media_call_free(struct sipe_media_call_private *call_private) { if (call_private) { + sipe_backend_media_free(call_private->public.backend_private); + sipe_media_codec_list_free(call_private->public.remote_codecs); + + if (call_private->session) + sipe_session_remove(call_private->sipe_private, + call_private->session); + sipe_utils_nameval_free(call_private->sdp_attrs); + if (call_private->invitation) sipmsg_free(call_private->invitation); - sipe_media_codec_list_free(call_private->public.remote_codecs); + sipe_media_candidate_list_free(call_private->remote_candidates); g_free(call_private); } @@ -611,7 +618,6 @@ sipe_media_parse_sdp_attributes_and_candidates(struct sipe_media_call_private *c sipe_media_candidate_list_free(call_private->remote_candidates); call_private->sdp_attrs = sdp_attrs; - call_private->remote_ip = remote_ip; call_private->remote_port = remote_port; call_private->remote_candidates = remote_candidates; } else { @@ -796,14 +802,15 @@ static void call_hangup_cb(struct sipe_media_call *call, gboolean local) } static struct sipe_media_call_private * -sipe_media_call_init(struct sipe_core_private *sipe_private, const gchar* participant, gboolean initiator) +sipe_media_call_new(struct sipe_core_private *sipe_private, + const gchar* with, gboolean initiator) { struct sipe_media_call_private *call_private = g_new0(struct sipe_media_call_private, 1); call_private->sipe_private = sipe_private; call_private->public.backend_private = sipe_backend_media_new(SIPE_CORE_PUBLIC, SIPE_MEDIA_CALL, - participant, + with, initiator); call_private->legacy_mode = FALSE; @@ -832,7 +839,7 @@ void sipe_media_hangup(struct sipe_core_private *sipe_private) void sipe_core_media_initiate_call(struct sipe_core_public *sipe_public, - const char *participant) + const char *with) { struct sipe_core_private *sipe_private = SIPE_CORE_PRIVATE; struct sipe_media_call_private *call_private; @@ -840,21 +847,31 @@ sipe_core_media_initiate_call(struct sipe_core_public *sipe_public, if (sipe_private->media_call) return; - call_private = sipe_media_call_init(sipe_private, participant, TRUE); - - sipe_private->media_call = call_private; + call_private = sipe_media_call_new(sipe_private, with, TRUE); - call_private->session = sipe_session_add_chat(sipe_private); + call_private->session = sipe_session_add_call(sipe_private, with); call_private->dialog = sipe_dialog_add(call_private->session); call_private->dialog->callid = gencallid(); - call_private->dialog->with = g_strdup(participant); + call_private->dialog->with = g_strdup(call_private->session->with); call_private->dialog->ourtag = gentag(); - call_private->voice_stream = - sipe_backend_media_add_stream(call_private->public.backend_private, - participant, - SIPE_MEDIA_AUDIO, - call_private->using_nice, TRUE); + call_private->voice_stream = sipe_backend_media_add_stream( + call_private->public.backend_private, + with, + SIPE_MEDIA_AUDIO, + call_private->using_nice, + TRUE); + + if (!call_private->voice_stream) { + sipe_backend_notify_error("Error occured", + "Error creating media stream"); + sipe_media_call_free(call_private); + return; + } + + sipe_private->media_call = call_private; + + // Processing continues in candidates_prepared_cb } @@ -911,7 +928,7 @@ sipe_media_incoming_invite(struct sipe_core_private *sipe_private, session = sipe_session_find_or_add_chat_by_callid(sipe_private, callid); dialog = sipe_media_dialog_init(session, msg); - call_private = sipe_media_call_init(sipe_private, dialog->with, FALSE); + call_private = sipe_media_call_new(sipe_private, dialog->with, FALSE); call_private->invitation = sipmsg_copy(msg); call_private->session = session; call_private->dialog = dialog; diff --git a/src/core/sipe-session.c b/src/core/sipe-session.c index 355e7081..8bf42b45 100644 --- a/src/core/sipe-session.c +++ b/src/core/sipe-session.c @@ -21,6 +21,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include @@ -58,6 +62,24 @@ sipe_session_add_chat(struct sipe_core_private *sipe_private) return session; } +#ifdef HAVE_VV + +struct sip_session * +sipe_session_add_call(struct sipe_core_private *sipe_private, + const gchar *who) +{ + struct sip_session *session = g_new0(struct sip_session, 1); + SIPE_DEBUG_INFO("sipe_session_add_call: new session for %s", who); + session->is_multiparty = FALSE; + session->with = g_strdup(who); + session->unconfirmed_messages = g_hash_table_new_full( + g_str_hash, g_str_equal, g_free, (GDestroyNotify)sipe_free_queued_message); + sipe_private->sessions = g_slist_append(sipe_private->sessions, session); + return session; +} + +#endif + struct sip_session * sipe_session_find_or_add_chat_by_callid(struct sipe_core_private *sipe_private, const gchar *callid) diff --git a/src/core/sipe-session.h b/src/core/sipe-session.h index 25c7ae0d..c316ef8b 100644 --- a/src/core/sipe-session.h +++ b/src/core/sipe-session.h @@ -108,6 +108,22 @@ struct queued_message { struct sip_session * sipe_session_add_chat(struct sipe_core_private *sipe_private); +#ifdef HAVE_VV + +/** + * Add a new media call session + * + * @param sipe_private (in) SIPE core data. + * @param who (in) remote partner. + * + * @return pointer to new session + */ +struct sip_session * +sipe_session_add_call(struct sipe_core_private *sipe_private, + const gchar *who); + +#endif + /** * Find chat session by Call ID * diff --git a/src/purple/purple-media.c b/src/purple/purple-media.c index d6828e4c..32ec054f 100644 --- a/src/purple/purple-media.c +++ b/src/purple/purple-media.c @@ -45,6 +45,15 @@ struct sipe_backend_stream { gchar *participant; }; +static void +backend_stream_free(struct sipe_backend_stream *stream) +{ + if (stream) { + g_free(stream->participant); + g_free(stream); + } +} + static PurpleMediaSessionType sipe_media_to_purple(SipeMediaType type); static PurpleMediaCandidateType sipe_candidate_type_to_purple(SipeCandidateType type); static SipeCandidateType purple_candidate_type_to_sipe(PurpleMediaCandidateType type); @@ -74,7 +83,7 @@ on_state_changed_cb(SIPE_UNUSED_PARAMETER PurpleMedia *media, } static struct sipe_backend_stream * -session_find(struct sipe_backend_media *media, +stream_find(struct sipe_backend_media *media, const gchar *sessionid, const gchar *participant) { @@ -133,12 +142,10 @@ on_stream_info_cb(SIPE_UNUSED_PARAMETER PurpleMedia *media, call->call_reject_cb(call, local); } else if (sessionid && participant) { struct sipe_backend_stream *stream; - stream = session_find(m, sessionid, participant); - + stream = stream_find(m, sessionid, participant); if (stream) { m->streams = g_slist_remove(m->streams, stream); - g_free(stream->participant); - g_free(stream); + backend_stream_free(stream); } } } @@ -172,7 +179,12 @@ sipe_backend_media_new(struct sipe_core_public *sipe_public, void sipe_backend_media_free(struct sipe_backend_media *media) { + GSList *stream; purple_media_manager_remove_media(purple_media_manager_get(), media->m); + + for (stream = media->streams; stream; stream = stream->next) + backend_stream_free(stream->data); + g_free(media); } -- 2.11.4.GIT