Title: [267432] trunk
Revision
267432
Author
[email protected]
Date
2020-09-22 12:25:56 -0700 (Tue, 22 Sep 2020)

Log Message

AudioParams with automations must process timelines
https://bugs.webkit.org/show_bug.cgi?id=216837

Reviewed by Darin Adler.

Source/WebCore:

Currently, if an AudioNode has no inputs connected, any automations
(or connections) to an AudioParam of the node is not processed. Thus,
time never advances on the AudioParam, and any upstream graph
connected to the AudioParam never gets pulled for data.

AudioParam should get processed so that time progresses. Normal
processing of the node causes AudioParams to be processed, so we were
only missing the case where the node has silent inputs (silent or no
inputs). Then we just need to update the AudioParams, without having
to do the full processing associated with the node.

See https://webaudio.github.io/web-audio-api/#rendering-loop, step 8.1.1
in particular that says any inputs connected to an AudioParam are
processed. There are no conditions on when this happens.

This is a merge of the following Blink change by Raymond Toy:
- https://codereview.chromium.org/2420983002

No new tests, rebaselined existing test.

* Modules/webaudio/AudioBasicProcessorNode.cpp:
(WebCore::AudioBasicProcessorNode::processOnlyAudioParams):
* Modules/webaudio/AudioBasicProcessorNode.h:
* Modules/webaudio/AudioListener.h:
* Modules/webaudio/AudioNode.cpp:
(WebCore::AudioNode::processIfNecessary):
* Modules/webaudio/AudioNode.h:
(WebCore::AudioNode::processOnlyAudioParams):
* Modules/webaudio/BiquadFilterNode.cpp:
(WebCore::BiquadFilterNode::BiquadFilterNode):
* Modules/webaudio/BiquadProcessor.cpp:
(WebCore::BiquadProcessor::processOnlyAudioParams):
* Modules/webaudio/BiquadProcessor.h:
* Modules/webaudio/DelayDSPKernel.cpp:
(WebCore::DelayDSPKernel::processOnlyAudioParams):
* Modules/webaudio/DelayDSPKernel.h:
* Modules/webaudio/DelayNode.cpp:
(WebCore::DelayNode::DelayNode):
* Modules/webaudio/DynamicsCompressorNode.cpp:
(WebCore::DynamicsCompressorNode::processOnlyAudioParams):
* Modules/webaudio/DynamicsCompressorNode.h:
* Modules/webaudio/GainNode.cpp:
(WebCore::GainNode::processOnlyAudioParams):
* Modules/webaudio/GainNode.h:
* Modules/webaudio/PannerNode.cpp:
(WebCore::PannerNode::processOnlyAudioParams):
* Modules/webaudio/PannerNode.h:
* Modules/webaudio/StereoPannerNode.cpp:
(WebCore::StereoPannerNode::processOnlyAudioParams):
* Modules/webaudio/StereoPannerNode.h:
* platform/audio/AudioDSPKernel.h:
(WebCore::AudioDSPKernel::processOnlyAudioParams):
* platform/audio/AudioDSPKernelProcessor.cpp:
(WebCore::AudioDSPKernelProcessor::processOnlyAudioParams):
* platform/audio/AudioDSPKernelProcessor.h:
* platform/audio/AudioProcessor.h:
(WebCore::AudioProcessor::processOnlyAudioParams):

LayoutTests:

Rebaseline test that is now passing.

* webaudio/AudioParam/audioparam-processing-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (267431 => 267432)


--- trunk/LayoutTests/ChangeLog	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/LayoutTests/ChangeLog	2020-09-22 19:25:56 UTC (rev 267432)
@@ -1,3 +1,14 @@
+2020-09-22  Chris Dumez  <[email protected]>
+
+        AudioParams with automations must process timelines
+        https://bugs.webkit.org/show_bug.cgi?id=216837
+
+        Reviewed by Darin Adler.
+
+        Rebaseline test that is now passing.
+
+        * webaudio/AudioParam/audioparam-processing-expected.txt:
+
 2020-09-22  Diego Pino Garcia  <[email protected]>
 
         [GLIB] Unreviewed test gardening. Mark several audio related tests as failure after r267383.

Modified: trunk/LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt (267431 => 267432)


--- trunk/LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt	2020-09-22 19:25:56 UTC (rev 267432)
@@ -10,18 +10,18 @@
 PASS Audit report 
 PASS > [BiquadFilterNode]  
 PASS   BiquadFilterNode.Q ramp final value is not equal to 1. 
