From 60c423bdaa208f5862be8a0418cfe6df67371f9e Mon Sep 17 00:00:00 2001
From: Lyubomir Marinov <lyubomir.marinov@jitsi.org>
Date: Wed, 18 Jul 2012 12:12:03 +0000
Subject: [PATCH] Re-applies the ideas of r9718 with a refined implementation
 on the PulseAudio Renderer in order to reflect changes to the user's choice
 with respect to the default playback device while in a call.

---
 lib/native/linux-64/libjnpulseaudio.so        | Bin 33480 -> 33928 bytes
 lib/native/linux/libjnpulseaudio.so           | Bin 28044 -> 28440 bytes
 .../org_jitsi_impl_neomedia_pulseaudio_PA.c   |   9 ++
 .../org_jitsi_impl_neomedia_pulseaudio_PA.h   |   8 ++
 .../renderer/audio/PulseAudioRenderer.java    | 103 ++++++++++++------
 .../jitsi/impl/neomedia/pulseaudio/PA.java    |  18 +++
 src/org/jitsi/util/StringUtils.java           |  15 ++-
 src/org/jitsi/util/xml/XMLUtils.java          |  25 +----
 8 files changed, 120 insertions(+), 58 deletions(-)

diff --git a/lib/native/linux-64/libjnpulseaudio.so b/lib/native/linux-64/libjnpulseaudio.so
index 3845ff51efd87acfd8f70ba687608ed5acd064c3..80cd02e51cc33d6239178c22e1773d200f4480fe 100755
GIT binary patch
delta 11156
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

delta 10842
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
ZX7i~W1IEp=c?<X_pH|}C%wJc@1^^lWsQCZ@

diff --git a/lib/native/linux/libjnpulseaudio.so b/lib/native/linux/libjnpulseaudio.so
index e36eff9e09d7f56633b5f7f2491064728b7bc289..ed76a90458f2dad38a58e64ac6eaeb31bccbde25 100755
GIT binary patch
delta 7810
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
Yhjbn`i1_4u0prOHvb>wWr%h!80F|Cw?f?J)

delta 7661
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
ZIBbp$*Ja$iHll@pGPfM>=H`s4YyjO|5f1<W

diff --git a/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.c b/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.c
index 727c4c9f..a83f0e2f 100644
--- a/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.c
+++ b/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.c
@@ -606,6 +606,15 @@ Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1drop
     return pa_stream_drop((pa_stream *) (intptr_t) s);
 }
 
+JNIEXPORT jstring JNICALL
+Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1get_1device_1name
+    (JNIEnv *env, jclass clazz, jlong s)
+{
+    const char *chars = pa_stream_get_device_name((pa_stream *) (intptr_t) s);
+
+    return chars ? (*env)->NewStringUTF(env, chars) : NULL;
+}
+
 JNIEXPORT jint JNICALL
 Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1get_1index
     (JNIEnv *env, jclass clazz, jlong s)
diff --git a/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.h b/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.h
index f53ab5e3..1e1cff96 100644
--- a/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.h
+++ b/src/native/linux/pulseaudio/org_jitsi_impl_neomedia_pulseaudio_PA.h
@@ -391,6 +391,14 @@ JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1discon
 JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1drop
   (JNIEnv *, jclass, jlong);
 
+/*
+ * Class:     org_jitsi_impl_neomedia_pulseaudio_PA
+ * Method:    stream_get_device_name
+ * Signature: (J)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_jitsi_impl_neomedia_pulseaudio_PA_stream_1get_1device_1name
+  (JNIEnv *, jclass, jlong);
+
 /*
  * Class:     org_jitsi_impl_neomedia_pulseaudio_PA
  * Method:    stream_get_index
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/PulseAudioRenderer.java b/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/PulseAudioRenderer.java
index 933f09d8..1d1419a8 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/PulseAudioRenderer.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/renderer/audio/PulseAudioRenderer.java
@@ -16,6 +16,7 @@
 import org.jitsi.impl.neomedia.*;
 import org.jitsi.impl.neomedia.device.*;
 import org.jitsi.impl.neomedia.pulseaudio.*;
+import org.jitsi.util.*;
 
 /**
  * Implements an audio <tt>Renderer</tt> which uses PulseAudio.
@@ -54,6 +55,11 @@ public class PulseAudioRenderer
 
     private long cvolume;
 
+    /**
+     * The name of the sink {@link #stream} is connected to.
+     */
+    private String dev;
+
     private final GainControl gainControl;
 
     private float gainControlLevel;
