Diff
Modified: trunk/Source/WebCore/ChangeLog (110506 => 110507)
--- trunk/Source/WebCore/ChangeLog 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/ChangeLog 2012-03-13 00:09:18 UTC (rev 110507)
@@ -1,3 +1,90 @@
+2012-03-12 Jer Noble <[email protected]>
+
+ WebCore: Add support for AudioNode "tailTime()" and "latencyTime()"
+ https://bugs.webkit.org/show_bug.cgi?id=74750
+
+ Reviewed by Chris Rogers.
+
+ No new tests; optimization of existing code path, so covered by existing tests.
+
+ To account for AudioNodes which may generate non-silent audio when fed silent input
+ for a certain amount of time after the last non-silent audio data, add two new virtual
+ functions tailTime() and latencyTime().
+
+ * webaudio/AudioNode.h:
+ (WebCore::AudioNode::tailTime): Added. Pure virtual.
+ (WebCore::AudioNode::latencyTime): Added. Pure virtual.
+ * platform/audio/AudioProcessor.h:
+ (WebCore::AudioProcessor::tailTime): Added. Pure virtual.
+ (WebCore::AudioProcessor::latencyTime): Added. Pure virtual.
+ * platform/audio/AudioDSPKernel.h:
+ (WebCore::AudioDSPKernel::tailTime): Added. Pure virtual.
+ (WebCore::AudioDSPKernel::latencyTime): Added. Pure virtual.
+
+ Added tailTime() and latencyTime() overrides to the following classes:
+ * platform/audio/AudioDSPKernelProcessor.cpp:
+ (WebCore::AudioDSPKernelProcessor::tailTime):
+ (WebCore::AudioDSPKernelProcessor::latencyTime):
+ * platform/audio/AudioDSPKernelProcessor.h:
+ * platform/audio/DynamicsCompressor.h:
+ (WebCore::DynamicsCompressor::tailTime):
+ (WebCore::DynamicsCompressor::latencyTime):
+ * platform/audio/EqualPowerPanner.h:
+ * platform/audio/HRTFPanner.cpp:
+ (WebCore::HRTFPanner::tailTime):
+ (WebCore::HRTFPanner::latencyTime):
+ * platform/audio/HRTFPanner.h:
+ * platform/audio/Panner.h:
+ * webaudio/AudioBasicProcessorNode.cpp:
+ (WebCore::AudioBasicProcessorNode::tailTime):
+ (WebCore::AudioBasicProcessorNode::latencyTime):
+ * webaudio/AudioBasicProcessorNode.h:
+ * webaudio/AudioChannelMerger.h:
+ * webaudio/AudioChannelSplitter.h:
+ * webaudio/AudioDestinationNode.h:
+ * webaudio/AudioGainNode.h:
+ * webaudio/AudioPannerNode.h:
+ * webaudio/AudioSourceNode.h:
+ * webaudio/BiquadDSPKernel.cpp:
+ (WebCore::BiquadDSPKernel::tailTime):
+ (WebCore::BiquadDSPKernel::latencyTime):
+ * webaudio/BiquadDSPKernel.h:
+ * webaudio/BiquadFilterNode.h:
+ * webaudio/ConvolverNode.cpp:
+ (WebCore::ConvolverNode::tailTime):
+ (WebCore::ConvolverNode::latencyTime):
+ * webaudio/ConvolverNode.h:
+ * webaudio/DelayDSPKernel.cpp:
+ (WebCore::DelayDSPKernel::tailTime):
+ (WebCore::DelayDSPKernel::latencyTime):
+ * webaudio/DelayDSPKernel.h:
+ * webaudio/DelayProcessor.h:
+ * webaudio/DynamicsCompressorNode.cpp:
+ (WebCore::DynamicsCompressorNode::tailTime):
+ (WebCore::DynamicsCompressorNode::latencyTime):
+ * webaudio/DynamicsCompressorNode.h:
+ * webaudio/_javascript_AudioNode.cpp:
+ (WebCore::_javascript_AudioNode::tailTime):
+ (WebCore::_javascript_AudioNode::latencyTime):
+ * webaudio/_javascript_AudioNode.h:
+ * webaudio/RealtimeAnalyserNode.h:
+ * webaudio/WaveShaperDSPKernel.h:
+
+ The following functions were added as support for the new AudioNode and AudioProcessor functions:
+ * platform/audio/Biquad.cpp:
+ (WebCore::Biquad::latencyFrames):
+ * platform/audio/Biquad.h:
+ * platform/audio/Reverb.cpp:
+ (WebCore::Reverb::latencyFrames):
+ * platform/audio/ReverbConvolver.h:
+ (WebCore::ReverbConvolver::latencyFrames):
+
+ The following functions were made const-correct:
+ * platform/audio/HRTFPanner.h:
+ (WebCore::HRTFPanner::fftSize):
+ * platform/audio/Reverb.h:
+ (WebCore::Reverb::impulseResponseLength):
+
2012-03-12 Anders Carlsson <[email protected]>
WebTileLayers should be opaque
Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernel.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/AudioDSPKernel.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernel.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -63,6 +63,9 @@
AudioDSPKernelProcessor* processor() { return m_kernelProcessor; }
const AudioDSPKernelProcessor* processor() const { return m_kernelProcessor; }
+ virtual double tailTime() const = 0;
+ virtual double latencyTime() const = 0;
+
protected:
AudioDSPKernelProcessor* m_kernelProcessor;
float m_sampleRate;
Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -115,6 +115,18 @@
m_numberOfChannels = numberOfChannels;
}
+double AudioDSPKernelProcessor::tailTime() const
+{
+ // It is expected that all the kernels have the same tailTime.
+ return !m_kernels.isEmpty() ? m_kernels.first()->tailTime() : 0;
+}
+
+double AudioDSPKernelProcessor::latencyTime() const
+{
+ // It is expected that all the kernels have the same latencyTime.
+ return !m_kernels.isEmpty() ? m_kernels.first()->latencyTime() : 0;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -65,6 +65,9 @@
unsigned numberOfChannels() const { return m_numberOfChannels; }
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
protected:
unsigned m_numberOfChannels;
Vector<OwnPtr<AudioDSPKernel> > m_kernels;
Modified: trunk/Source/WebCore/platform/audio/AudioProcessor.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/AudioProcessor.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/AudioProcessor.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -65,6 +65,9 @@
float sampleRate() const { return m_sampleRate; }
+ virtual double tailTime() const = 0;
+ virtual double latencyTime() const = 0;
+
protected:
bool m_initialized;
float m_sampleRate;
Modified: trunk/Source/WebCore/platform/audio/DynamicsCompressor.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/DynamicsCompressor.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/DynamicsCompressor.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -78,6 +78,9 @@
float sampleRate() const { return m_sampleRate; }
float nyquist() const { return m_sampleRate / 2; }
+ double tailTime() const { return 0; }
+ double latencyTime() const { return m_compressor.latencyFrames() / static_cast<double>(sampleRate()); }
+
protected:
unsigned m_numberOfChannels;
Modified: trunk/Source/WebCore/platform/audio/EqualPowerPanner.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/EqualPowerPanner.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/EqualPowerPanner.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -39,6 +39,9 @@
virtual void reset() { m_isFirstRender = true; }
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
private:
// For smoothing / de-zippering
bool m_isFirstRender;
Modified: trunk/Source/WebCore/platform/audio/HRTFPanner.cpp (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/HRTFPanner.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/HRTFPanner.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -294,6 +294,21 @@
}
}
+double HRTFPanner::tailTime() const
+{
+ // Because HRTFPanner is implemented with a DelayKernel and a FFTConvolver, the tailTime of the HRTFPanner
+ // is the sum of the tailTime of the DelayKernel and the tailTime of the FFTConvolver, which is MaxDelayTimeSeconds
+ // and fftSize() / 2, respectively.
+ return MaxDelayTimeSeconds + (fftSize() / 2) / static_cast<double>(sampleRate());
+}
+
+double HRTFPanner::latencyTime() const
+{
+ // The latency of a FFTConvolver is also fftSize() / 2, and is in addition to its tailTime of the
+ // same value.
+ return (fftSize() / 2) / static_cast<double>(sampleRate());
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/platform/audio/HRTFPanner.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/HRTFPanner.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/HRTFPanner.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -40,11 +40,14 @@
virtual void pan(double azimuth, double elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess);
virtual void reset();
- size_t fftSize() { return fftSizeForSampleRate(m_sampleRate); }
+ size_t fftSize() const { return fftSizeForSampleRate(m_sampleRate); }
static size_t fftSizeForSampleRate(float sampleRate);
float sampleRate() const { return m_sampleRate; }
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
private:
// Given an azimuth angle in the range -180 -> +180, returns the corresponding azimuth index for the database,
// and azimuthBlend which is an interpolation value from 0 -> 1.
Modified: trunk/Source/WebCore/platform/audio/Panner.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/Panner.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/Panner.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -57,6 +57,9 @@
virtual void reset() = 0;
+ virtual double tailTime() const = 0;
+ virtual double latencyTime() const = 0;
+
protected:
Panner(PanningModel model) : m_panningModel(model) { }
Modified: trunk/Source/WebCore/platform/audio/Reverb.cpp (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/Reverb.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/Reverb.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -228,6 +228,11 @@
m_convolvers[i]->reset();
}
+size_t Reverb::latencyFrames() const
+{
+ return !m_convolvers.isEmpty() ? m_convolvers.first()->latencyFrames() : 0;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/platform/audio/Reverb.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/Reverb.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/Reverb.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -48,7 +48,8 @@
void process(const AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess);
void reset();
- unsigned impulseResponseLength() const { return m_impulseResponseLength; }
+ size_t impulseResponseLength() const { return m_impulseResponseLength; }
+ size_t latencyFrames() const;
private:
void initialize(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads);
Modified: trunk/Source/WebCore/platform/audio/ReverbConvolver.cpp (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/ReverbConvolver.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/ReverbConvolver.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -224,6 +224,13 @@
m_inputBuffer.reset();
}
+size_t ReverbConvolver::latencyFrames() const
+{
+ // FIXME: ConvolverNode should not incur processing latency
+ // <https://bugs.webkit.org/show_bug.cgi?id=75564>
+ return m_minFFTSize / 2;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/platform/audio/ReverbConvolver.h (110506 => 110507)
--- trunk/Source/WebCore/platform/audio/ReverbConvolver.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/platform/audio/ReverbConvolver.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -62,6 +62,7 @@
bool useBackgroundThreads() const { return m_useBackgroundThreads; }
void backgroundThreadEntry();
+ size_t latencyFrames() const;
private:
Vector<OwnPtr<ReverbConvolverStage> > m_stages;
Vector<OwnPtr<ReverbConvolverStage> > m_backgroundStages;
Modified: trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -136,6 +136,16 @@
return output(0)->numberOfChannels();
}
+double AudioBasicProcessorNode::tailTime() const
+{
+ return m_processor->tailTime();
+}
+
+double AudioBasicProcessorNode::latencyTime() const
+{
+ return m_processor->latencyTime();
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioBasicProcessorNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -55,6 +55,9 @@
unsigned numberOfChannels();
protected:
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
AudioProcessor* processor() { return m_processor.get(); }
OwnPtr<AudioProcessor> m_processor;
};
Modified: trunk/Source/WebCore/webaudio/AudioChannelMerger.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioChannelMerger.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioChannelMerger.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -51,6 +51,9 @@
virtual void checkNumberOfChannelsForInput(AudioNodeInput*);
private:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
AudioChannelMerger(AudioContext*, float sampleRate);
};
Modified: trunk/Source/WebCore/webaudio/AudioChannelSplitter.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioChannelSplitter.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioChannelSplitter.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -44,6 +44,9 @@
virtual void reset();
private:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
AudioChannelSplitter(AudioContext*, float sampleRate);
};
Modified: trunk/Source/WebCore/webaudio/AudioDestinationNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioDestinationNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioDestinationNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -54,6 +54,9 @@
virtual void startRendering() = 0;
protected:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
// Counts the number of sample-frames processed by the destination.
size_t m_currentSampleFrame;
};
Modified: trunk/Source/WebCore/webaudio/AudioGainNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioGainNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioGainNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -55,6 +55,9 @@
AudioGain* gain() { return m_gain.get(); }
private:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
AudioGainNode(AudioContext*, float sampleRate);
float m_lastGain; // for de-zippering
Modified: trunk/Source/WebCore/webaudio/AudioNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -137,6 +137,13 @@
bool isMarkedForDeletion() const { return m_isMarkedForDeletion; }
+ // tailTime() is the length of time (not counting latency time) where non-zero output may occur after continuous silent input.
+ virtual double tailTime() const = 0;
+ // latencyTime() is the length of time it takes for non-zero output to appear after non-zero input is provided. This only applies to
+ // processing delay which is an artifact of the processing algorithm chosen and is *not* part of the intrinsic desired effect. For
+ // example, a "delay" effect is expected to delay the signal, and thus would not be considered latency.
+ virtual double latencyTime() const = 0;
+
protected:
// Inputs and outputs must be created before the AudioNode is initialized.
void addInput(PassOwnPtr<AudioNodeInput>);
Modified: trunk/Source/WebCore/webaudio/AudioPannerNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioPannerNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioPannerNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -124,6 +124,9 @@
AudioGain* distanceGain() { return m_distanceGain.get(); }
AudioGain* coneGain() { return m_coneGain.get(); }
+ virtual double tailTime() const OVERRIDE { return m_panner ? m_panner->tailTime() : 0; }
+ virtual double latencyTime() const OVERRIDE { return m_panner ? m_panner->latencyTime() : 0; }
+
private:
AudioPannerNode(AudioContext*, float sampleRate);
Modified: trunk/Source/WebCore/webaudio/AudioSourceNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/AudioSourceNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/AudioSourceNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -39,6 +39,9 @@
: AudioNode(context, sampleRate)
{
}
+protected:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
};
} // namespace WebCore
Modified: trunk/Source/WebCore/webaudio/BiquadDSPKernel.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/BiquadDSPKernel.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/BiquadDSPKernel.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -30,10 +30,17 @@
#include "BiquadProcessor.h"
#include "FloatConversion.h"
+#include <limits.h>
#include <wtf/Vector.h>
namespace WebCore {
+// FIXME: As a recursive linear filter, depending on its parameters, a biquad filter can have
+// an infinite tailTime. In practice, Biquad filters do not usually (except for very high resonance values)
+// have a tailTime of longer than approx. 200ms. This value could possibly be calculated based on the
+// settings of the Biquad.
+static const double MaxBiquadDelayTime = 0.2;
+
void BiquadDSPKernel::updateCoefficientsIfNecessary(bool useSmoothing, bool forceUpdate)
{
if (forceUpdate || biquadProcessor()->filterCoefficientsDirty()) {
@@ -134,6 +141,16 @@
m_biquad.getFrequencyResponse(nFrequencies, frequency.data(), magResponse, phaseResponse);
}
+double BiquadDSPKernel::tailTime() const
+{
+ return MaxBiquadDelayTime;
+}
+
+double BiquadDSPKernel::latencyTime() const
+{
+ return 0;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/BiquadDSPKernel.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/BiquadDSPKernel.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/BiquadDSPKernel.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -52,6 +52,10 @@
const float* frequencyHz,
float* magResponse,
float* phaseResponse);
+
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
protected:
Biquad m_biquad;
BiquadProcessor* biquadProcessor() { return static_cast<BiquadProcessor*>(processor()); }
Modified: trunk/Source/WebCore/webaudio/BiquadFilterNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/BiquadFilterNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/BiquadFilterNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -63,6 +63,7 @@
void getFrequencyResponse(const Float32Array* frequencyHz,
Float32Array* magResponse,
Float32Array* phaseResponse);
+
private:
BiquadFilterNode(AudioContext*, float sampleRate);
Modified: trunk/Source/WebCore/webaudio/ConvolverNode.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/ConvolverNode.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/ConvolverNode.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -151,6 +151,16 @@
return m_buffer.get();
}
+double ConvolverNode::tailTime() const
+{
+ return m_reverb ? m_reverb->impulseResponseLength() / static_cast<double>(sampleRate()) : 0;
+}
+
+double ConvolverNode::latencyTime() const
+{
+ return m_reverb ? m_reverb->latencyFrames() / static_cast<double>(sampleRate()) : 0;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/ConvolverNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/ConvolverNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/ConvolverNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -56,9 +56,13 @@
bool normalize() const { return m_normalize; }
void setNormalize(bool normalize) { m_normalize = normalize; }
+
private:
ConvolverNode(AudioContext*, float sampleRate);
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
OwnPtr<Reverb> m_reverb;
RefPtr<AudioBuffer> m_buffer;
Modified: trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -134,6 +134,16 @@
m_buffer.zero();
}
+double DelayDSPKernel::tailTime() const
+{
+ return m_maxDelayTime;
+}
+
+double DelayDSPKernel::latencyTime() const
+{
+ return 0;
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/DelayDSPKernel.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/DelayDSPKernel.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/DelayDSPKernel.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -44,7 +44,10 @@
double maxDelayTime() const { return m_maxDelayTime; }
void setDelayFrames(double numberOfFrames) { m_desiredDelayFrames = numberOfFrames; }
-
+
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
private:
AudioFloatArray m_buffer;
double m_maxDelayTime;
Modified: trunk/Source/WebCore/webaudio/DelayProcessor.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/DelayProcessor.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/DelayProcessor.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -46,6 +46,7 @@
double maxDelayTime() { return m_maxDelayTime; }
private:
+
RefPtr<AudioParam> m_delayTime;
double m_maxDelayTime;
};
Modified: trunk/Source/WebCore/webaudio/DynamicsCompressorNode.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/DynamicsCompressorNode.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/DynamicsCompressorNode.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -106,6 +106,16 @@
AudioNode::uninitialize();
}
+double DynamicsCompressorNode::tailTime() const
+{
+ return m_dynamicsCompressor->tailTime();
+}
+
+double DynamicsCompressorNode::latencyTime() const
+{
+ return m_dynamicsCompressor->latencyTime();
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/DynamicsCompressorNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/DynamicsCompressorNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/DynamicsCompressorNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -57,6 +57,9 @@
AudioParam* reduction() { return m_reduction.get(); }
private:
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
DynamicsCompressorNode(AudioContext*, float sampleRate);
OwnPtr<DynamicsCompressor> m_dynamicsCompressor;
Modified: trunk/Source/WebCore/webaudio/_javascript_AudioNode.cpp (110506 => 110507)
--- trunk/Source/WebCore/webaudio/_javascript_AudioNode.cpp 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/_javascript_AudioNode.cpp 2012-03-13 00:09:18 UTC (rev 110507)
@@ -267,6 +267,16 @@
return const_cast<_javascript_AudioNode*>(this)->context()->document();
}
+double _javascript_AudioNode::tailTime() const
+{
+ return std::numeric_limits<double>::infinity();
+}
+
+double _javascript_AudioNode::latencyTime() const
+{
+ return std::numeric_limits<double>::infinity();
+}
+
} // namespace WebCore
#endif // ENABLE(WEB_AUDIO)
Modified: trunk/Source/WebCore/webaudio/_javascript_AudioNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/_javascript_AudioNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/_javascript_AudioNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -78,6 +78,9 @@
using AudioNode::deref;
private:
+ virtual double tailTime() const OVERRIDE;
+ virtual double latencyTime() const OVERRIDE;
+
_javascript_AudioNode(AudioContext*, float sampleRate, size_t bufferSize, unsigned numberOfInputs, unsigned numberOfOutputs);
static void fireProcessEventDispatch(void* userData);
Modified: trunk/Source/WebCore/webaudio/RealtimeAnalyserNode.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/RealtimeAnalyserNode.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/RealtimeAnalyserNode.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -65,6 +65,9 @@
void getByteTimeDomainData(Uint8Array* array) { m_analyser.getByteTimeDomainData(array); }
private:
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
+
RealtimeAnalyserNode(AudioContext*, float sampleRate);
RealtimeAnalyser m_analyser;
Modified: trunk/Source/WebCore/webaudio/WaveShaperDSPKernel.h (110506 => 110507)
--- trunk/Source/WebCore/webaudio/WaveShaperDSPKernel.h 2012-03-13 00:07:16 UTC (rev 110506)
+++ trunk/Source/WebCore/webaudio/WaveShaperDSPKernel.h 2012-03-13 00:09:18 UTC (rev 110507)
@@ -44,6 +44,8 @@
// AudioDSPKernel
virtual void process(const float* source, float* dest, size_t framesToProcess);
virtual void reset() { }
+ virtual double tailTime() const OVERRIDE { return 0; }
+ virtual double latencyTime() const OVERRIDE { return 0; }
protected:
WaveShaperProcessor* waveShaperProcessor() { return static_cast<WaveShaperProcessor*>(processor()); }