-FAIL X BiquadFilterNode.Q.value is not equal to 5. Got 1. assert_true: expected true got false
+PASS   BiquadFilterNode.Q.value is equal to 5. 
 PASS   BiquadFilterNode.detune ramp final value is not equal to 0. 
-FAIL X BiquadFilterNode.detune.value is not equal to 0.5. Got 0. assert_true: expected true got false
+PASS   BiquadFilterNode.detune.value is equal to 0.5. 
 PASS   BiquadFilterNode.frequency ramp final value is not equal to 350. 
-FAIL X BiquadFilterNode.frequency.value is not equal to 100. Got 350. assert_true: expected true got false
+PASS   BiquadFilterNode.frequency.value is equal to 100. 
 PASS   BiquadFilterNode.gain ramp final value is not equal to 0. 
-FAIL X BiquadFilterNode.gain.value is not equal to 3. Got 0. assert_true: expected true got false
-FAIL < [BiquadFilterNode] 4 out of 8 assertions were failed. assert_true: expected true got false
+PASS   BiquadFilterNode.gain.value is equal to 3. 
+PASS < [BiquadFilterNode] All assertions passed. (total 8 assertions) 
 PASS > [DelayNode]  
 PASS   DelayNode.delayTime ramp final value is not equal to 0. 
-FAIL X DelayNode.delayTime.value is not equal to 0.5. Got 0. assert_true: expected true got false
-FAIL < [DelayNode] 1 out of 2 assertions were failed. assert_true: expected true got false
+PASS   DelayNode.delayTime.value is equal to 0.5. 
+PASS < [DelayNode] All assertions passed. (total 2 assertions) 
 PASS > [DynamicsCompressorNode]  
 PASS   DynamicsCompressorNode.attack ramp final value is not equal to 0.003000000026077032. 
 PASS   DynamicsCompressorNode.attack.value is equal to 0.5. 
@@ -36,45 +36,45 @@
 PASS < [DynamicsCompressorNode] All assertions passed. (total 10 assertions) 
 PASS > [GainNode]  
 PASS   GainNode.gain ramp final value is not equal to 1. 
-FAIL X GainNode.gain.value is not equal to 0.5. Got 1. assert_true: expected true got false
-FAIL < [GainNode] 1 out of 2 assertions were failed. assert_true: expected true got false
+PASS   GainNode.gain.value is equal to 0.5. 
+PASS < [GainNode] All assertions passed. (total 2 assertions) 
 PASS > [PannerNode]  
 PASS   PannerNode.positionX ramp final value is not equal to 0. 
-FAIL X PannerNode.positionX.value is not equal to 0.5. Got 0. assert_true: expected true got false
+PASS   PannerNode.positionX.value is equal to 0.5. 
 PASS   PannerNode.positionY ramp final value is not equal to 0. 
-FAIL X PannerNode.positionY.value is not equal to 30. Got 0. assert_true: expected true got false
+PASS   PannerNode.positionY.value is equal to 30. 
 PASS   PannerNode.positionZ ramp final value is not equal to 0. 
-FAIL X PannerNode.positionZ.value is not equal to 15. Got 0. assert_true: expected true got false
+PASS   PannerNode.positionZ.value is equal to 15. 
 PASS   PannerNode.orientationX ramp final value is not equal to 1. 
-FAIL X PannerNode.orientationX.value is not equal to 0.5. Got 1. assert_true: expected true got false
+PASS   PannerNode.orientationX.value is equal to 0.5. 
 PASS   PannerNode.orientationY ramp final value is not equal to 0. 
-FAIL X PannerNode.orientationY.value is not equal to 30. Got 0. assert_true: expected true got false
+PASS   PannerNode.orientationY.value is equal to 30. 
 PASS   PannerNode.orientationZ ramp final value is not equal to 0. 
-FAIL X PannerNode.orientationZ.value is not equal to 15. Got 0. assert_true: expected true got false
-FAIL < [PannerNode] 6 out of 12 assertions were failed. assert_true: expected true got false
+PASS   PannerNode.orientationZ.value is equal to 15. 
+PASS < [PannerNode] All assertions passed. (total 12 assertions) 
 PASS > [StereoPannerNode]  
 PASS   StereoPannerNode.pan ramp final value is not equal to 0. 