@@ -142,6 +148,7 @@ public void close()
                     this.stream = 0;
 
                     corked = true;
+                    dev = null;
 
                     pulseAudioSystem.signalMainloop(false);
 
@@ -301,9 +308,12 @@ public void run()
                 PA.stream_set_state_callback(
                         stream,
                         stateCallback);
+
+                String dev = getLocatorDev();
+
                 PA.stream_connect_playback(
                         stream,
-                        getLocatorDev(),
+                        dev,
                         attr,
                         PA.STREAM_ADJUST_LATENCY
                             | PA.STREAM_START_CORKED,
@@ -355,6 +365,7 @@ public void run()
                     }
 
                     this.stream = stream;
+                    this.dev = dev;
                 }
                 finally
                 {
@@ -390,38 +401,64 @@ protected void playbackDevicePropertyChange(PropertyChangeEvent event)
          * FIXME Disabled due to freezes reported by Vincent Lucas and Kertesz
          * Laszlo on the dev mailing list.
          */
-//        pulseAudioSystem.lockMainloop();
-//        try
-//        {
-//            boolean open = (this.stream != 0);
-//
-//            if (open)
-//            {
-//                /*
-//                 * The close method will stop this Renderer if it is currently
-//                 * started.
-//                 */
-//                boolean start = !this.corked;
-//
-//                close();
-//
-//                try
-//                {
-//                    open();
-//                }
-//                catch (ResourceUnavailableException rue)
-//                {
-//                    throw new UndeclaredThrowableException(rue);
-//                }
-//
-//                if (start)
-//                    start();
-//            }
-//        }
-//        finally
-//        {
-//            pulseAudioSystem.unlockMainloop();
-//        }
+        pulseAudioSystem.lockMainloop();
+        try
+        {
+            /*
+             * If the stream is not open, changes to the default playback device
+             * do not really concern this Renderer because it will pick them up
+             * when it gets open.
+             */
+            boolean open = (stream != 0);
+
+            if (open)
+            {
+                /*
+                 * One and the same name of the sink that stream is connected to
+                 * in the server may come from different MediaLocator instances.
+                 */
+                String locatorDev = getLocatorDev();
+
+                if (!StringUtils.isEquals(dev, locatorDev))
+                {
+                    /*
+                     * PulseAudio has the capability to move a stream to a
+                     * different device while the stream is connected to a sink.
+                     * In other words, it may turn out that the stream is
+                     * already connected to the sink with the specified name at
+                     * this time of the execution.
+                     */
+                    String streamDev = PA.stream_get_device_name(stream);
+
+                    if (!StringUtils.isEquals(streamDev, locatorDev))
+                    {
+                        /*
+                         * The close method will stop this Renderer if it is
+                         * currently started.
+                         */
+                        boolean start = !corked;
+
+                        close();
+
+                        try
+                        {
+                            open();
+                        }
+                        catch (ResourceUnavailableException rue)
+                        {
+                            throw new UndeclaredThrowableException(rue);
+                        }
+
+                        if (start)
+                            start();
+                    }
+                }
+            }
+        }
+        finally
+        {
+            pulseAudioSystem.unlockMainloop();
+        }
     }
 
     public int process(Buffer buffer)
diff --git a/src/org/jitsi/impl/neomedia/pulseaudio/PA.java b/src/org/jitsi/impl/neomedia/pulseaudio/PA.java
index d341f02e..bce6e6dc 100644
--- a/src/org/jitsi/impl/neomedia/pulseaudio/PA.java
+++ b/src/org/jitsi/impl/neomedia/pulseaudio/PA.java
@@ -6,6 +6,13 @@
  */
 package org.jitsi.impl.neomedia.pulseaudio;
 
