summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2011-04-12 16:44:37 -0400
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2011-04-12 16:44:37 -0400
commit39aa9a61d6073ef1509615d5d8ef9aa62ccf7f1b (patch)
tree8a5bb26eac7d7bc890d38cec7920012c4d628f5e
parent6bb756a1928184e4978cd065905bfbba0de158f7 (diff)
Ensure there is a stop call before a start call always
-rw-r--r--telepathy-farsight/stream.c54
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);
}