diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/webaudio/OscillatorNode.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/Modules/webaudio/OscillatorNode.cpp')
-rw-r--r-- | Source/WebCore/Modules/webaudio/OscillatorNode.cpp | 114 |
1 files changed, 37 insertions, 77 deletions
diff --git a/Source/WebCore/Modules/webaudio/OscillatorNode.cpp b/Source/WebCore/Modules/webaudio/OscillatorNode.cpp index 070dc9e1f..d38f9f3c6 100644 --- a/Source/WebCore/Modules/webaudio/OscillatorNode.cpp +++ b/Source/WebCore/Modules/webaudio/OscillatorNode.cpp @@ -28,32 +28,27 @@ #include "OscillatorNode.h" -#include "AudioContext.h" #include "AudioNodeOutput.h" -#include "AudioUtilities.h" -#include "ExceptionCode.h" +#include "AudioParam.h" #include "PeriodicWave.h" #include "VectorMath.h" -#include <algorithm> -#include <wtf/MathExtras.h> namespace WebCore { using namespace VectorMath; -PeriodicWave* OscillatorNode::s_periodicWaveSine = 0; -PeriodicWave* OscillatorNode::s_periodicWaveSquare = 0; -PeriodicWave* OscillatorNode::s_periodicWaveSawtooth = 0; -PeriodicWave* OscillatorNode::s_periodicWaveTriangle = 0; +PeriodicWave* OscillatorNode::s_periodicWaveSine = nullptr; +PeriodicWave* OscillatorNode::s_periodicWaveSquare = nullptr; +PeriodicWave* OscillatorNode::s_periodicWaveSawtooth = nullptr; +PeriodicWave* OscillatorNode::s_periodicWaveTriangle = nullptr; -PassRefPtr<OscillatorNode> OscillatorNode::create(AudioContext* context, float sampleRate) +Ref<OscillatorNode> OscillatorNode::create(AudioContext& context, float sampleRate) { - return adoptRef(new OscillatorNode(context, sampleRate)); + return adoptRef(*new OscillatorNode(context, sampleRate)); } -OscillatorNode::OscillatorNode(AudioContext* context, float sampleRate) +OscillatorNode::OscillatorNode(AudioContext& context, float sampleRate) : AudioScheduledSourceNode(context, sampleRate) - , m_type(SINE) , m_firstRender(true) , m_virtualReadIndex(0) , m_phaseIncrements(AudioNode::ProcessingSizeInFrames) @@ -80,75 +75,41 @@ OscillatorNode::~OscillatorNode() uninitialize(); } -String OscillatorNode::type() const +ExceptionOr<void> OscillatorNode::setType(Type type) { - switch (m_type) { - case SINE: - return "sine"; - case SQUARE: - return "square"; - case SAWTOOTH: - return "sawtooth"; - case TRIANGLE: - return "triangle"; - case CUSTOM: - return "custom"; - default: - ASSERT_NOT_REACHED(); - return "custom"; - } -} - -void OscillatorNode::setType(const String& type) -{ - if (type == "sine") - setType(SINE); - else if (type == "square") - setType(SQUARE); - else if (type == "sawtooth") - setType(SAWTOOTH); - else if (type == "triangle") - setType(TRIANGLE); - else - ASSERT_NOT_REACHED(); -} - -bool OscillatorNode::setType(unsigned type) -{ - PeriodicWave* periodicWave = 0; - float sampleRate = this->sampleRate(); + PeriodicWave* periodicWave = nullptr; switch (type) { - case SINE: + case Type::Sine: if (!s_periodicWaveSine) - s_periodicWaveSine = PeriodicWave::createSine(sampleRate).leakRef(); + s_periodicWaveSine = &PeriodicWave::createSine(sampleRate()).leakRef(); periodicWave = s_periodicWaveSine; break; - case SQUARE: + case Type::Square: if (!s_periodicWaveSquare) - s_periodicWaveSquare = PeriodicWave::createSquare(sampleRate).leakRef(); + s_periodicWaveSquare = &PeriodicWave::createSquare(sampleRate()).leakRef(); periodicWave = s_periodicWaveSquare; break; - case SAWTOOTH: + case Type::Sawtooth: if (!s_periodicWaveSawtooth) - s_periodicWaveSawtooth = PeriodicWave::createSawtooth(sampleRate).leakRef(); + s_periodicWaveSawtooth = &PeriodicWave::createSawtooth(sampleRate()).leakRef(); periodicWave = s_periodicWaveSawtooth; break; - case TRIANGLE: + case Type::Triangle: if (!s_periodicWaveTriangle) - s_periodicWaveTriangle = PeriodicWave::createTriangle(sampleRate).leakRef(); + s_periodicWaveTriangle = &PeriodicWave::createTriangle(sampleRate()).leakRef(); periodicWave = s_periodicWaveTriangle; break; - case CUSTOM: - default: - // Return error for invalid types, including CUSTOM since setPeriodicWave() method must be - // called explicitly. - return false; + case Type::Custom: + if (m_type != Type::Custom) + return Exception { INVALID_STATE_ERR }; + return { }; } setPeriodicWave(periodicWave); m_type = type; - return true; + + return { }; } bool OscillatorNode::calculateSampleAccuratePhaseIncrements(size_t framesToProcess) @@ -219,10 +180,10 @@ bool OscillatorNode::calculateSampleAccuratePhaseIncrements(size_t framesToProce void OscillatorNode::process(size_t framesToProcess) { - AudioBus* outputBus = output(0)->bus(); + auto& outputBus = *output(0)->bus(); - if (!isInitialized() || !outputBus->numberOfChannels()) { - outputBus->zero(); + if (!isInitialized() || !outputBus.numberOfChannels()) { + outputBus.zero(); return; } @@ -231,33 +192,32 @@ void OscillatorNode::process(size_t framesToProcess) return; // The audio thread can't block on this lock, so we use std::try_to_lock instead. - std::unique_lock<std::mutex> lock(m_processMutex, std::try_to_lock); + std::unique_lock<Lock> lock(m_processMutex, std::try_to_lock); if (!lock.owns_lock()) { // Too bad - the try_lock() failed. We must be in the middle of changing wave-tables. - outputBus->zero(); + outputBus.zero(); return; } // We must access m_periodicWave only inside the lock. if (!m_periodicWave.get()) { - outputBus->zero(); + outputBus.zero(); return; } size_t quantumFrameOffset; size_t nonSilentFramesToProcess; - updateSchedulingInfo(framesToProcess, outputBus, quantumFrameOffset, nonSilentFramesToProcess); if (!nonSilentFramesToProcess) { - outputBus->zero(); + outputBus.zero(); return; } unsigned periodicWaveSize = m_periodicWave->periodicWaveSize(); double invPeriodicWaveSize = 1.0 / periodicWaveSize; - float* destP = outputBus->channel(0)->mutableData(); + float* destP = outputBus.channel(0)->mutableData(); ASSERT(quantumFrameOffset <= framesToProcess); @@ -269,8 +229,8 @@ void OscillatorNode::process(size_t framesToProcess) bool hasSampleAccurateValues = calculateSampleAccuratePhaseIncrements(framesToProcess); float frequency = 0; - float* higherWaveData = 0; - float* lowerWaveData = 0; + float* higherWaveData = nullptr; + float* lowerWaveData = nullptr; float tableInterpolationFactor; if (!hasSampleAccurateValues) { @@ -327,7 +287,7 @@ void OscillatorNode::process(size_t framesToProcess) m_virtualReadIndex = virtualReadIndex; - outputBus->clearSilentFlag(); + outputBus.clearSilentFlag(); } void OscillatorNode::reset() @@ -340,9 +300,9 @@ void OscillatorNode::setPeriodicWave(PeriodicWave* periodicWave) ASSERT(isMainThread()); // This synchronizes with process(). - std::lock_guard<std::mutex> lock(m_processMutex); + std::lock_guard<Lock> lock(m_processMutex); m_periodicWave = periodicWave; - m_type = CUSTOM; + m_type = Type::Custom; } bool OscillatorNode::propagatesSilence() const |