+/**
+ * Declares the functions, structures and constants of the native
+ * <tt>PulseAudio</tt> API for use within Java in general and neomedia in
+ * particular.
+ *
+ * @author Lyubomir Marinov
+ */
 public final class PA
 {
     public interface context_success_cb_t
@@ -234,6 +241,17 @@ public static native long stream_cork(
 
     public static native int stream_drop(long s);
 
+    /**
+     * Gets the name of the sink or source a specified <tt>pa_stream</tt> is
+     * connected to in the server.
+     *
+     * @param s the <tt>pa_stream</tt> of which to get the name of the sink or
+     * source it is connected to in the server 
+     * @return the name of the sink or source the specified <tt>pa_stream</tt>
+     * is connected to in the server
+     */
+    public static native String stream_get_device_name(long s);
+
     public static native int stream_get_index(long s);
 
     public static native int stream_get_state(long s);
diff --git a/src/org/jitsi/util/StringUtils.java b/src/org/jitsi/util/StringUtils.java
index 2fa07f66..5dcf521d 100644
--- a/src/org/jitsi/util/StringUtils.java
+++ b/src/org/jitsi/util/StringUtils.java
@@ -92,15 +92,20 @@ public static boolean isNullOrEmpty(String s, boolean trim)
     }
 
     /**
-     * Indicates whether strings are equal.
+     * Determines whether a specific <tt>String</tt> value equals another
+     * <tt>String</tt> value. If the two specified <tt>String</tt> values are
+     * equal to <tt>null</tt>, they are considered equal.
      *
-     * @param s1 the string to analyze.
-     * @param s2 the string to analyze.
-     * @return true if string are equal.
+     * @param s1 the first <tt>String</tt> value to check for value equality
+     * with the second
+     * @param s2 the second <tt>String</tt> value to check for value equality
+     * with the first
+     * @return <tt>true</tt> if the two specified <tt>Sting</tt> values are
+     * equal; otherwise, <tt>false</tt>
      */
     public static boolean isEquals(String s1, String s2)
     {
-        return (s1 == null && s2 == null) || (s1 != null && s1.equals(s2));
+        return (s1 == null) ? (s2 == null) : s1.equals(s2);
     }
 
     /**
diff --git a/src/org/jitsi/util/xml/XMLUtils.java b/src/org/jitsi/util/xml/XMLUtils.java
index 5c04d310..70c02557 100644
--- a/src/org/jitsi/util/xml/XMLUtils.java
+++ b/src/org/jitsi/util/xml/XMLUtils.java
@@ -556,17 +556,16 @@ public static String getNamespaceUri(Node node)
     {
         String prefix = node.getPrefix();
         String namespaceUri = node.getNamespaceURI();
+
         if (!isNullOrEmpty(namespaceUri))
-        {
             return normalizeNamespace(namespaceUri);
-        }
-        if (XMLConstants.XMLNS_ATTRIBUTE.equals(node.getNodeName()) ||
-                XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
-        {
+        if (XMLConstants.XMLNS_ATTRIBUTE.equals(node.getNodeName())
+                || XMLConstants.XMLNS_ATTRIBUTE.equals(prefix))
             return normalizeNamespace(XMLNS_ATTRIBUTE_NS_URI);
-        }
+
         Element rootElement = node.getOwnerDocument().getDocumentElement();
         Node parentNode = null;
+
         while (parentNode != rootElement)
         {
             if (parentNode == null)
@@ -577,23 +576,15 @@ public static String getNamespaceUri(Node node)
                     // If attribute doesn't have prefix - it has its parent
                     // namespace
                     if (isNullOrEmpty(prefix))
-                    {
                         prefix = parentNode.getPrefix();
-                    }
                 }
                 else if (node.getNodeType() == Node.ELEMENT_NODE)
-                {
                     parentNode = node.getParentNode();
-                }
                 else
-                {
                     return null;
-                }
             }
             else
-            {
                 parentNode = parentNode.getParentNode();
-            }
             String parentPrefix = parentNode.getPrefix();
             String parentNamespaceUri = parentNode.getNamespaceURI();
             if (isNullOrEmpty(prefix))
@@ -601,22 +592,16 @@ else if (node.getNodeType() == Node.ELEMENT_NODE)
                 Node xmlnsAttribute =
                         parentNode.getAttributes().getNamedItem("xmlns");
                 if (xmlnsAttribute != null)
-                {
                     return ((Attr) xmlnsAttribute).getValue();
-                }
             }
             else if (isEquals(prefix, parentPrefix))
             {
                 if (!isNullOrEmpty(parentNamespaceUri))
-                {
                     return normalizeNamespace(parentNamespaceUri);
-                }
             }
         }
         if ("xml".equals(prefix))
-        {
             return normalizeNamespace(XML_NS_URI);
-        }
         return null;
     }
 
-- 
GitLab