summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Zabaluev <mikhail.zabaluev@nokia.com>2010-01-22 21:37:14 +0200
committerMikhail Zabaluev <mikhail.zabaluev@nokia.com>2010-01-22 21:39:16 +0200
commiteddc4e84598881c71f97da3df59579d23e778ad8 (patch)
treefb22d06f5dda87f7f106bac63a31ae78d6a53bf1
parent16a7704b87cd7ea9ca6a309dff0d39b67262b391 (diff)
Create remotely added streams with the direction they have as per SDP
This avoids spurious emissions of StreamDirectionChanged signals.
-rw-r--r--src/sip-media-channel.c8
-rw-r--r--src/sip-media-session.c25
-rw-r--r--src/sip-media-session.h1
-rw-r--r--src/sip-media-stream.c7
-rw-r--r--src/sip-media-stream.h2
5 files changed, 23 insertions, 20 deletions
diff --git a/src/sip-media-channel.c b/src/sip-media-channel.c
index 0b09d19..92170cf 100644
--- a/src/sip-media-channel.c
+++ b/src/sip-media-channel.c
@@ -979,11 +979,15 @@ tpsip_media_channel_create_initial_streams (TpsipMediaChannel *self)
if (priv->initial_audio)
tpsip_media_session_add_stream (priv->session,
- TP_MEDIA_STREAM_TYPE_AUDIO, TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
+ TP_MEDIA_STREAM_TYPE_AUDIO,
+ TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL,
+ TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
if (priv->initial_video)
tpsip_media_session_add_stream (priv->session,
- TP_MEDIA_STREAM_TYPE_VIDEO, TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
+ TP_MEDIA_STREAM_TYPE_VIDEO,
+ TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL,
+ TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
}
/**
diff --git a/src/sip-media-session.c b/src/sip-media-session.c
index 85edc64..9218ba8 100644
--- a/src/sip-media-session.c
+++ b/src/sip-media-session.c
@@ -860,7 +860,9 @@ gboolean tpsip_media_session_request_streams (TpsipMediaSession *session,
TpsipMediaStream *stream;
stream = tpsip_media_session_add_stream (session,
- media_type, TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
+ media_type,
+ TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL,
+ TP_MEDIA_STREAM_PENDING_REMOTE_SEND);
if (stream == NULL)
{
@@ -1559,6 +1561,7 @@ priv_update_remote_media (TpsipMediaSession *session, gboolean authoritative)
stream = tpsip_media_session_add_stream (
session,
media_type,
+ tpsip_media_stream_direction_from_remote_media (media),
TP_MEDIA_STREAM_PENDING_LOCAL_SEND);
else
stream = g_ptr_array_index(priv->streams, i);
@@ -2029,13 +2032,13 @@ priv_stream_unhold_failure_cb (TpsipMediaStream *stream,
TpsipMediaStream*
tpsip_media_session_add_stream (TpsipMediaSession *self,
guint media_type,
+ TpMediaStreamDirection direction,
guint pending_send_flags)
{
TpsipMediaSessionPrivate *priv = TPSIP_MEDIA_SESSION_GET_PRIVATE (self);
gchar *object_path;
TpsipMediaStream *stream = NULL;
guint stream_id;
- TpMediaStreamDirection direction;
DEBUG ("enter");
@@ -2045,20 +2048,12 @@ tpsip_media_session_add_stream (TpsipMediaSession *self,
object_path = g_strdup_printf ("%s/MediaStream%u",
priv->object_path,
stream_id);
+
if (tpsip_media_session_is_local_hold_ongoing (self))
- {
- direction = ((pending_send_flags & TP_MEDIA_STREAM_PENDING_LOCAL_SEND)
- != 0)
- ? TP_MEDIA_STREAM_DIRECTION_NONE
- : TP_MEDIA_STREAM_DIRECTION_SEND;
- }
- else
- {
- direction = ((pending_send_flags & TP_MEDIA_STREAM_PENDING_LOCAL_SEND)
- != 0)
- ? TP_MEDIA_STREAM_DIRECTION_RECEIVE
- : TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL;
- }
+ direction &= ~TP_MEDIA_STREAM_DIRECTION_RECEIVE;
+
+ if ((pending_send_flags & TP_MEDIA_STREAM_PENDING_LOCAL_SEND) != 0)
+ direction &= ~TP_MEDIA_STREAM_DIRECTION_SEND;
stream = g_object_new (TPSIP_TYPE_MEDIA_STREAM,
"media-session", self,
diff --git a/src/sip-media-session.h b/src/sip-media-session.h
index 4f8675f..e1ca035 100644
--- a/src/sip-media-session.h
+++ b/src/sip-media-session.h
@@ -81,6 +81,7 @@ gboolean tpsip_media_session_set_remote_media (TpsipMediaSession *chan,
const sdp_session_t* r_sdp);
TpsipMediaStream* tpsip_media_session_add_stream (TpsipMediaSession *self,
guint media_type,
+ TpMediaStreamDirection direction,
guint pending_send_flags);
gboolean tpsip_media_session_request_streams (TpsipMediaSession *session,
const GArray *media_types,
diff --git a/src/sip-media-stream.c b/src/sip-media-stream.c
index fade70f..33c2737 100644
--- a/src/sip-media-stream.c
+++ b/src/sip-media-stream.c
@@ -881,9 +881,10 @@ const char *tpsip_media_stream_local_sdp (TpsipMediaStream *obj)
return priv->stream_sdp;
}
-static inline guint
-tpsip_tp_stream_direction_from_remote (sdp_mode_t mode)
+TpMediaStreamDirection
+tpsip_media_stream_direction_from_remote_media (const sdp_media_t *media)
{
+ sdp_mode_t mode = media->m_mode;
return ((mode & sdp_recvonly)? TP_MEDIA_STREAM_DIRECTION_SEND : 0)
| ((mode & sdp_sendonly)? TP_MEDIA_STREAM_DIRECTION_RECEIVE : 0);
}
@@ -992,7 +993,7 @@ tpsip_media_stream_set_remote_media (TpsipMediaStream *stream,
}
old_direction = priv_get_requested_direction (priv);
- new_direction = tpsip_tp_stream_direction_from_remote (new_media->m_mode);
+ new_direction = tpsip_media_stream_direction_from_remote_media (new_media);
/* Make sure the peer can only enable sending or receiving direction
* if it's allowed to */
diff --git a/src/sip-media-stream.h b/src/sip-media-stream.h
index 8d4fc34..8797573 100644
--- a/src/sip-media-stream.h
+++ b/src/sip-media-stream.h
@@ -82,6 +82,8 @@ gboolean tpsip_media_stream_request_hold_state (TpsipMediaStream *self,
gboolean hold);
guint tpsip_tp_media_type (sdp_media_e sip_mtype);
+TpMediaStreamDirection tpsip_media_stream_direction_from_remote_media (
+ const sdp_media_t *media);
G_END_DECLS