-FAIL X StereoPannerNode.pan.value is not equal to 0.5. Got 0. assert_true: expected true got false
-FAIL < [StereoPannerNode] 1 out of 2 assertions were failed. assert_true: expected true got false
+PASS   StereoPannerNode.pan.value is equal to 0.5. 
+PASS < [StereoPannerNode] All assertions passed. (total 2 assertions) 
 PASS > [AudioListener]  
 PASS   AudioListener.positionX ramp final value is not equal to 0. 
-FAIL X AudioListener.positionX.value is not equal to 100. Got 0. assert_true: expected true got false
+PASS   AudioListener.positionX.value is equal to 100. 
 PASS   AudioListener.positionY ramp final value is not equal to 0. 
-FAIL X AudioListener.positionY.value is not equal to 200. Got 0. assert_true: expected true got false
+PASS   AudioListener.positionY.value is equal to 200. 
 PASS   AudioListener.positionZ ramp final value is not equal to 0. 
-FAIL X AudioListener.positionZ.value is not equal to 300. Got 0. assert_true: expected true got false
+PASS   AudioListener.positionZ.value is equal to 300. 
 PASS   AudioListener.forwardX ramp final value is not equal to 0. 
-FAIL X AudioListener.forwardX.value is not equal to -100. Got 0. assert_true: expected true got false
+PASS   AudioListener.forwardX.value is equal to -100. 
 PASS   AudioListener.forwardY ramp final value is not equal to 0. 
-FAIL X AudioListener.forwardY.value is not equal to -200. Got 0. assert_true: expected true got false
+PASS   AudioListener.forwardY.value is equal to -200. 
 PASS   AudioListener.forwardZ ramp final value is not equal to -1. 
-FAIL X AudioListener.forwardZ.value is not equal to -300. Got -1. assert_true: expected true got false
+PASS   AudioListener.forwardZ.value is equal to -300. 
 PASS   AudioListener.upX ramp final value is not equal to 0. 
-FAIL X AudioListener.upX.value is not equal to 99. Got 0. assert_true: expected true got false
+PASS   AudioListener.upX.value is equal to 99. 
 PASS   AudioListener.upY ramp final value is not equal to 1. 
-FAIL X AudioListener.upY.value is not equal to 42. Got 1. assert_true: expected true got false
+PASS   AudioListener.upY.value is equal to 42. 
 PASS   AudioListener.upZ ramp final value is not equal to 0. 
-FAIL X AudioListener.upZ.value is not equal to 137. Got 0. assert_true: expected true got false
-FAIL < [AudioListener] 9 out of 18 assertions were failed. assert_true: expected true got false
-FAIL # AUDIT TASK RUNNER FINISHED: 6 out of 7 tasks were failed. assert_true: expected true got false
+PASS   AudioListener.upZ.value is equal to 137. 
+PASS < [AudioListener] All assertions passed. (total 18 assertions) 
+PASS # AUDIT TASK RUNNER FINISHED: 7 tasks ran successfully. 
 

Modified: trunk/Source/WebCore/ChangeLog (267431 => 267432)


--- trunk/Source/WebCore/ChangeLog	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/ChangeLog	2020-09-22 19:25:56 UTC (rev 267432)
@@ -1,5 +1,70 @@
 2020-09-22  Chris Dumez  <[email protected]>
 
