diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-04-12 16:44:37 -0400 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-04-12 16:44:37 -0400 |
commit | 39aa9a61d6073ef1509615d5d8ef9aa62ccf7f1b (patch) | |
tree | 8a5bb26eac7d7bc890d38cec7920012c4d628f5e | |
parent | 6bb756a1928184e4978cd065905bfbba0de158f7 (diff) |
Ensure there is a stop call before a start call always
-rw-r--r-- | telepathy-farsight/stream.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/telepathy-farsight/stream.c b/telepathy-farsight/stream.c index 26eeb42..749ede5 100644 --- a/telepathy-farsight/stream.c +++ b/telepathy-farsight/stream.c @@ -114,6 +114,8 @@ struct _TfStreamPrivate NewStreamCreatedCb *new_stream_created_cb; GQueue events_to_send; + + gint sending_telephony_event; }; enum @@ -238,6 +240,7 @@ tf_stream_init (TfStream *self) g_static_mutex_init (&priv->mutex); priv->has_resource = TP_MEDIA_STREAM_DIRECTION_NONE; priv->current_state = TP_MEDIA_STREAM_STATE_DISCONNECTED; + priv->sending_telephony_event = -1; g_queue_init (&priv->events_to_send); } @@ -1846,11 +1849,21 @@ start_telephony_event (TpMediaStreamHandler *proxy G_GNUC_UNUSED, DEBUG (self, "called with event %u", event); + if (self->priv->sending_telephony_event != -1) + { + WARNING (self, "start new telephony event without stopping the" + " previous one first"); + if (!fs_session_stop_telephony_event (self->priv->fs_session, + self->priv->sending_telephony_event)) + WARNING (self, "stopping event failed"); + } + /* this week, volume is 8, for the sake of argument... */ if (!fs_session_start_telephony_event (self->priv->fs_session, event, 8, FS_DTMF_METHOD_AUTO)) WARNING (self, "sending event %u failed", event); + self->priv->sending_telephony_event = FS_DTMF_METHOD_AUTO; } static gboolean @@ -1926,11 +1939,22 @@ start_named_telephony_event (TpMediaStreamHandler *proxy, if (check_codecs_for_telephone_event (self, &codecs, send_codec, codecid)) { + if (self->priv->sending_telephony_event != -1) + { + WARNING (self, "start new telephony event without stopping the" + " previous one first"); + if (!fs_session_stop_telephony_event (self->priv->fs_session, + self->priv->sending_telephony_event)) + WARNING (self, "stopping event failed"); + } + + DEBUG (self, "Sending named telephony event %d with pt %d", event, codecid); if (!fs_session_start_telephony_event (self->priv->fs_session, event, 8, FS_DTMF_METHOD_RTP_RFC4733)) WARNING (self, "sending event %u failed", event); + self->priv->sending_telephony_event = FS_DTMF_METHOD_RTP_RFC4733; } else { @@ -1956,11 +1980,21 @@ start_sound_telephony_event (TpMediaStreamHandler *proxy, guchar event, DEBUG (self, "called with event %u", event); + if (self->priv->sending_telephony_event != -1) + { + WARNING (self, "start new telephony event without stopping the" + " previous one first"); + if (!fs_session_stop_telephony_event (self->priv->fs_session, + self->priv->sending_telephony_event)) + WARNING (self, "stopping event failed"); + } + /* this week, volume is 8, for the sake of argument... */ if (!fs_session_start_telephony_event (self->priv->fs_session, event, 8, FS_DTMF_METHOD_IN_BAND)) WARNING (self, "sending sound event %u failed", event); + self->priv->sending_telephony_event = FS_DTMF_METHOD_IN_BAND; } @@ -1970,11 +2004,19 @@ stop_telephony_event (TpMediaStreamHandler *proxy G_GNUC_UNUSED, GObject *object) { TfStream *self = TF_STREAM (object); + FsDTMFMethod method = FS_DTMF_METHOD_AUTO; g_assert (self->priv->fs_session != NULL); DEBUG (self, "called"); + if (self->priv->sending_telephony_event == -1) + WARNING (self, "Trying to stop telephony event without having started" + " one"); + else + method = self->priv->sending_telephony_event; + self->priv->sending_telephony_event = -1; + if (!fs_session_stop_telephony_event (self->priv->fs_session, FS_DTMF_METHOD_AUTO)) WARNING (self, "stopping event failed"); @@ -2152,9 +2194,21 @@ cb_fs_send_codec_changed (TfStream *self, DEBUG (self, "Sending queued event %d with pt %d", dtmfevent->event_id, dtmfevent->codec_id); dtmfevent = g_queue_pop_head (&self->priv->events_to_send); + if (self->priv->sending_telephony_event != -1) + { + WARNING (self, "start new telephony event without stopping the" + " previous one first"); + if (!fs_session_stop_telephony_event (self->priv->fs_session, + self->priv->sending_telephony_event)) + WARNING (self, "stopping event failed"); + } + self->priv->sending_telephony_event = -1; + if (!fs_session_start_telephony_event (self->priv->fs_session, dtmfevent->event_id, 8, FS_DTMF_METHOD_RTP_RFC4733)) WARNING (self, "sending event %u failed", dtmfevent->event_id); + fs_session_stop_telephony_event (self->priv->fs_session, + FS_DTMF_METHOD_RTP_RFC4733); g_slice_free (struct DtmfEvent, dtmfevent); } |