2010-08-30 Chris Rogers <crogers@google.com>
authorcrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Aug 2010 22:20:39 +0000 (22:20 +0000)
committercrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Aug 2010 22:20:39 +0000 (22:20 +0000)
        Reviewed by Kenneth Russell.

        Add audio cone effect files.  The cone effect operates as defined in the OpenAL specification.
        https://bugs.webkit.org/show_bug.cgi?id=44712

        No new tests since audio API not implemented yet.

        * platform/audio: Added.
        * platform/audio/Cone.cpp: Added.
        (WebCore::ConeEffect::ConeEffect):
        (WebCore::ConeEffect::gain):
        * platform/audio/Cone.h: Added.
        (WebCore::ConeEffect::setInnerAngle):
        (WebCore::ConeEffect::innerAngle):
        (WebCore::ConeEffect::setOuterAngle):
        (WebCore::ConeEffect::outerAngle):
        (WebCore::ConeEffect::setOuterGain):
        (WebCore::ConeEffect::outerGain):

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

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

index e67aa501f522887659f627ec0d59902584ff316e..1ea67ae185094de4457678a3f8c2f6aff07c3184 100644 (file)
@@ -1,3 +1,24 @@
+2010-08-30  Chris Rogers  <crogers@google.com>
+
+        Reviewed by Kenneth Russell.
+
+        Add audio cone effect files.  The cone effect operates as defined in the OpenAL specification.
+        https://bugs.webkit.org/show_bug.cgi?id=44712
+
+        No new tests since audio API not implemented yet.
+
+        * platform/audio: Added.
+        * platform/audio/Cone.cpp: Added.
+        (WebCore::ConeEffect::ConeEffect):
+        (WebCore::ConeEffect::gain):
+        * platform/audio/Cone.h: Added.
+        (WebCore::ConeEffect::setInnerAngle):
+        (WebCore::ConeEffect::innerAngle):
+        (WebCore::ConeEffect::setOuterAngle):
+        (WebCore::ConeEffect::outerAngle):
+        (WebCore::ConeEffect::setOuterGain):
+        (WebCore::ConeEffect::outerGain):
+
 2010-08-30  Chris Rogers  <crogers@google.com>
 
         Reviewed by Chris Marrin.
diff --git a/WebCore/platform/audio/Cone.cpp b/WebCore/platform/audio/Cone.cpp
new file mode 100644 (file)
index 0000000..91813ab
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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 "Cone.h"
+
+namespace WebCore {
+
+ConeEffect::ConeEffect()
+    : m_innerAngle(360.0)
+    , m_outerAngle(360.0)
+    , m_outerGain(0.0)
+{
+}
+
+double ConeEffect::gain(Vector3 sourcePosition, Vector3 sourceOrientation, Vector3 listenerPosition)
+{
+    if (sourceOrientation.isZero() || ((m_innerAngle == 360.0) && (m_outerAngle == 360.0)))
+        return 1.0; // no cone specified - unity gain
+
+    // Normalized source-listener vector
+    Vector3 sourceToListener = listenerPosition - sourcePosition;
+    sourceToListener.normalize();
+
+    Vector3 normalizedSourceOrientation = sourceOrientation;
+    normalizedSourceOrientation.normalize();
+
+    // Angle between the source orientation vector and the source-listener vector
+    double dotProduct = dot(sourceToListener, normalizedSourceOrientation);
+    double angle = 180.0 * acos(dotProduct) / M_PI;
+    double absAngle = fabs(angle);
+
+    // Divide by 2.0 here since API is entire angle (not half-angle)
+    double absInnerAngle = fabs(m_innerAngle) / 2.0;
+    double absOuterAngle = fabs(m_outerAngle) / 2.0;
+    double gain = 1.0;
+
+    if (absAngle <= absInnerAngle)
+        // No attenuation
+        gain = 1.0;
+    else if (absAngle >= absOuterAngle)
+        // Max attenuation
+        gain = m_outerGain;
+    else {
+        // Between inner and outer cones
+        // inner -> outer, x goes from 0 -> 1
+        double x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle);
+        gain = (1.0 - x) + m_outerGain * x;
+    }
+
+    return gain;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(WEB_AUDIO)
diff --git a/WebCore/platform/audio/Cone.h b/WebCore/platform/audio/Cone.h
new file mode 100644 (file)
index 0000000..9936f28
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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 Cone_h
+#define Cone_h
+
+#include <wtf/Vector3.h>
+
+namespace WebCore {
+
+// Cone gain is defined according to the OpenAL specification
+
+class ConeEffect {
+public:
+    ConeEffect();
+
+    // Returns scalar gain for the given source/listener positions/orientations
+    double gain(Vector3 sourcePosition, Vector3 sourceOrientation, Vector3 listenerPosition);
+
+    // Angles in degrees
+    void setInnerAngle(double innerAngle) { m_innerAngle = innerAngle; }
+    double innerAngle() const { return m_innerAngle; }
+
+    void setOuterAngle(double outerAngle) { m_outerAngle = outerAngle; }
+    double outerAngle() const { return m_outerAngle; }
+
+    void setOuterGain(double outerGain) { m_outerGain = outerGain; }
+    double outerGain() const { return m_outerGain; }
+
+protected:
+    double m_innerAngle;
+    double m_outerAngle;
+    double m_outerGain;
+};
+
+} // namespace WebCore
+
+#endif // Cone_h