+        AudioParams with automations must process timelines
+        https://bugs.webkit.org/show_bug.cgi?id=216837
+
+        Reviewed by Darin Adler.
+
+        Currently, if an AudioNode has no inputs connected, any automations
+        (or connections) to an AudioParam of the node is not processed. Thus,
+        time never advances on the AudioParam, and any upstream graph
+        connected to the AudioParam never gets pulled for data.
+
+        AudioParam should get processed so that time progresses. Normal
+        processing of the node causes AudioParams to be processed, so we were
+        only missing the case where the node has silent inputs (silent or no
+        inputs). Then we just need to update the AudioParams, without having
+        to do the full processing associated with the node.
+
+        See https://webaudio.github.io/web-audio-api/#rendering-loop, step 8.1.1
+        in particular that says any inputs connected to an AudioParam are 
+        processed. There are no conditions on when this happens.
+
+        This is a merge of the following Blink change by Raymond Toy:
+        - https://codereview.chromium.org/2420983002
+
+        No new tests, rebaselined existing test.
+
+        * Modules/webaudio/AudioBasicProcessorNode.cpp:
+        (WebCore::AudioBasicProcessorNode::processOnlyAudioParams):
+        * Modules/webaudio/AudioBasicProcessorNode.h:
+        * Modules/webaudio/AudioListener.h:
+        * Modules/webaudio/AudioNode.cpp:
+        (WebCore::AudioNode::processIfNecessary):
+        * Modules/webaudio/AudioNode.h:
+        (WebCore::AudioNode::processOnlyAudioParams):
+        * Modules/webaudio/BiquadFilterNode.cpp:
+        (WebCore::BiquadFilterNode::BiquadFilterNode):
+        * Modules/webaudio/BiquadProcessor.cpp:
+        (WebCore::BiquadProcessor::processOnlyAudioParams):
+        * Modules/webaudio/BiquadProcessor.h:
+        * Modules/webaudio/DelayDSPKernel.cpp:
+        (WebCore::DelayDSPKernel::processOnlyAudioParams):
+        * Modules/webaudio/DelayDSPKernel.h:
+        * Modules/webaudio/DelayNode.cpp:
+        (WebCore::DelayNode::DelayNode):
+        * Modules/webaudio/DynamicsCompressorNode.cpp:
+        (WebCore::DynamicsCompressorNode::processOnlyAudioParams):
+        * Modules/webaudio/DynamicsCompressorNode.h:
+        * Modules/webaudio/GainNode.cpp:
+        (WebCore::GainNode::processOnlyAudioParams):
+        * Modules/webaudio/GainNode.h:
+        * Modules/webaudio/PannerNode.cpp:
+        (WebCore::PannerNode::processOnlyAudioParams):
+        * Modules/webaudio/PannerNode.h:
+        * Modules/webaudio/StereoPannerNode.cpp:
+        (WebCore::StereoPannerNode::processOnlyAudioParams):
+        * Modules/webaudio/StereoPannerNode.h:
+        * platform/audio/AudioDSPKernel.h:
+        (WebCore::AudioDSPKernel::processOnlyAudioParams):
+        * platform/audio/AudioDSPKernelProcessor.cpp:
+        (WebCore::AudioDSPKernelProcessor::processOnlyAudioParams):
+        * platform/audio/AudioDSPKernelProcessor.h:
+        * platform/audio/AudioProcessor.h:
+        (WebCore::AudioProcessor::processOnlyAudioParams):
+
+2020-09-22  Chris Dumez  <[email protected]>
+
         Unreviewed, partial revert of r267383.
 
         Restore GStreamer-specific implementation of FFTFrame::multiply() since it appears

Modified: trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -87,6 +87,14 @@
     }
 }
 
+void AudioBasicProcessorNode::processOnlyAudioParams(size_t framesToProcess)
+{
+    if (!isInitialized() || !processor())
+        return;
+
+    processor()->processOnlyAudioParams(framesToProcess);
+}
+
 // Nice optimization in the very common case allowing for "in-place" processing
 void AudioBasicProcessorNode::pullInputs(size_t framesToProcess)
 {

Modified: trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -41,6 +41,7 @@
 
     // AudioNode
     void process(size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) override;
     void pullInputs(size_t framesToProcess) override;
     void reset() override;
     void initialize() override;

Modified: trunk/Source/WebCore/Modules/webaudio/AudioListener.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/AudioListener.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/AudioListener.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -87,11 +87,12 @@
     const float* upYValues(size_t framesToProcess);
     const float* upZValues(size_t framesToProcess);
 
+    void updateValuesIfNeeded(size_t framesToProcess);
+
 protected:
     explicit AudioListener(BaseAudioContext&);
 
 private:
-    void updateValuesIfNeeded(size_t framesToProcess);
 
     Ref<AudioParam> m_positionX;
     Ref<AudioParam> m_positionY;

Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -479,9 +479,13 @@
         if (!silentInputs)
             m_lastNonSilentTime = (context().currentSampleFrame() + framesToProcess) / static_cast<double>(context().sampleRate());
 
-        if (silentInputs && propagatesSilence())
+        if (silentInputs && propagatesSilence()) {
             silenceOutputs();
-        else
+            // AudioParams still need to be processed so that the value can be updated
+            // if there are automations or so that the upstream nodes get pulled if
+            // any are connected to the AudioParam.
+            processOnlyAudioParams(framesToProcess);
+        } else
             process(framesToProcess);
     }
 }

Modified: trunk/Source/WebCore/Modules/webaudio/AudioNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/AudioNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/AudioNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -116,6 +116,11 @@
     // Called from context's audio thread.
     virtual void process(size_t framesToProcess) = 0;
 
