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;