diff options
author | Mikhail Zabaluev <mikhail.zabaluev@nokia.com> | 2010-01-22 21:37:14 +0200 |
---|---|---|
committer | Mikhail Zabaluev <mikhail.zabaluev@nokia.com> | 2010-01-22 21:39:16 +0200 |
commit | eddc4e84598881c71f97da3df59579d23e778ad8 (patch) | |
tree | fb22d06f5dda87f7f106bac63a31ae78d6a53bf1 | |
parent | 16a7704b87cd7ea9ca6a309dff0d39b67262b391 (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.c | 8 | ||||
-rw-r--r-- | src/sip-media-session.c | 25 | ||||
-rw-r--r-- | src/sip-media-session.h | 1 | ||||
-rw-r--r-- | src/sip-media-stream.c | 7 | ||||
-rw-r--r-- | src/sip-media-stream.h | 2 |
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 |