<!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>[214620] 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/214620">214620</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2017-03-30 13:46:03 -0700 (Thu, 30 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>We are spending a lot of time bzero'ing AudioChannel buffers on uni-watch.com
https://bugs.webkit.org/show_bug.cgi?id=170288
&lt;rdar://problem/31289132&gt;

Reviewed by Eric Carlson.

We are spending a lot of time bzero'ing AudioChannel buffers on uni-watch.com due
to doubleclick ads using WebAudio with a 0-gain GainNode. We should optimize the
0-gain case as much as possible.

No new tests, only an optimization.

* Modules/webaudio/AudioNode.cpp:
(WebCore::AudioNode::processIfNecessary):
Drop call to unsilenceOutputs() before calling AudioNode::process(). The AudioChannel
API already takes care of clearing its 'silent' flag whenever its buffer changes so
there should be no need to explicitly clearing the 'silent' flag before calling
process(). This was causing us to zero out buffers that were already filled with
zeros because AudioChannel::zero() would no longer return early, not knowing the
channel is already silent. This reduces the number of bzero() calls by ~3.5x on
uni-watch.com (from 100 calls every ~20ms to 100 calls every ~70ms.

* Modules/webaudio/AudioNode.h:
* platform/audio/mac/AudioDestinationMac.cpp:
(WebCore::AudioDestinationMac::render):
Avoid clamping the values in the channel buffer if the channel is silent since this
will have no effect (given that the buffer only contains zeros).</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="#trunkSourceWebCoreModuleswebaudioAudioNodeh">trunk/Source/WebCore/Modules/webaudio/AudioNode.h</a></li>
<li><a href="#trunkSourceWebCoreplatformaudiomacAudioDestinationMaccpp">trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (214619 => 214620)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-30 20:22:38 UTC (rev 214619)
+++ trunk/Source/WebCore/ChangeLog        2017-03-30 20:46:03 UTC (rev 214620)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2017-03-30  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        We are spending a lot of time bzero'ing AudioChannel buffers on uni-watch.com
+        https://bugs.webkit.org/show_bug.cgi?id=170288
+        &lt;rdar://problem/31289132&gt;
+
+        Reviewed by Eric Carlson.
+
+        We are spending a lot of time bzero'ing AudioChannel buffers on uni-watch.com due
+        to doubleclick ads using WebAudio with a 0-gain GainNode. We should optimize the
+        0-gain case as much as possible.
+
+        No new tests, only an optimization.
+
+        * Modules/webaudio/AudioNode.cpp:
+        (WebCore::AudioNode::processIfNecessary):
+        Drop call to unsilenceOutputs() before calling AudioNode::process(). The AudioChannel
+        API already takes care of clearing its 'silent' flag whenever its buffer changes so
+        there should be no need to explicitly clearing the 'silent' flag before calling
+        process(). This was causing us to zero out buffers that were already filled with
+        zeros because AudioChannel::zero() would no longer return early, not knowing the
+        channel is already silent. This reduces the number of bzero() calls by ~3.5x on
+        uni-watch.com (from 100 calls every ~20ms to 100 calls every ~70ms.
+
+        * Modules/webaudio/AudioNode.h:
+        * platform/audio/mac/AudioDestinationMac.cpp:
+        (WebCore::AudioDestinationMac::render):
+        Avoid clamping the values in the channel buffer if the channel is silent since this
+        will have no effect (given that the buffer only contains zeros).
+
</ins><span class="cx"> 2017-03-30  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Crash] WebCore::AudioBuffer::AudioBuffer don't checking illegal value
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioNodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp (214619 => 214620)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp        2017-03-30 20:22:38 UTC (rev 214619)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp        2017-03-30 20:46:03 UTC (rev 214620)
</span><span class="lines">@@ -304,13 +304,8 @@
</span><span class="cx"> 
</span><span class="cx">         if (silentInputs &amp;&amp; propagatesSilence())
</span><span class="cx">             silenceOutputs();
</span><del>-        else {
-            // 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();
</del><ins>+        else
</ins><span class="cx">             process(framesToProcess);
</span><del>-        }
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -357,12 +352,6 @@
</span><span class="cx">         output-&gt;bus()-&gt;zero();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AudioNode::unsilenceOutputs()
-{
-    for (auto&amp; output : m_outputs)
-        output-&gt;bus()-&gt;clearSilentFlag();
-}
-
</del><span class="cx"> void AudioNode::enableOutputsIfNecessary()
</span><span class="cx"> {
</span><span class="cx">     if (m_isDisabled &amp;&amp; m_connectionRefCount &gt; 0) {
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.h (214619 => 214620)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioNode.h        2017-03-30 20:22:38 UTC (rev 214619)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.h        2017-03-30 20:46:03 UTC (rev 214620)
</span><span class="lines">@@ -156,7 +156,6 @@
</span><span class="cx">     virtual bool propagatesSilence() const;
</span><span class="cx">     bool inputsAreSilent();
</span><span class="cx">     void silenceOutputs();
</span><del>-    void unsilenceOutputs();
</del><span class="cx"> 
</span><span class="cx">     void enableOutputsIfNecessary();
</span><span class="cx">     void disableOutputsIfNecessary();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudiomacAudioDestinationMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp (214619 => 214620)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp        2017-03-30 20:22:38 UTC (rev 214619)
+++ trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.cpp        2017-03-30 20:46:03 UTC (rev 214620)
</span><span class="lines">@@ -167,7 +167,8 @@
</span><span class="cx">     // Clamp values at 0db (i.e., [-1.0, 1.0])
</span><span class="cx">     for (unsigned i = 0; i &lt; m_renderBus-&gt;numberOfChannels(); ++i) {
</span><span class="cx">         AudioChannel* channel = m_renderBus-&gt;channel(i);
</span><del>-        VectorMath::vclip(channel-&gt;data(), 1, &amp;kLowThreshold, &amp;kHighThreshold, channel-&gt;mutableData(), 1, numberOfFrames);
</del><ins>+        if (!channel-&gt;isSilent())
+            VectorMath::vclip(channel-&gt;data(), 1, &amp;kLowThreshold, &amp;kHighThreshold, channel-&gt;mutableData(), 1, numberOfFrames);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return noErr;
</span></span></pre>
</div>
</div>

</body>
</html>