Title: [274664] trunk/Source/WebCore
- Revision
- 274664
- Author
- [email protected]
- Date
- 2021-03-18 12:23:02 -0700 (Thu, 18 Mar 2021)
Log Message
Avoid heap allocations under BiquadDSPKernel::updateCoefficientsIfNecessary()
https://bugs.webkit.org/show_bug.cgi?id=223444
Reviewed by Darin Adler.
Use float[] instead of AudioFloatArray for local variables in updateCoefficientsIfNecessary()
in order to avoid doing heap allocations on the audio thread, for performance reasons.
* Modules/webaudio/BiquadDSPKernel.cpp:
(WebCore::hasConstantValue):
(WebCore::BiquadDSPKernel::updateCoefficientsIfNecessary):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (274663 => 274664)
--- trunk/Source/WebCore/ChangeLog 2021-03-18 19:09:17 UTC (rev 274663)
+++ trunk/Source/WebCore/ChangeLog 2021-03-18 19:23:02 UTC (rev 274664)
@@ -1,5 +1,19 @@
2021-03-18 Chris Dumez <[email protected]>
+ Avoid heap allocations under BiquadDSPKernel::updateCoefficientsIfNecessary()
+ https://bugs.webkit.org/show_bug.cgi?id=223444
+
+ Reviewed by Darin Adler.
+
+ Use float[] instead of AudioFloatArray for local variables in updateCoefficientsIfNecessary()
+ in order to avoid doing heap allocations on the audio thread, for performance reasons.
+
+ * Modules/webaudio/BiquadDSPKernel.cpp:
+ (WebCore::hasConstantValue):
+ (WebCore::BiquadDSPKernel::updateCoefficientsIfNecessary):
+
+2021-03-18 Chris Dumez <[email protected]>
+
Avoid heap allocations under AudioSampleDataSource::pullSamplesInternal()
https://bugs.webkit.org/show_bug.cgi?id=223449
Modified: trunk/Source/WebCore/Modules/webaudio/BiquadDSPKernel.cpp (274663 => 274664)
--- trunk/Source/WebCore/Modules/webaudio/BiquadDSPKernel.cpp 2021-03-18 19:09:17 UTC (rev 274663)
+++ trunk/Source/WebCore/Modules/webaudio/BiquadDSPKernel.cpp 2021-03-18 19:23:02 UTC (rev 274664)
@@ -38,30 +38,46 @@
namespace WebCore {
+static bool hasConstantValue(float* values, size_t framesToProcess)
+{
+ if (framesToProcess <= 1)
+ return true;
+
+ float constant = values[0];
+ for (size_t i = 1; i < framesToProcess; ++i) {
+ if (values[i] != constant)
+ return false;
+ }
+ return true;
+}
+
void BiquadDSPKernel::updateCoefficientsIfNecessary(size_t framesToProcess)
{
if (biquadProcessor()->filterCoefficientsDirty()) {
if (biquadProcessor()->hasSampleAccurateValues() && biquadProcessor()->shouldUseARate()) {
- AudioFloatArray cutoffFrequency(framesToProcess);
- AudioFloatArray q(framesToProcess);
- AudioFloatArray gain(framesToProcess);
- AudioFloatArray detune(framesToProcess); // in Cents
+ // Use float arrays instead of AudioFloatArray to avoid heap allocations on the audio thread.
+ float cutoffFrequency[AudioUtilities::renderQuantumSize];
+ float q[AudioUtilities::renderQuantumSize];
+ float gain[AudioUtilities::renderQuantumSize];
+ float detune[AudioUtilities::renderQuantumSize]; // in Cents
- ASSERT(framesToProcess <= AudioUtilities::renderQuantumSize);
+ RELEASE_ASSERT(framesToProcess <= AudioUtilities::renderQuantumSize);
- biquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency.data(), framesToProcess);
- biquadProcessor()->parameter2().calculateSampleAccurateValues(q.data(), framesToProcess);
- biquadProcessor()->parameter3().calculateSampleAccurateValues(gain.data(), framesToProcess);
- biquadProcessor()->parameter4().calculateSampleAccurateValues(detune.data(), framesToProcess);
+ biquadProcessor()->parameter1().calculateSampleAccurateValues(cutoffFrequency, framesToProcess);
+ biquadProcessor()->parameter2().calculateSampleAccurateValues(q, framesToProcess);
+ biquadProcessor()->parameter3().calculateSampleAccurateValues(gain, framesToProcess);
+ biquadProcessor()->parameter4().calculateSampleAccurateValues(detune, framesToProcess);
// If all the values are actually constant for this render (or the
// automation rate is "k-rate" for all of the AudioParams), we don't need
// to compute filter coefficients for each frame since they would be the
// same as the first.
- bool isConstant = cutoffFrequency.containsConstantValue() && q.containsConstantValue()
- && gain.containsConstantValue() && detune.containsConstantValue();
+ bool isConstant = hasConstantValue(cutoffFrequency, framesToProcess)
+ && hasConstantValue(q, framesToProcess)
+ && hasConstantValue(gain, framesToProcess)
+ && hasConstantValue(detune, framesToProcess);
- updateCoefficients(isConstant ? 1 : framesToProcess, cutoffFrequency.data(), q.data(), gain.data(), detune.data());
+ updateCoefficients(isConstant ? 1 : framesToProcess, cutoffFrequency, q, gain, detune);
} else {
float cutoffFrequency = biquadProcessor()->parameter1().finalValue();
float q = biquadProcessor()->parameter2().finalValue();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes