Index: third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp |
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp |
index 85fda7fa1898fc7a6c5f5079703717a8078740c3..1b2c73d5712493fbc1ef9123c8e19e66270a9195 100644 |
--- a/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp |
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadDSPKernel.cpp |
@@ -31,13 +31,6 @@ |
namespace blink { |
-// 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 kMaxBiquadDelayTime = 0.2; |
- |
void BiquadDSPKernel::UpdateCoefficientsIfNecessary(int frames_to_process) { |
if (GetBiquadProcessor()->FilterCoefficientsDirty()) { |
float cutoff_frequency[AudioUtilities::kRenderQuantumFrames]; |
@@ -121,6 +114,23 @@ void BiquadDSPKernel::UpdateCoefficients(int number_of_frames, |
break; |
} |
} |
+ |
+ UpdateTailTime(number_of_frames - 1); |
+} |
+ |
+void BiquadDSPKernel::UpdateTailTime(int coef_index) { |
+ // A reasonable upper limit for the tail time. While it's easy to |
+ // create biquad filters whose tail time can be much larger than |
+ // this, limit the maximum to this value so that we don't keep such |
+ // nodes alive "forever". |
+ // TODO: What is a reasonable upper limit? |
+ const double kMaxTailTime = 30; |
+ |
+ double sample_rate = SampleRate(); |
+ double tail = |
+ biquad_.TailFrame(coef_index, kMaxTailTime * sample_rate) / sample_rate; |
+ |
+ tail_time_ = clampTo(tail, 0.0, kMaxTailTime); |
} |
void BiquadDSPKernel::Process(const float* source, |
@@ -199,7 +209,7 @@ void BiquadDSPKernel::GetFrequencyResponse(int n_frequencies, |
} |
double BiquadDSPKernel::TailTime() const { |
- return kMaxBiquadDelayTime; |
+ return tail_time_; |
} |
double BiquadDSPKernel::LatencyTime() const { |