summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/webaudio/OscillatorNode.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/webaudio/OscillatorNode.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/Modules/webaudio/OscillatorNode.cpp')
-rw-r--r--Source/WebCore/Modules/webaudio/OscillatorNode.cpp114
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