+    // Like process(), but only causes the automations to process; the
+    // normal processing of the node is bypassed. By default, we assume
+    // no AudioParams need to be updated.
+    virtual void processOnlyAudioParams(size_t) { }
+
     // Resets DSP processing state (clears delay lines, filter memory, etc.)
     // Called from context's audio thread.
     virtual void reset() = 0;

Modified: trunk/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -62,6 +62,9 @@
 
     // Initially setup as lowpass filter.
     m_processor = makeUnique<BiquadProcessor>(context, context.sampleRate(), 1, false);
+
+    // Initialize so that AudioParams can be processed.
+    initialize();
 }
 
 BiquadFilterType BiquadFilterNode::type() const

Modified: trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -108,6 +108,17 @@
         m_kernels[i]->process(source->channel(i)->data(), destination->channel(i)->mutableData(), framesToProcess);
 }
 
+void BiquadProcessor::processOnlyAudioParams(size_t framesToProcess)
+{
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    m_parameter1->calculateSampleAccurateValues(values, framesToProcess);
+    m_parameter2->calculateSampleAccurateValues(values, framesToProcess);
+    m_parameter3->calculateSampleAccurateValues(values, framesToProcess);
+    m_parameter4->calculateSampleAccurateValues(values, framesToProcess);
+}
+
 void BiquadProcessor::setType(BiquadFilterType type)
 {
     if (type != m_type) {

Modified: trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -47,6 +47,7 @@
     std::unique_ptr<AudioDSPKernel> createKernel() override;
         
     void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) final;
 
     // Get the magnitude and phase response of the filter at the given
     // set of frequencies (in Hz). The phase response is in radians.

Modified: trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -133,6 +133,17 @@
     }
 }
 
+void DelayDSPKernel::processOnlyAudioParams(size_t framesToProcess)
+{
+    if (!delayProcessor())
+        return;
+
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    delayProcessor()->delayTime().calculateSampleAccurateValues(values, framesToProcess);
+}
+
 void DelayDSPKernel::reset()
 {
     m_buffer.zero();

Modified: trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -38,6 +38,7 @@
     DelayDSPKernel(double maxDelayTime, float sampleRate);
     
     void process(const float* source, float* destination, size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) final;
     void reset() override;
     
     double maxDelayTime() const { return m_maxDelayTime; }

Modified: trunk/Source/WebCore/Modules/webaudio/DelayNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/DelayNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/DelayNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -43,6 +43,9 @@
 {
     setNodeType(NodeTypeDelay);
     m_processor = makeUnique<DelayProcessor>(context, context.sampleRate(), 1, maxDelayTime);
+
+    // Initialize so that AudioParams can be processed.
+    initialize();
 }
 
 ExceptionOr<Ref<DelayNode>> DelayNode::create(BaseAudioContext& context, const DelayOptions& options)

Modified: trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -103,6 +103,18 @@
     setReduction(m_dynamicsCompressor->parameterValue(DynamicsCompressor::ParamReduction));
 }
 
+void DynamicsCompressorNode::processOnlyAudioParams(size_t framesToProcess)
+{
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    m_threshold->calculateSampleAccurateValues(values, framesToProcess);
+    m_knee->calculateSampleAccurateValues(values, framesToProcess);
+    m_ratio->calculateSampleAccurateValues(values, framesToProcess);
+    m_attack->calculateSampleAccurateValues(values, framesToProcess);
+    m_release->calculateSampleAccurateValues(values, framesToProcess);
+}
+
 void DynamicsCompressorNode::reset()
 {
     m_dynamicsCompressor->reset();

Modified: trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -43,6 +43,7 @@
 
     // AudioNode
     void process(size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) final;
     void reset() override;
     void initialize() override;
     void uninitialize() override;

Modified: trunk/Source/WebCore/Modules/webaudio/GainNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/GainNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/GainNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -102,6 +102,14 @@
     }
 }
 
+void GainNode::processOnlyAudioParams(size_t framesToProcess)
+{
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    m_gain->calculateSampleAccurateValues(values, framesToProcess);
+}
+
 void GainNode::reset()
 {
 }

Modified: trunk/Source/WebCore/Modules/webaudio/GainNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/GainNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/GainNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -43,6 +43,7 @@
 
     // AudioNode
     void process(size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) final;
     void reset() override;
 
     // Called in the main thread when the number of channels for the input may have changed.

