WebAudio: Use float instead of double values for gain operations.
authorjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Jan 2012 22:42:46 +0000 (22:42 +0000)
committerjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Jan 2012 22:42:46 +0000 (22:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=74345

Reviewed by Sam Weinig.

No new tests; optimization of existing code, so covered by existing test cases.

The following functions now take or operate on floats instead of doubles:
(WebCore::AudioBus::scale):
(WebCore::AudioBus::processWithGainFrom):
(WebCore::AudioBus::copyWithGainFrom):
(WebCore::AudioBus::sumWithGainFrom):
* platform/audio/AudioBus.h:
(WebCore::AudioBus::setGain):
(WebCore::AudioBus::gain):
* platform/audio/AudioChannel.cpp:
(WebCore::AudioChannel::scale):
* platform/audio/AudioChannel.h:
* webaudio/AudioBufferSourceNode.cpp:
(WebCore::AudioBufferSourceNode::process):
* webaudio/AudioBufferSourceNode.h:
* webaudio/AudioGainNode.h:
* webaudio/AudioPannerNode.h:

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

Source/WebCore/ChangeLog
Source/WebCore/platform/audio/AudioBus.cpp
Source/WebCore/platform/audio/AudioBus.h
Source/WebCore/platform/audio/AudioChannel.cpp
Source/WebCore/platform/audio/AudioChannel.h
Source/WebCore/webaudio/AudioBufferSourceNode.cpp
Source/WebCore/webaudio/AudioBufferSourceNode.h
Source/WebCore/webaudio/AudioGainNode.h
Source/WebCore/webaudio/AudioPannerNode.h

index d4cf1562d0c2a65add2157c14316fb431c5556ef..6671f5b5da6308d115bb6969e1caa4c9455ed34a 100644 (file)
@@ -1,3 +1,29 @@
+2011-01-13  Jer Noble  <jer.noble@apple.com>
+
+        WebAudio: Use float instead of double values for gain operations.
+        https://bugs.webkit.org/show_bug.cgi?id=74345
+
+        Reviewed by Sam Weinig.
+
+        No new tests; optimization of existing code, so covered by existing test cases.
+
+        The following functions now take or operate on floats instead of doubles:
+        (WebCore::AudioBus::scale):
+        (WebCore::AudioBus::processWithGainFrom):
+        (WebCore::AudioBus::copyWithGainFrom):
+        (WebCore::AudioBus::sumWithGainFrom):
+        * platform/audio/AudioBus.h:
+        (WebCore::AudioBus::setGain):
+        (WebCore::AudioBus::gain):
+        * platform/audio/AudioChannel.cpp:
+        (WebCore::AudioChannel::scale):
+        * platform/audio/AudioChannel.h:
+        * webaudio/AudioBufferSourceNode.cpp:
+        (WebCore::AudioBufferSourceNode::process):
+        * webaudio/AudioBufferSourceNode.h:
+        * webaudio/AudioGainNode.h:
+        * webaudio/AudioPannerNode.h:
+
 2012-01-13  Greg Billock  <gbillock@google.com>
 
         Don't use pending activity notification in IntentRequest
index df9eff6a19e8cb7d8a90f64e3caca6664b8ecc68..30489baa751e1343d6729af468b69258c70a7cac 100644 (file)
@@ -183,7 +183,7 @@ void AudioBus::normalize()
         scale(1.0f / max);
 }
 
-void AudioBus::scale(double scale)
+void AudioBus::scale(float scale)
 {
     for (unsigned i = 0; i < numberOfChannels(); ++i)
         channel(i)->scale(scale);
@@ -326,12 +326,10 @@ void AudioBus::sumFrom(const AudioBus &sourceBus)
         vsmul(sourceL, 1, &gain, destinationL, 1, framesToProcess - k); \
     } 
 
-void AudioBus::processWithGainFromMonoStereo(const AudioBus &sourceBus, double* lastMixGain, double targetGain, bool sumToBus)
+void AudioBus::processWithGainFromMonoStereo(const AudioBus &sourceBus, float* lastMixGain, float targetGain, bool sumToBus)
 {
     // We don't want to suddenly change the gain from mixing one time slice to the next,
     // so we "de-zipper" by slowly changing the gain each sample-frame until we've achieved the target gain.
-
-    // FIXME: targetGain and lastMixGain should be changed to floats instead of doubles.
     
     // Take master bus gain into account as well as the targetGain.
     float totalDesiredGain = static_cast<float>(m_busGain * targetGain);
@@ -394,10 +392,10 @@ void AudioBus::processWithGainFromMonoStereo(const AudioBus &sourceBus, double*
     }
 
     // Save the target gain as the starting point for next time around.
-    *lastMixGain = static_cast<double>(gain);
+    *lastMixGain = gain;
 }
 
-void AudioBus::processWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain, bool sumToBus)
+void AudioBus::processWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain, bool sumToBus)
 {
     // Make sure we're summing from same type of bus.
     // We *are* able to sum from mono -> stereo
@@ -444,12 +442,12 @@ void AudioBus::copyWithSampleAccurateGainValuesFrom(const AudioBus &sourceBus, f
     }
 }
 
-void AudioBus::copyWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain)
+void AudioBus::copyWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain)
 {
     processWithGainFrom(sourceBus, lastMixGain, targetGain, false);
 }
 
-void AudioBus::sumWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain)
+void AudioBus::sumWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain)
 {
     processWithGainFrom(sourceBus, lastMixGain, targetGain, true);
 }
