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