Modified: trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -181,6 +181,22 @@
     destination->copyWithGainFrom(*destination, totalGain);
 }
 
+void PannerNode::processOnlyAudioParams(size_t framesToProcess)
+{
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    m_positionX->calculateSampleAccurateValues(values, framesToProcess);
+    m_positionY->calculateSampleAccurateValues(values, framesToProcess);
+    m_positionZ->calculateSampleAccurateValues(values, framesToProcess);
+
+    m_orientationX->calculateSampleAccurateValues(values, framesToProcess);
+    m_orientationY->calculateSampleAccurateValues(values, framesToProcess);
+    m_orientationZ->calculateSampleAccurateValues(values, framesToProcess);
+
+    listener().updateValuesIfNeeded(framesToProcess);
+}
+
 void PannerNode::processSampleAccurateValues(AudioBus* destination, const AudioBus* source, size_t framesToProcess)
 {
     // Get the sample accurate values from all of the AudioParams, including the

Modified: trunk/Source/WebCore/Modules/webaudio/PannerNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/PannerNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/PannerNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -70,6 +70,7 @@
 
     // AudioNode
     void process(size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) final;
     void pullInputs(size_t framesToProcess) override;
     void reset() override;
     void initialize() override;

Modified: trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.cpp (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -100,6 +100,14 @@
     StereoPanner::panToTargetValue(source, destination, panValue, framesToProcess);
 }
 
+void StereoPannerNode::processOnlyAudioParams(size_t framesToProcess)
+{
+    float values[AudioNode::ProcessingSizeInFrames];
+    ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames);
+
+    m_pan->calculateSampleAccurateValues(values, framesToProcess);
+}
+
 ExceptionOr<void> StereoPannerNode::setChannelCount(unsigned channelCount)
 {
     if (channelCount > 2)

Modified: trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.h (267431 => 267432)


--- trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -51,6 +51,7 @@
     
     // AudioNode
     void process(size_t framesToProcess) final;
+    void processOnlyAudioParams(size_t framesToProcess) final;
     void reset() final { };
     bool requiresTailProcessing() const final { return false; }
 

Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernel.h (267431 => 267432)


--- trunk/Source/WebCore/platform/audio/AudioDSPKernel.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernel.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -57,6 +57,10 @@
 
     // Subclasses must override process() to do the processing and reset() to reset DSP state.
     virtual void process(const float* source, float* destination, size_t framesToProcess) = 0;
+
+    // Subclasses that have AudioParams must override this to process the AudioParams.
+    virtual void processOnlyAudioParams(size_t) { }
+
     virtual void reset() = 0;
 
     float sampleRate() const { return m_sampleRate; }

Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp (267431 => 267432)


--- trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp	2020-09-22 19:25:56 UTC (rev 267432)
@@ -90,6 +90,15 @@
         m_kernels[i]->process(source->channel(i)->data(), destination->channel(i)->mutableData(), framesToProcess);
 }
 
+void AudioDSPKernelProcessor::processOnlyAudioParams(size_t framesToProcess)
+{
+    if (!isInitialized())
+        return;
+
+    for (unsigned i = 0; i < m_kernels.size(); ++i)
+        m_kernels[i]->processOnlyAudioParams(framesToProcess);
+}
+
 // Resets filter state
 void AudioDSPKernelProcessor::reset()
 {

Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h (267431 => 267432)


--- trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -58,6 +58,7 @@
     void initialize() override;
     void uninitialize() override;
     void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override;
+    void processOnlyAudioParams(size_t framesToProcess) override;
     void reset() override;
     void setNumberOfChannels(unsigned) override;
     unsigned numberOfChannels() const override { return m_numberOfChannels; }

Modified: trunk/Source/WebCore/platform/audio/AudioProcessor.h (267431 => 267432)


--- trunk/Source/WebCore/platform/audio/AudioProcessor.h	2020-09-22 19:18:17 UTC (rev 267431)
+++ trunk/Source/WebCore/platform/audio/AudioProcessor.h	2020-09-22 19:25:56 UTC (rev 267432)
@@ -59,6 +59,10 @@
     // Processes the source to destination bus.  The number of channels must match in source and destination.
     virtual void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) = 0;
 
+    // Forces all AudioParams in the processor to run the timeline, bypassing any other processing the processor
+    // would do in process().
+    virtual void processOnlyAudioParams(size_t) { }
+
     // Resets filter state
     virtual void reset() = 0;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to