index 2255beb52aac4ece52915a2aaa5209fc2af8a583..6370c8b52346147ca870c31e53cc7acd45873bfc 100644 (file)
@@ -100,11 +100,11 @@ public:
     static PassOwnPtr<AudioBus> createByMixingToMono(AudioBus* sourceBus);
 
     // Scales all samples by the same amount.
-    void scale(double scale);
+    void scale(float scale);
 
     // Master gain for this bus - used with sumWithGainFrom() below
-    void setGain(double gain) { m_busGain = gain; }
-    double gain() { return m_busGain; }
+    void setGain(float gain) { m_busGain = gain; }
+    float gain() { return m_busGain; }
 
     void reset() { m_isFirstTime = true; } // for de-zippering
 
@@ -119,8 +119,8 @@ public:
     // We scale by targetGain (and our own internal gain m_busGain), performing "de-zippering" to smoothly change from *lastMixGain to (targetGain*m_busGain).
     // The caller is responsible for setting up lastMixGain to point to storage which is unique for every "stream" which will be summed to this bus.
     // This represents the dezippering memory.
-    void copyWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain);
-    void sumWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain);
+    void copyWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain);
+    void sumWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain);
 
     // Copies the sourceBus by scaling with sample-accurate gain values.
     void copyWithSampleAccurateGainValuesFrom(const AudioBus &sourceBus, float* gainValues, unsigned numberOfGainValues);
@@ -136,8 +136,8 @@ public:
 protected:
     AudioBus() { };
 
-    void processWithGainFrom(const AudioBus &sourceBus, double* lastMixGain, double targetGain, bool sumToBus);
-    void processWithGainFromMonoStereo(const AudioBus &sourceBus, double* lastMixGain, double targetGain, bool sumToBus);
+    void processWithGainFrom(const AudioBus &sourceBus, float* lastMixGain, float targetGain, bool sumToBus);
+    void processWithGainFromMonoStereo(const AudioBus &sourceBus, float* lastMixGain, float targetGain, bool sumToBus);
 
     size_t m_length;
 
@@ -145,7 +145,7 @@ protected:
 
     int m_layout;
 
-    double m_busGain;
+    float m_busGain;
     bool m_isFirstTime;
     float m_sampleRate; // 0.0 if unknown or N/A
 };
index a962debd57260c43ec26020a6c2876c9743a64b8..39daff966fe197f2c5e19686aea3013a08144643 100644 (file)
@@ -41,10 +41,9 @@ namespace WebCore {
 
 using namespace VectorMath;
 
-void AudioChannel::scale(double scale)
+void AudioChannel::scale(float scale)
 {
-    float s = static_cast<float>(scale);
-    vsmul(data(), 1, &s, data(), 1, length());
+    vsmul(data(), 1, &scale, data(), 1, length());
 }
 
 void AudioChannel::copyFrom(const AudioChannel* sourceChannel)
index 7325e9f38bb43ebbfdb0d69dda75da64239fd7e6..8803e75cd1e3f7ae22a50869f61e8dd45dbbd4cc 100644 (file)
@@ -86,7 +86,7 @@ public:
     }
 
     // Scales all samples by the same amount.
-    void scale(double scale);
+    void scale(float scale);
 
     // A simple memcpy() from the source channel
     void copyFrom(const AudioChannel* sourceChannel);
index c8a13229552c2faa551afb5bd416d00520742b3d..1fd2f384826e7a389d2f6204ea54216a7f2f21b1 100644 (file)
@@ -128,7 +128,7 @@ void AudioBufferSourceNode::process(size_t framesToProcess)
         renderFromBuffer(outputBus, quantumFrameOffset, bufferFramesToProcess);
 
         // Apply the gain (in-place) to the output bus.
-        double totalGain = gain()->value() * m_buffer->gain();
+        float totalGain = gain()->value() * m_buffer->gain();
         outputBus->copyWithGainFrom(*outputBus, &m_lastGain, totalGain);
 
         // If the end time is somewhere in the middle of this time quantum, then simply zero out the
index 777ba89e37f39eddbc058116f3e2d2b9c38ff256..49091c017b36d12ce2b5e43ab7be82caf4835f4b 100644 (file)
@@ -129,7 +129,7 @@ private:
     double totalPitchRate();
 
     // m_lastGain provides continuity when we dynamically adjust the gain.
-    double m_lastGain;
+    float m_lastGain;
     
     // We optionally keep track of a panner node which has a doppler shift that is incorporated into the pitch rate.
     RefPtr<AudioPannerNode> m_pannerNode;
index e6342128c77994bbd48d20d6f187b28d579194e2..415b06b8dcc547484dc6704ec9ad2d36b11c9096 100644 (file)
@@ -57,7 +57,7 @@ public:
 private:
     AudioGainNode(AudioContext*, float sampleRate);
 
-    double m_lastGain; // for de-zippering
+    float m_lastGain; // for de-zippering
     RefPtr<AudioGain> m_gain;
 
     AudioFloatArray m_sampleAccurateGainValues;
index 6ecebeaae31ca7dac38579f1d5a035de3722cf11..98d27743e4117943b26878e67ecd71e3964bdc4a 100644 (file)
@@ -138,7 +138,7 @@ private:
     RefPtr<AudioGain> m_coneGain;
     DistanceEffect m_distanceEffect;
     ConeEffect m_coneEffect;
-    double m_lastGain;
+    float m_lastGain;
 
     unsigned m_connectionCount;
 };