2010-12-07 Kenneth Russell <kbr@google.com>
authorkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Dec 2010 21:45:04 +0000 (21:45 +0000)
committerkbr@google.com <kbr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 7 Dec 2010 21:45:04 +0000 (21:45 +0000)
        Reviewed by David Levin.

        Fix compilation of core web audio files on Windows
        https://bugs.webkit.org/show_bug.cgi?id=50603

        Added log2 definition to MathExtras.h on Windows platform.

        * wtf/MathExtras.h:
        (log2):
2010-12-07  Kenneth Russell  <kbr@google.com>

        Reviewed by David Levin.

        Fix compilation of core web audio files on Windows
        https://bugs.webkit.org/show_bug.cgi?id=50603

        Changed a few constructs using C99 features of math.h to use
        wtf/MathExtras.h instead. Changed inline definitions of a couple of
        const static doubles in classes to out-of-line. Built Chrome with
        web audio enabled on Windows and Mac OS X to test these changes.

        No new tests since audio API is not yet implemented.

        * WebCore.gypi:
        * platform/audio/AudioResampler.cpp:
        * platform/audio/Biquad.cpp:
        (WebCore::Biquad::setLowpassParams):
        (WebCore::Biquad::setHighpassParams):
        (WebCore::Biquad::setLowShelfParams):
        * platform/audio/Cone.cpp:
        (WebCore::ConeEffect::gain):
        * platform/audio/EqualPowerPanner.cpp:
        (WebCore::EqualPowerPanner::pan):
        * platform/audio/FFTFrame.cpp:
        (WebCore::FFTFrame::interpolateFrequencyComponents):
        (WebCore::FFTFrame::extractAverageGroupDelay):
        (WebCore::FFTFrame::addConstantGroupDelay):
        * platform/audio/HRTFKernel.cpp:
        * platform/audio/HRTFPanner.cpp:
        * webaudio/AudioBufferSourceNode.cpp:
        (WebCore::AudioBufferSourceNode::readFromBufferWithGrainEnvelope):
        * webaudio/AudioPannerNode.cpp:
        (WebCore::AudioPannerNode::getAzimuthElevation):
        * webaudio/AudioParam.cpp: Added.
        (AudioParam::setValue):
        (AudioParam::smooth):
        * webaudio/AudioParam.h:
        * webaudio/RealtimeAnalyser.cpp:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@73458 268f45cc-cd09-0410-ab3c-d52691b4dbfc

16 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/wtf/MathExtras.h
WebCore/ChangeLog
WebCore/WebCore.gypi
WebCore/platform/audio/AudioResampler.cpp
WebCore/platform/audio/Biquad.cpp
WebCore/platform/audio/Cone.cpp
WebCore/platform/audio/EqualPowerPanner.cpp
WebCore/platform/audio/FFTFrame.cpp
WebCore/platform/audio/HRTFKernel.cpp
WebCore/platform/audio/HRTFPanner.cpp
WebCore/webaudio/AudioBufferSourceNode.cpp
WebCore/webaudio/AudioPannerNode.cpp
WebCore/webaudio/AudioParam.cpp [new file with mode: 0644]
WebCore/webaudio/AudioParam.h
WebCore/webaudio/RealtimeAnalyser.cpp

index 146797f..1092cff 100644 (file)
@@ -1,3 +1,15 @@
+2010-12-07  Kenneth Russell  <kbr@google.com>
+
+        Reviewed by David Levin.
+
+        Fix compilation of core web audio files on Windows
+        https://bugs.webkit.org/show_bug.cgi?id=50603
+
+        Added log2 definition to MathExtras.h on Windows platform.
+
+        * wtf/MathExtras.h:
+        (log2):
+
 2010-12-07  Antti Koivisto  <antti@apple.com>
 
         Reviewed by Gavin Barraclough.
