2010-09-03 Chris Rogers <crogers@google.com>
authorcrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Sep 2010 18:32:59 +0000 (18:32 +0000)
committercrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Sep 2010 18:32:59 +0000 (18:32 +0000)
        Reviewed by Kenneth Russell.

        Add audio distance effect files
        https://bugs.webkit.org/show_bug.cgi?id=44705

        No new tests since audio API is not yet implemented.

        * platform/audio/Distance.cpp: Added.
        (WebCore::DistanceEffect::DistanceEffect):
        (WebCore::DistanceEffect::gain):
        (WebCore::DistanceEffect::linearGain):
        (WebCore::DistanceEffect::inverseGain):
        (WebCore::DistanceEffect::exponentialGain):
        * platform/audio/Distance.h: Added.
        (WebCore::DistanceEffect::model):
        (WebCore::DistanceEffect::setModel):
        (WebCore::DistanceEffect::setRefDistance):
        (WebCore::DistanceEffect::setMaxDistance):
        (WebCore::DistanceEffect::setRolloffFactor):
        (WebCore::DistanceEffect::refDistance):
        (WebCore::DistanceEffect::maxDistance):
        (WebCore::DistanceEffect::rolloffFactor):

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

WebCore/ChangeLog
WebCore/platform/audio/Distance.cpp [new file with mode: 0644]
WebCore/platform/audio/Distance.h [new file with mode: 0644]

index 14b7dcc941d69153b116be7b641d6754a234a1bf..b5a59b349494c90909e9bce1fd6b0c4cf4aa7a68 100644 (file)
@@ -1,3 +1,28 @@
+2010-09-03  Chris Rogers  <crogers@google.com>
+
+        Reviewed by Kenneth Russell.
+
+        Add audio distance effect files
+        https://bugs.webkit.org/show_bug.cgi?id=44705
+
+        No new tests since audio API is not yet implemented.
+
+        * platform/audio/Distance.cpp: Added.
+        (WebCore::DistanceEffect::DistanceEffect):
+        (WebCore::DistanceEffect::gain):
+        (WebCore::DistanceEffect::linearGain):
+        (WebCore::DistanceEffect::inverseGain):
+        (WebCore::DistanceEffect::exponentialGain):
+        * platform/audio/Distance.h: Added.
+        (WebCore::DistanceEffect::model):
+        (WebCore::DistanceEffect::setModel):
+        (WebCore::DistanceEffect::setRefDistance):
+        (WebCore::DistanceEffect::setMaxDistance):
+        (WebCore::DistanceEffect::setRolloffFactor):
+        (WebCore::DistanceEffect::refDistance):
+        (WebCore::DistanceEffect::maxDistance):
+        (WebCore::DistanceEffect::rolloffFactor):
+
 2010-09-03  Johnny Ding  <jnd@chromium.org>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/platform/audio/Distance.cpp b/WebCore/platform/audio/Distance.cpp
new file mode 100644 (file)
index 0000000..0f1b005
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * 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 "Distance.h"
+
+#include <algorithm>
+#include <math.h>
+
+using namespace std;
+
+namespace WebCore {
+
+DistanceEffect::DistanceEffect()
+    : m_model(ModelInverse)
+    , m_isClamped(true)
+    , m_refDistance(1.0)
+    , m_maxDistance(10000.0)
+    , m_rolloffFactor(1.0)
+{
+}
+
+double DistanceEffect::gain(double distance)
+{
+    // don't go beyond maximum distance
+    distance = min(distance, m_maxDistance);
+
+    // if clamped, don't get closer than reference distance
+    if (m_isClamped)
+        distance = max(distance, m_refDistance);
+
+    switch (m_model) {
+    case ModelLinear:
+        return linearGain(distance);
+        break;
+    case ModelInverse:
+        return inverseGain(distance);
+        break;
+    case ModelExponential:
+        return exponentialGain(distance);
+        break;
+
+    default:
+        return 0.0;
+    }
+}
+
+double DistanceEffect::linearGain(double distance)
+{
+    return (1.0 - m_rolloffFactor * (distance - m_refDistance)) / (m_maxDistance - m_refDistance);
+}
+
+double DistanceEffect::inverseGain(double distance)
+{
+    return m_refDistance / (m_refDistance + m_rolloffFactor * (distance - m_refDistance));
+}
+
+double DistanceEffect::exponentialGain(double distance)
+{
+    return pow(distance / m_refDistance, -m_rolloffFactor);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_AUDIO)
diff --git a/WebCore/platform/audio/Distance.h b/WebCore/platform/audio/Distance.h
new file mode 100644 (file)
index 0000000..c7edded
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * 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.
+ */
+
+#ifndef Distance_h
+#define Distance_h
+
+namespace WebCore {
+
+// Distance models are defined according to the OpenAL specification
+
+class DistanceEffect {
+public:
+    enum ModelType {
+        ModelLinear = 0,
+        ModelInverse = 1,
+        ModelExponential = 2
+    };
+
+    DistanceEffect();
+
+    // Returns scalar gain for the given distance the current distance model is used
+    double gain(double distance);
+
+    ModelType model() { return m_model; }
+
+    void setModel(ModelType model, bool clamped)
+    {
+        m_model = model;
+        m_isClamped = clamped;
+    }
+
+    // Distance params
+    void setRefDistance(double refDistance) { m_refDistance = refDistance; }
+    void setMaxDistance(double maxDistance) { m_maxDistance = maxDistance; }
+    void setRolloffFactor(double rolloffFactor) { m_rolloffFactor = rolloffFactor; }
+
+    double refDistance() const { return m_refDistance; }
+    double maxDistance() const { return m_maxDistance; }
+    double rolloffFactor() const { return m_rolloffFactor; }
+
+protected:
+    double linearGain(double distance);
+    double inverseGain(double distance);
+    double exponentialGain(double distance);
+
+    ModelType m_model;
+    bool m_isClamped;
+    double m_refDistance;
+    double m_maxDistance;
+    double m_rolloffFactor;
+};
+
+} // namespace WebCore
+
+#endif // Distance_h