[telepathy-butterfly/master] Improved handling of media streams
Louis-Francis Ratté-Boulianne
louis-francis.ratte-boulianne at collabora.co.uk
Thu Sep 10 06:48:14 PDT 2009
---
butterfly/channel/media.py | 14 ++++++++---
butterfly/media/session_handler.py | 45 ++++++++++++++++++++++-------------
2 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/butterfly/channel/media.py b/butterfly/channel/media.py
index 82a0ec3..fdf4105 100644
--- a/butterfly/channel/media.py
+++ b/butterfly/channel/media.py
@@ -153,8 +153,13 @@ class ButterflyMediaChannel(
#papyon.event.media.MediaSessionEventInterface
def on_stream_created(self, stream):
- print "Media Stream created"
- handler = self._session_handler.AddStream(stream)
+ print "Media Stream created upon peer request"
+ handler = self._session_handler.HandleStream(stream)
+
+ #papyon.event.media.MediaSessionEventInterface
+ def on_stream_added(self, stream):
+ print "Media Stream added"
+ handler = self._session_handler.NewStream(stream)
self.StreamAdded(handler.id, self._handle, handler.type)
self.StreamDirectionChanged(handler.id, handler.direction,
handler.pending_send)
@@ -162,8 +167,9 @@ class ButterflyMediaChannel(
#papyon.event.media.MediaSessionEventInterface
def on_stream_removed(self, stream):
print "Media Stream removed"
- id = self._session_handler.FindStream(stream)
- self._session_handler.RemoveStream(id)
+ handler = self._session_handler.FindStream(stream)
+ self._session_handler.RemoveStream(handler.id)
+ del handler
#papyon.event.media.ContactEventInterface
def on_contact_presence_changed(self, contact):
diff --git a/butterfly/media/session_handler.py b/butterfly/media/session_handler.py
index ed9b357..ffca974 100644
--- a/butterfly/media/session_handler.py
+++ b/butterfly/media/session_handler.py
@@ -40,6 +40,8 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
self._next_stream_id = 0
self._type = call.media_session.type
self._subtype = self._type is MediaSessionType.WEBCAM and "msn" or "rtp"
+ self._ready = False
+ self._pending_handlers = []
path = channel._object_path + "/sessionhandler1"
telepathy.server.MediaSessionHandler.__init__(self, connection._name, path)
@@ -61,12 +63,11 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
return "%s/stream%d" % (self._object_path, id)
def Ready(self):
- print "Session ready"
- for handler in self._stream_handlers.values():
- path = self.get_stream_path(handler.id)
- self.NewStreamHandler(path, handler.id, handler.type,
- handler.direction)
- #self._call.invite()
+ print "Session ready", self._pending_handlers
+ self._ready = True
+ for handler in self._pending_handlers:
+ self.NewStream(handler=handler)
+ self._pending_handlers = []
def Error(self, code, message):
print "Session error", code, message
@@ -75,11 +76,11 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
return self._stream_handlers[id]
def FindStream(self, stream):
- id = None
+ ret = None
for handler in self.ListStreams():
- if handler._stream == stream:
- id = handler.id
- return id
+ if handler.stream == stream:
+ ret = handler
+ return ret
def HasStreams(self):
return bool(self._stream_handlers)
@@ -87,24 +88,34 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
def ListStreams(self):
return self._stream_handlers.values()
- def AddStream(self, stream):
- handler = ButterflyStreamHandler(self._conn, self, stream)
- self._stream_handlers[handler.id] = handler
- path = self.get_stream_path(handler.id)
- self.NewStreamHandler(path, handler.id, handler.type, handler.direction)
- return handler
-
def CreateStream(self, type, direction):
if type == telepathy.MEDIA_STREAM_TYPE_AUDIO:
media_type = "audio"
else:
media_type = "video"
stream = self._call.media_session.add_stream(media_type, direction, True)
+ handler = self.HandleStream(stream)
+ self._session.add_pending_stream(stream)
+ return handler
+
+ def HandleStream(self, stream):
handler = ButterflyStreamHandler(self._conn, self, stream)
+ print "Session add stream handler", handler.id
+ self._stream_handlers[handler.id] = handler
return handler
def RemoveStream(self, id):
del self._stream_handlers[id]
+ def NewStream(self, stream=None, handler=None):
+ if handler is None:
+ handler = self.FindStream(stream)
+ if not self._ready:
+ self._pending_handlers.append(handler)
+ return handler
+ print "Session new stream handler", handler.id
+ path = self.get_stream_path(handler.id)
+ self.NewStreamHandler(path, handler.id, handler.type, handler.direction)
+ return handler
def on_stream_state_changed(self, id, state):
self._channel.on_stream_state_changed(id, state)
--
1.5.6.5
More information about the telepathy-commits
mailing list