index 8a8741c..802ba29 100644 (file)
@@ -145,6 +145,13 @@ inline float nextafterf(float x, float y) { return x > y ? x - FLT_EPSILON : x +
 inline double copysign(double x, double y) { return _copysign(x, y); }
 inline int isfinite(double x) { return _finite(x); }
 
+// MSVC's math.h does not currently supply log2.
+inline bool log2(double num)
+{
+    // This constant is roughly M_LN2, which is not provided by default on Windows.
+    return log(num) / 0.693147180559945309417232121458176568;
+}
+
 // Work around a bug in Win, where atan2(+-infinity, +-infinity) yields NaN instead of specific values.
 inline double wtf_atan2(double x, double y)
 {
index bf230cc..fb95eb2 100644 (file)
@@ -1,3 +1,43 @@
+2010-12-07  Kenneth Russell  <kbr@google.com>
+
+        Reviewed by David Levin.
+
+        Fix compilation of core web audio files on Windows
+        https://bugs.webkit.org/show_bug.cgi?id=50603
+
+        Changed a few constructs using C99 features of math.h to use
+        wtf/MathExtras.h instead. Changed inline definitions of a couple of
+        const static doubles in classes to out-of-line. Built Chrome with
+        web audio enabled on Windows and Mac OS X to test these changes.
+
+        No new tests since audio API is not yet implemented.
+
+        * WebCore.gypi:
+        * platform/audio/AudioResampler.cpp:
+        * platform/audio/Biquad.cpp:
+        (WebCore::Biquad::setLowpassParams):
+        (WebCore::Biquad::setHighpassParams):
+        (WebCore::Biquad::setLowShelfParams):
+        * platform/audio/Cone.cpp:
+        (WebCore::ConeEffect::gain):
+        * platform/audio/EqualPowerPanner.cpp:
+        (WebCore::EqualPowerPanner::pan):
+        * platform/audio/FFTFrame.cpp:
+        (WebCore::FFTFrame::interpolateFrequencyComponents):
+        (WebCore::FFTFrame::extractAverageGroupDelay):
+        (WebCore::FFTFrame::addConstantGroupDelay):
+        * platform/audio/HRTFKernel.cpp:
+        * platform/audio/HRTFPanner.cpp:
+        * webaudio/AudioBufferSourceNode.cpp:
+        (WebCore::AudioBufferSourceNode::readFromBufferWithGrainEnvelope):
+        * webaudio/AudioPannerNode.cpp:
+        (WebCore::AudioPannerNode::getAzimuthElevation):
+        * webaudio/AudioParam.cpp: Added.
+        (AudioParam::setValue):
+        (AudioParam::smooth):
+        * webaudio/AudioParam.h:
+        * webaudio/RealtimeAnalyser.cpp:
+
 2010-11-25  Philippe Normand  <pnormand@igalia.com>
 
         Reviewed by Martin Robinson.
index bb4eb1c..4ba6155 100644 (file)
             'webaudio/AudioNodeOutput.h',
             'webaudio/AudioPannerNode.h',
             'webaudio/AudioPannerNode.cpp',
+            'webaudio/AudioParam.cpp',
             'webaudio/AudioParam.h',
             'webaudio/AudioProcessingEvent.h',
             'webaudio/AudioProcessingEvent.cpp',
index 7f8221e..ba5b58e 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "AudioBus.h"
 #include <algorithm>
-#include <math.h>
+#include <wtf/MathExtras.h>
 
 using namespace std;
  
index 49f010b..20143e3 100644 (file)
@@ -33,9 +33,8 @@
 #include "Biquad.h"
 
 #include <algorithm>
-#include <float.h>
-#include <math.h>
 #include <stdio.h>
+#include <wtf/MathExtras.h>
 
 #if OS(DARWIN)
 #include <Accelerate/Accelerate.h>
@@ -197,7 +196,7 @@ void Biquad::setLowpassParams(double cutoff, double resonance)
     double d = sqrt((4.0 - sqrt(16.0 - 16.0 / (g * g))) / 2.0);
 
     // Compute biquad coefficients for lopass filter
-    double theta = M_PI * cutoff;
+    double theta = piDouble * cutoff;
     double sn = 0.5 * d * sin(theta);
     double beta = 0.5 * (1.0 - sn) / (1.0 + sn);
     double gamma = (0.5 + beta) * cos(theta);
@@ -218,7 +217,7 @@ void Biquad::setHighpassParams(double cutoff, double resonance)
     double d = sqrt((4.0 - sqrt(16.0 - 16.0 / (g * g))) / 2.0);
 
     // Compute biquad coefficients for highpass filter
-    double theta = M_PI * cutoff;
+    double theta = piDouble * cutoff;
     double sn = 0.5 * d * sin(theta);
     double beta = 0.5 * (1.0 - sn) / (1.0 + sn);
     double gamma = (0.5 + beta) * cos(theta);
@@ -233,7 +232,7 @@ void Biquad::setHighpassParams(double cutoff, double resonance)
 
 void Biquad::setLowShelfParams(double cutoff, double dbGain)
 {
-    double theta = M_PI * cutoff;
+    double theta = piDouble * cutoff;
 
     double A = pow(10.0, dbGain / 40.0);
     double S = 1.0; // filter slope (1.0 is max value)
index 843b3cc..f514cde 100644 (file)
@@ -31,6 +31,7 @@
 #if ENABLE(WEB_AUDIO)
 
 #include "Cone.h"
+#include <wtf/MathExtras.h>
 
 namespace WebCore {
 
@@ -55,7 +56,7 @@ double ConeEffect::gain(FloatPoint3D sourcePosition, FloatPoint3D sourceOrientat
 
     // Angle between the source orientation vector and the source-listener vector
     double dotProduct = sourceToListener.dot(normalizedSourceOrientation);
-    double angle = 180.0 * acos(dotProduct) / M_PI;
+    double angle = 180.0 * acos(dotProduct) / piDouble;
     double absAngle = fabs(angle);
 
     // Divide by 2.0 here since API is entire angle (not half-angle)
index 2e4e10f..002b7c6 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "AudioBus.h"
 #include "AudioUtilities.h"
-#include <math.h>
+#include <wtf/MathExtras.h>
 
 // Use a 50ms smoothing / de-zippering time-constant.
 const double SmoothingTimeConstant = 0.050;
@@ -76,7 +76,7 @@ void EqualPowerPanner::pan(double azimuth, double /*elevation*/, AudioBus* input
     else
         desiredPanPosition = (azimuth + 30.0) / 60.0;
 
-    double desiredGainL = 0.5 * cos(M_PI * desiredPanPosition) + 0.5;
+    double desiredGainL = 0.5 * cos(piDouble * desiredPanPosition) + 0.5;
     double desiredGainR = sqrt(1.0 - desiredGainL*desiredGainL);
 
     // Don't de-zipper on first render call.
index 17292b6..d9979d9 100644 (file)
@@ -134,32 +134,32 @@ void FFTFrame::interpolateFrequencyComponents(const FFTFrame& frame1, const FFTF
         lastPhase2 = phase2;
 
         // Unwrap phase deltas
-        if (deltaPhase1 > M_PI)
-            deltaPhase1 -= 2.0 * M_PI;
-        if (deltaPhase1 < -M_PI)
-            deltaPhase1 += 2.0 * M_PI;
-        if (deltaPhase2 > M_PI)
-            deltaPhase2 -= 2.0 * M_PI;
-        if (deltaPhase2 < -M_PI)
-            deltaPhase2 += 2.0 * M_PI;
+        if (deltaPhase1 > piDouble)
+            deltaPhase1 -= 2.0 * piDouble;
+        if (deltaPhase1 < -piDouble)
+            deltaPhase1 += 2.0 * piDouble;
+        if (deltaPhase2 > piDouble)
+            deltaPhase2 -= 2.0 * piDouble;
+        if (deltaPhase2 < -piDouble)
+            deltaPhase2 += 2.0 * piDouble;
 
         // Blend group-delays
         double deltaPhaseBlend;
 
-        if (deltaPhase1 - deltaPhase2 > M_PI)
-            deltaPhaseBlend = s1 * deltaPhase1 + s2 * (2.0 * M_PI + deltaPhase2);
-        else if (deltaPhase2 - deltaPhase1 > M_PI)
-            deltaPhaseBlend = s1 * (2.0 * M_PI + deltaPhase1) + s2 * deltaPhase2;
+        if (deltaPhase1 - deltaPhase2 > piDouble)
+            deltaPhaseBlend = s1 * deltaPhase1 + s2 * (2.0 * piDouble + deltaPhase2);
+        else if (deltaPhase2 - deltaPhase1 > piDouble)
+            deltaPhaseBlend = s1 * (2.0 * piDouble + deltaPhase1) + s2 * deltaPhase2;
         else
             deltaPhaseBlend = s1 * deltaPhase1 + s2 * deltaPhase2;
 
         phaseAccum += deltaPhaseBlend;
 
         // Unwrap
-        if (phaseAccum > M_PI)
-            phaseAccum -= 2.0 * M_PI;
-        if (phaseAccum < -M_PI)
-            phaseAccum += 2.0 * M_PI;
+        if (phaseAccum > piDouble)
+            phaseAccum -= 2.0 * piDouble;
+        if (phaseAccum < -piDouble)
+            phaseAccum += 2.0 * piDouble;
 
         Complex c = complexFromMagnitudePhase(mag, phaseAccum);
 
@@ -179,7 +179,7 @@ double FFTFrame::extractAverageGroupDelay()
 
     int halfSize = fftSize() / 2;
 
-    const double kSamplePhaseDelay = (2.0 * M_PI) / double(fftSize());
+    const double kSamplePhaseDelay = (2.0 * piDouble) / double(fftSize());
 
     // Calculate weighted average group delay
     for (int i = 0; i < halfSize; i++) {
@@ -191,10 +191,10 @@ double FFTFrame::extractAverageGroupDelay()
         lastPhase = phase;
 
         // Unwrap
-        if (deltaPhase < -M_PI)
-            deltaPhase += 2.0 * M_PI;
-        if (deltaPhase > M_PI)
-            deltaPhase -= 2.0 * M_PI;
+        if (deltaPhase < -piDouble)
+            deltaPhase += 2.0 * piDouble;
+        if (deltaPhase > piDouble)
+            deltaPhase -= 2.0 * piDouble;
 
         aveSum += mag * deltaPhase;
         weightSum += mag;
@@ -224,7 +224,7 @@ void FFTFrame::addConstantGroupDelay(double sampleFrameDelay)
     float* realP = realData();
     float* imagP = imagData();
 
-    const double kSamplePhaseDelay = (2.0 * M_PI) / double(fftSize());
+    const double kSamplePhaseDelay = (2.0 * piDouble) / double(fftSize());
 
     double phaseAdj = -sampleFrameDelay * kSamplePhaseDelay;
 
index 852cdbf..22d4b12 100644 (file)
@@ -35,6 +35,7 @@
 #include "AudioChannel.h"
 #include "Biquad.h"
 #include "FFTFrame.h"
+#include <wtf/MathExtras.h>
 
 using namespace std;
 
index 56f06f1..68bc505 100644 (file)
@@ -33,7 +33,7 @@
 #include "HRTFDatabase.h"
 #include "HRTFDatabaseLoader.h"
 #include <algorithm>
-#include <math.h>
+#include <wtf/MathExtras.h>
 #include <wtf/RefPtr.h>
 
 using namespace std;
index 7aaeb04..05abed8 100644 (file)
@@ -31,6 +31,7 @@
 #include "AudioContext.h"
 #include "AudioNodeOutput.h"
 #include <algorithm>
+#include <wtf/MathExtras.h>
 
 using namespace std;
 
@@ -324,7 +325,7 @@ void AudioBufferSourceNode::readFromBufferWithGrainEnvelope(float* sourceL, floa
         m_grainFrameCount++;
 
         x = min(1.0f, x);
-        float grainEnvelope = sinf(M_PI * x);
+        float grainEnvelope = sinf(piFloat * x);
         
         *destinationL++ = grainEnvelope * *sourceL++;
 
index 5cd17cb..5c94763 100644 (file)
@@ -193,7 +193,7 @@ void AudioPannerNode::getAzimuthElevation(double* outAzimuth, double* outElevati
     FloatPoint3D projectedSource = sourceListener - upProjection * up;
     projectedSource.normalize();
 
-    azimuth = 180.0 * acos(projectedSource.dot(listenerRight)) / M_PI;
+    azimuth = 180.0 * acos(projectedSource.dot(listenerRight)) / piDouble;
     fixNANs(azimuth); // avoid illegal values
 
     // Source  in front or behind the listener
@@ -208,7 +208,7 @@ void AudioPannerNode::getAzimuthElevation(double* outAzimuth, double* outElevati
         azimuth = 450.0 - azimuth;
 
     // Elevation
-    double elevation = 90.0 - 180.0 * acos(sourceListener.dot(up)) / M_PI;
+    double elevation = 90.0 - 180.0 * acos(sourceListener.dot(up)) / piDouble;
     fixNANs(azimuth); // avoid illegal values
 
     if (elevation > 90.0)
diff --git a/WebCore/webaudio/AudioParam.cpp b/WebCore/webaudio/AudioParam.cpp
new file mode 100644 (file)
index 0000000..dcf918f
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if ENABLE(WEB_AUDIO)
+
+#include "AudioParam.h"
+
+#include <wtf/MathExtras.h>
+
+namespace WebCore {
+
+const double AudioParam::DefaultSmoothingConstant = 0.05;
+const double AudioParam::SnapThreshold = 0.001;
+
+void AudioParam::setValue(float value)
+{
+    // Check against JavaScript giving us bogus floating-point values.
+    // Don't ASSERT, since this can happen if somebody writes bad JS.
+    if (!isnan(value) && !isinf(value))
+        m_value = value;
+}
+
+bool AudioParam::smooth()
+{
+    if (m_smoothedValue == m_value) {
+        // Smoothed value has already approached and snapped to value.
+        return true;
+    }
+
+    // Exponential approach
+    m_smoothedValue += (m_value - m_smoothedValue) * m_smoothingConstant;
+
+    // If we get close enough then snap to actual value.
+    if (fabs(m_smoothedValue - m_value) < SnapThreshold) // FIXME: the threshold needs to be adjustable depending on range - but this is OK general purpose value.
+        m_smoothedValue = m_value;
+
+    return false;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_AUDIO)
index 7643cf3..88b7615 100644 (file)
@@ -30,7 +30,6 @@
 #define AudioParam_h
 
 #include "PlatformString.h"
-#include <math.h>
 #include <sys/types.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -39,8 +38,8 @@ namespace WebCore {
 
 class AudioParam : public RefCounted<AudioParam> {
 public:
-    static const double DefaultSmoothingConstant = 0.05;
-    static const double SnapThreshold = 0.001;
+    static const double DefaultSmoothingConstant;
+    static const double SnapThreshold;
 
     static PassRefPtr<AudioParam> create(const String& name, double defaultValue, double minValue, double maxValue, unsigned units = 0)
     {
@@ -61,13 +60,7 @@ public:
 
     float value() const { return static_cast<float>(m_value); }
     
-    void setValue(float value)
-    {
-        // Check against JavaScript giving us bogus floating-point values.
-        // Don't ASSERT, since this can happen if somebody writes bad JS.
-        if (!isnan(value) && !isinf(value))
-            m_value = value;
-    }
+    void setValue(float);
 
     String name() const { return m_name; }
 
@@ -84,22 +77,7 @@ public:
 
     // Smoothly exponentially approaches to (de-zippers) the desired value.
     // Returns true if smoothed value has already snapped exactly to value.
-    bool smooth()
-    {
-        if (m_smoothedValue == m_value) {
-            // Smoothed value has already approached and snapped to value.
-            return true;
-        }
-
-        // Exponential approach
-        m_smoothedValue += (m_value - m_smoothedValue) * m_smoothingConstant;
-
-        // If we get close enough then snap to actual value.
-        if (fabs(m_smoothedValue - m_value) < SnapThreshold) // FIXME: the threshold needs to be adjustable depending on range - but this is OK general purpose value.
-            m_smoothedValue = m_value;
-
-        return false;
-    }
+    bool smooth();
 
     void resetSmoothedValue() { m_smoothedValue = m_value; }
     void setSmoothingConstant(double k) { m_smoothingConstant = k; }
index 282f299..30a7de1 100644 (file)
@@ -40,6 +40,7 @@
 #include <algorithm>
 #include <limits.h>
 #include <wtf/Complex.h>
+#include <wtf/MathExtras.h>
 #include <wtf/Threading.h>
 
 using namespace std;
@@ -137,7 +138,7 @@ void applyWindow(float* p, size_t n)
     
     for (unsigned i = 0; i < n; ++i) {
         double x = static_cast<double>(i) / static_cast<double>(n);
-        double window = a0 - a1 * cos(2.0 * M_PI * x) + a2 * cos(4.0 * M_PI * x);
+        double window = a0 - a1 * cos(2.0 * piDouble * x) + a2 * cos(4.0 * piDouble * x);
         p[i] *= float(window);
     }
 }