Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / webaudio / OscillatorNode.cpp
index 8c9f40b..aba283e 100644 (file)
 #include "modules/webaudio/AudioContext.h"
 #include "modules/webaudio/AudioNodeOutput.h"
 #include "modules/webaudio/PeriodicWave.h"
-#include <algorithm>
 #include "wtf/MathExtras.h"
+#include "wtf/StdLibExtras.h"
+#include <algorithm>
 
-using namespace std;
-
-namespace WebCore {
+namespace blink {
 
 using namespace VectorMath;
 
-PeriodicWave* OscillatorNode::s_periodicWaveSine = 0;
-PeriodicWave* OscillatorNode::s_periodicWaveSquare = 0;
-PeriodicWave* OscillatorNode::s_periodicWaveSawtooth = 0;
-PeriodicWave* OscillatorNode::s_periodicWaveTriangle = 0;
-
-PassRefPtr<OscillatorNode> OscillatorNode::create(AudioContext* context, float sampleRate)
+OscillatorNode* OscillatorNode::create(AudioContext* context, float sampleRate)
 {
-    return adoptRef(new OscillatorNode(context, sampleRate));
+    return new OscillatorNode(context, sampleRate);
 }
 
 OscillatorNode::OscillatorNode(AudioContext* context, float sampleRate)
@@ -60,26 +54,31 @@ OscillatorNode::OscillatorNode(AudioContext* context, float sampleRate)
     , m_phaseIncrements(AudioNode::ProcessingSizeInFrames)
     , m_detuneValues(AudioNode::ProcessingSizeInFrames)
 {
-    ScriptWrappable::init(this);
     setNodeType(NodeTypeOscillator);
 
     // Use musical pitch standard A440 as a default.
-    m_frequency = AudioParam::create(context, "frequency", 440, 0, 100000);
+    m_frequency = AudioParam::create(context, 440);
     // Default to no detuning.
-    m_detune = AudioParam::create(context, "detune", 0, -4800, 4800);
+    m_detune = AudioParam::create(context, 0);
 
     // Sets up default wavetable.
     setType(m_type);
 
     // An oscillator is always mono.
-    addOutput(adoptPtr(new AudioNodeOutput(this, 1)));
+    addOutput(AudioNodeOutput::create(this, 1));
 
     initialize();
 }
 
 OscillatorNode::~OscillatorNode()
 {
+    ASSERT(!isInitialized());
+}
+
+void OscillatorNode::dispose()
+{
     uninitialize();
+    AudioScheduledSourceNode::dispose();
 }
 
 String OscillatorNode::type() const
@@ -111,8 +110,6 @@ void OscillatorNode::setType(const String& type)
         setType(SAWTOOTH);
     else if (type == "triangle")
         setType(TRIANGLE);
-    else
-        ASSERT_NOT_REACHED();
 }
 
 bool OscillatorNode::setType(unsigned type)
@@ -121,26 +118,26 @@ bool OscillatorNode::setType(unsigned type)
     float sampleRate = this->sampleRate();
 
     switch (type) {
-    case SINE:
-        if (!s_periodicWaveSine)
-            s_periodicWaveSine = PeriodicWave::createSine(sampleRate).leakRef();
-        periodicWave = s_periodicWaveSine;
+    case SINE: {
+        DEFINE_STATIC_LOCAL(Persistent<PeriodicWave>, periodicWaveSine, (PeriodicWave::createSine(sampleRate)));
+        periodicWave = periodicWaveSine;
         break;
-    case SQUARE:
-        if (!s_periodicWaveSquare)
-            s_periodicWaveSquare = PeriodicWave::createSquare(sampleRate).leakRef();
-        periodicWave = s_periodicWaveSquare;
+    }
+    case SQUARE: {
+        DEFINE_STATIC_LOCAL(Persistent<PeriodicWave>, periodicWaveSquare, (PeriodicWave::createSquare(sampleRate)));
+        periodicWave = periodicWaveSquare;
         break;
-    case SAWTOOTH:
-        if (!s_periodicWaveSawtooth)
-            s_periodicWaveSawtooth = PeriodicWave::createSawtooth(sampleRate).leakRef();
-        periodicWave = s_periodicWaveSawtooth;
+    }
+    case SAWTOOTH: {
+        DEFINE_STATIC_LOCAL(Persistent<PeriodicWave>, periodicWaveSawtooth, (PeriodicWave::createSawtooth(sampleRate)));
+        periodicWave = periodicWaveSawtooth;
         break;
-    case TRIANGLE:
-        if (!s_periodicWaveTriangle)
-            s_periodicWaveTriangle = PeriodicWave::createTriangle(sampleRate).leakRef();
-        periodicWave = s_periodicWaveTriangle;
+    }
+    case TRIANGLE: {
+        DEFINE_STATIC_LOCAL(Persistent<PeriodicWave>, periodicWaveTriangle, (PeriodicWave::createTriangle(sampleRate)));
+        periodicWave = periodicWaveTriangle;
         break;
+    }
     case CUSTOM:
     default:
         // Return error for invalid types, including CUSTOM since setPeriodicWave() method must be
@@ -273,7 +270,7 @@ void OscillatorNode::process(size_t framesToProcess)
     float frequency = 0;
     float* higherWaveData = 0;
     float* lowerWaveData = 0;
-    float tableInterpolationFactor;
+    float tableInterpolationFactor = 0;
 
     if (!hasSampleAccurateValues) {
         frequency = m_frequency->smoothedValue();
@@ -332,11 +329,6 @@ void OscillatorNode::process(size_t framesToProcess)
     outputBus->clearSilentFlag();
 }
 
-void OscillatorNode::reset()
-{
-    m_virtualReadIndex = 0;
-}
-
 void OscillatorNode::setPeriodicWave(PeriodicWave* periodicWave)
 {
     ASSERT(isMainThread());
@@ -352,6 +344,14 @@ bool OscillatorNode::propagatesSilence() const
     return !isPlayingOrScheduled() || hasFinished() || !m_periodicWave.get();
 }
 
-} // namespace WebCore
+void OscillatorNode::trace(Visitor* visitor)
+{
+    visitor->trace(m_frequency);
+    visitor->trace(m_detune);
+    visitor->trace(m_periodicWave);
+    AudioScheduledSourceNode::trace(visitor);
+}
+
+} // namespace blink
 
 #endif // ENABLE(WEB_AUDIO)