Title: [110507] trunk/Source/WebCore
Revision
110507
Author
[email protected]
Date
2012-03-12 17:09:18 -0700 (Mon, 12 Mar 2012)

Log Message

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):

Modified Paths

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()); }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to