<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[214505] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/214505">214505</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2017-03-28 16:12:45 -0700 (Tue, 28 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Audio indicator is visible on uni-watch.com but there is no audible audio
https://bugs.webkit.org/show_bug.cgi?id=170200
&lt;rdar://problem/31289132&gt;

Reviewed by Eric Carlson.

Cherry-pick the following patch from Blink by &lt;rtoy@chromium.org&gt;:
- https://chromium.googlesource.com/chromium/src.git/+/439de5bb2a31384666db1a0e2dadb2b97d2f3ce4

When the gain of a GainNode is 0 or 1, the operation of the node can
be optimized.  When gain = 1, just copy the input to the output.  When
gain = 0; just zero out the output.  Currently, the input is
multiplied by the gain to produce the output.  This just optimizes the
multiplication away for the two special cases.

Also, have the GainNode set the silence hint if the gain is 0.

And fix a bug in processIfNecessary when unsilenceOutputs was causing the
silence hint to be cleared after the node's process method was finished
and may have set the silence hint.  The processing should come after
unsilenceOutputs to preserve any hints from processing the node.

* Modules/webaudio/AudioNode.cpp:
(WebCore::AudioNode::processIfNecessary):
* Modules/webaudio/GainNode.cpp:
(WebCore::GainNode::process):
* platform/audio/AudioBus.cpp:
(WebCore::AudioBus::copyWithGainFrom):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioNodecpp">trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioGainNodecpp">trunk/Source/WebCore/Modules/webaudio/GainNode.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioAudioBuscpp">trunk/Source/WebCore/platform/audio/AudioBus.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214504 => 214505)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-28 23:12:11 UTC (rev 214504)
+++ trunk/Source/WebCore/ChangeLog        2017-03-28 23:12:45 UTC (rev 214505)
</span><span class="lines">@@ -1,5 +1,36 @@
</span><span class="cx"> 2017-03-28  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Audio indicator is visible on uni-watch.com but there is no audible audio
+        https://bugs.webkit.org/show_bug.cgi?id=170200
+        &lt;rdar://problem/31289132&gt;
+
+        Reviewed by Eric Carlson.
+
+        Cherry-pick the following patch from Blink by &lt;rtoy@chromium.org&gt;:
+        - https://chromium.googlesource.com/chromium/src.git/+/439de5bb2a31384666db1a0e2dadb2b97d2f3ce4
+
+        When the gain of a GainNode is 0 or 1, the operation of the node can
+        be optimized.  When gain = 1, just copy the input to the output.  When
+        gain = 0; just zero out the output.  Currently, the input is
+        multiplied by the gain to produce the output.  This just optimizes the
+        multiplication away for the two special cases.
+
+        Also, have the GainNode set the silence hint if the gain is 0.
+
+        And fix a bug in processIfNecessary when unsilenceOutputs was causing the
+        silence hint to be cleared after the node's process method was finished
+        and may have set the silence hint.  The processing should come after
+        unsilenceOutputs to preserve any hints from processing the node.
+
+        * Modules/webaudio/AudioNode.cpp:
+        (WebCore::AudioNode::processIfNecessary):
+        * Modules/webaudio/GainNode.cpp:
+        (WebCore::GainNode::process):
+        * platform/audio/AudioBus.cpp:
+        (WebCore::AudioBus::copyWithGainFrom):
+
+2017-03-28  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Animated SVG images are not paused when outside viewport
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=170155
</span><span class="cx">         &lt;rdar://problem/31288893&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp (214504 => 214505)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp        2017-03-28 23:12:11 UTC (rev 214504)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp        2017-03-28 23:12:45 UTC (rev 214505)
</span><span class="lines">@@ -305,8 +305,11 @@
</span><span class="cx">         if (silentInputs &amp;&amp; propagatesSilence())
</span><span class="cx">             silenceOutputs();
</span><span class="cx">         else {
</span><ins>+            // Unsilence the outputs first because the processing of the node may cause the outputs
+            // to go silent and we want to propagate that hint to the downstream nodes!  (For
+            // example, a Gain node with a gain of 0 will want to silence its output.)
+            unsilenceOutputs();
</ins><span class="cx">             process(framesToProcess);
</span><del>-            unsilenceOutputs();
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioGainNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/GainNode.cpp (214504 => 214505)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/GainNode.cpp        2017-03-28 23:12:11 UTC (rev 214504)
+++ trunk/Source/WebCore/Modules/webaudio/GainNode.cpp        2017-03-28 23:12:45 UTC (rev 214505)
</span><span class="lines">@@ -73,7 +73,12 @@
</span><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             // Apply the gain with de-zippering into the output bus.
</span><del>-            outputBus-&gt;copyWithGainFrom(*inputBus, &amp;m_lastGain, gain()-&gt;value());
</del><ins>+            if (!m_lastGain &amp;&amp; m_lastGain == m_gain-&gt;value()) {
+                // If the gain is 0 (and we've converged on dezippering), just zero the bus and set
+                // the silence hint.
+                outputBus-&gt;zero();
+            } else
+                outputBus-&gt;copyWithGainFrom(*inputBus, &amp;m_lastGain, gain()-&gt;value());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioAudioBuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/AudioBus.cpp (214504 => 214505)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/AudioBus.cpp        2017-03-28 23:12:11 UTC (rev 214504)
+++ trunk/Source/WebCore/platform/audio/AudioBus.cpp        2017-03-28 23:12:45 UTC (rev 214505)
</span><span class="lines">@@ -511,8 +511,17 @@
</span><span class="cx"> 
</span><span class="cx">     // Apply constant gain after de-zippering has converged on target gain.
</span><span class="cx">     if (framesToDezipper &lt; framesToProcess) {
</span><del>-        for (unsigned channelIndex = 0; channelIndex &lt; numberOfChannels; ++channelIndex)
-            vsmul(sources[channelIndex], 1, &amp;gain, destinations[channelIndex], 1, framesToProcess - framesToDezipper);
</del><ins>+        // Handle gains of 0 and 1 (exactly) specially.
+        if (gain == 1) {
+            for (unsigned channelIndex = 0; channelIndex &lt; numberOfChannels; ++channelIndex)
+                memcpy(destinations[channelIndex], sources[channelIndex], (framesToProcess - framesToDezipper) * sizeof(*destinations[channelIndex]));
+        } else if (!gain) {
+            for (unsigned channelIndex = 0; channelIndex &lt; numberOfChannels; ++channelIndex)
+                memset(destinations[channelIndex], 0, (framesToProcess - framesToDezipper) * sizeof(*destinations[channelIndex]));
+        } else {
+            for (unsigned channelIndex = 0; channelIndex &lt; numberOfChannels; ++channelIndex)
+                vsmul(sources[channelIndex], 1, &amp;gain, destinations[channelIndex], 1, framesToProcess - framesToDezipper);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Save the target gain as the starting point for next time around.
</span></span></pre>
</div>
</div>

</body>
</html>