From 600e7ec84a7de3eca11c081a7c58c9d37cf0eb41 Mon Sep 17 00:00:00 2001 From: Boris Grozev <boris@jitsi.org> Date: Mon, 10 Mar 2014 20:38:34 +0100 Subject: [PATCH] In startReceiveStreams(), start both streams from the RTP manager and streams from the MediaStream. Fixes a failure to re-start streams in certain situations (sometimes after hold), resulting in no audio. --- .../jitsi/impl/neomedia/MediaStreamImpl.java | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index 238042ac..92ff5dc6 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -2051,11 +2051,11 @@ else if (startedDirection == null) private void startReceiveStreams() { StreamRTPManager rtpManager = getRTPManager(); - List<ReceiveStream> receiveStreams; + Set<ReceiveStream> streamsToStart = new HashSet<ReceiveStream>(); try { - receiveStreams = rtpManager.getReceiveStreams(); + streamsToStart.addAll(rtpManager.getReceiveStreams()); } catch (Exception ex) { @@ -2066,40 +2066,36 @@ private void startReceiveStreams() */ if (logger.isTraceEnabled()) logger.trace("Failed to retrieve receive streams", ex); - receiveStreams = null; } - if (receiveStreams != null) - { - /* - * It turns out that the receiveStreams list of rtpManager can be - * empty. As a workaround, use the receiveStreams of this instance. - */ - if (receiveStreams.isEmpty()) - receiveStreams = getReceiveStreams(); + /* + * It has been observed that sometimes there are valid ReceiveStream-s + * in this.receiveStreams which are not returned by the RTP manager. + */ + streamsToStart.addAll(getReceiveStreams()); - for (ReceiveStream receiveStream : receiveStreams) + for (ReceiveStream receiveStream : streamsToStart) + { + try { - try - { - DataSource receiveStreamDataSource - = receiveStream.getDataSource(); + DataSource receiveStreamDataSource + = receiveStream.getDataSource(); - /* - * For an unknown reason, the stream DataSource can be null - * at the end of the Call after re-INVITEs have been - * handled. - */ - if (receiveStreamDataSource != null) - receiveStreamDataSource.start(); - } - catch (IOException ioex) - { - logger.warn( - "Failed to start receive stream " + receiveStream, - ioex); - } + /* + * For an unknown reason, the stream DataSource can be null + * at the end of the Call after re-INVITEs have been + * handled. + */ + if (receiveStreamDataSource != null) + receiveStreamDataSource.start(); } + catch (IOException ioex) + { + logger.warn( + "Failed to start receive stream " + receiveStream, + ioex); + } + } } @@ -2430,6 +2426,9 @@ public void update(ReceiveStreamEvent ev) { if (ev instanceof NewReceiveStreamEvent) { + //XXX we might consider not adding (or not starting) new receive + //streams unless the MediaStream's direction allows receiving. + ReceiveStream receiveStream = ev.getReceiveStream(); if (receiveStream != null) -- GitLab