Index: Source/modules/webaudio/AudioContext.cpp |
diff --git a/Source/modules/webaudio/AudioContext.cpp b/Source/modules/webaudio/AudioContext.cpp |
index 10cd39b14aba6137ffde7f75484dbeada815b602..6e4ddf65add102016812c4947f32b902ee144636 100644 |
--- a/Source/modules/webaudio/AudioContext.cpp |
+++ b/Source/modules/webaudio/AudioContext.cpp |
@@ -110,7 +110,6 @@ AudioContext::AudioContext(Document* document) |
, m_isStopScheduled(false) |
, m_isCleared(false) |
, m_isInitialized(false) |
- , m_isAudioThreadFinished(false) |
, m_destinationNode(nullptr) |
, m_isDeletionScheduled(false) |
, m_automaticPullNodesNeedUpdating(false) |
@@ -119,9 +118,11 @@ AudioContext::AudioContext(Document* document) |
, m_graphOwnerThread(UndefinedThreadIdentifier) |
, m_isOfflineContext(false) |
{ |
+ ScriptWrappable::init(this); |
+ |
m_destinationNode = DefaultAudioDestinationNode::create(this); |
- constructCommon(); |
+ initialize(); |
} |
// Constructor for offline (non-realtime) rendering. |
@@ -130,7 +131,6 @@ AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t |
, m_isStopScheduled(false) |
, m_isCleared(false) |
, m_isInitialized(false) |
- , m_isAudioThreadFinished(false) |
, m_destinationNode(nullptr) |
, m_automaticPullNodesNeedUpdating(false) |
, m_connectionCount(0) |
@@ -138,22 +138,13 @@ AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t |
, m_graphOwnerThread(UndefinedThreadIdentifier) |
, m_isOfflineContext(true) |
{ |
+ ScriptWrappable::init(this); |
+ |
// Create a new destination for offline rendering. |
m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate); |
if (m_renderTarget.get()) |
m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTarget.get()); |
- constructCommon(); |
-} |
- |
-void AudioContext::constructCommon() |
-{ |
- ScriptWrappable::init(this); |
- |
- FFTFrame::initialize(); |
- |
- m_listener = AudioListener::create(); |
- |
initialize(); |
} |
@@ -175,27 +166,25 @@ AudioContext::~AudioContext() |
void AudioContext::initialize() |
{ |
- if (!m_isInitialized) { |
- // Don't allow the context to initialize a second time after it's already been explicitly uninitialized. |
- ASSERT(!m_isAudioThreadFinished); |
- if (!m_isAudioThreadFinished) { |
- // Creation of a destination node should not start the audio HW. The |
- // creation of any other AudioNode will initialize the audio HW and start processing |
- if (m_destinationNode.get()) { |
- m_destinationNode->initialize(); |
- |
- if (!isOfflineContext()) { |
- // This starts the audio thread. The destination node's provideInput() method will now be called repeatedly to render audio. |
- // Each time provideInput() is called, a portion of the audio stream is rendered. Let's call this time period a "render quantum". |
- // NOTE: for now default AudioContext does not need an explicit startRendering() call from JavaScript. |
- // We may want to consider requiring it for symmetry with OfflineAudioContext. |
- m_destinationNode->startRendering(); |
- ++s_hardwareContextCount; |
- } |
- |
- m_isInitialized = true; |
- } |
+ if (isInitialized()) |
+ return; |
+ |
+ FFTFrame::initialize(); |
+ m_listener = AudioListener::create(); |
+ |
+ if (m_destinationNode.get()) { |
+ m_destinationNode->initialize(); |
+ |
+ if (!isOfflineContext()) { |
+ // This starts the audio thread. The destination node's provideInput() method will now be called repeatedly to render audio. |
+ // Each time provideInput() is called, a portion of the audio stream is rendered. Let's call this time period a "render quantum". |
+ // NOTE: for now default AudioContext does not need an explicit startRendering() call from JavaScript. |
+ // We may want to consider requiring it for symmetry with OfflineAudioContext. |
+ m_destinationNode->startRendering(); |
+ ++s_hardwareContextCount; |
} |
+ |
+ m_isInitialized = true; |
} |
} |
@@ -219,15 +208,12 @@ void AudioContext::uninitialize() |
{ |
ASSERT(isMainThread()); |
- if (!m_isInitialized) |
+ if (!isInitialized()) |
return; |
// This stops the audio thread and all audio rendering. |
m_destinationNode->uninitialize(); |
- // Don't allow the context to initialize a second time after it's already been explicitly uninitialized. |
- m_isAudioThreadFinished = true; |
- |
if (!isOfflineContext()) { |
ASSERT(s_hardwareContextCount); |
--s_hardwareContextCount; |
@@ -239,11 +225,6 @@ void AudioContext::uninitialize() |
m_isInitialized = false; |
} |
-bool AudioContext::isInitialized() const |
-{ |
- return m_isInitialized; |
-} |
- |
void AudioContext::stopDispatch(void* userData) |
{ |
AudioContext* context = reinterpret_cast<AudioContext*>(userData); |
@@ -593,7 +574,7 @@ void AudioContext::notifyNodeFinishedProcessing(AudioNode* node) |
void AudioContext::derefFinishedSourceNodes() |
{ |
ASSERT(isGraphOwner()); |
- ASSERT(isAudioThread() || isAudioThreadFinished()); |
+ ASSERT(isAudioThread()); |
for (unsigned i = 0; i < m_finishedNodes.size(); i++) |
derefNode(m_finishedNodes[i]); |
@@ -625,7 +606,7 @@ void AudioContext::derefNode(AudioNode* node) |
void AudioContext::derefUnfinishedSourceNodes() |
{ |
- ASSERT(isMainThread() && isAudioThreadFinished()); |
+ ASSERT(isMainThread()); |
for (unsigned i = 0; i < m_referencedNodes.size(); ++i) |
m_referencedNodes[i]->deref(AudioNode::RefTypeConnection); |
@@ -656,7 +637,7 @@ bool AudioContext::tryLock(bool& mustReleaseLock) |
bool isAudioThread = thisThread == audioThread(); |
// Try to catch cases of using try lock on main thread - it should use regular lock. |
- ASSERT(isAudioThread || isAudioThreadFinished()); |
+ ASSERT(isAudioThread); |
if (!isAudioThread) { |
// In release build treat tryLock() as lock() (since above ASSERT(isAudioThread) never fires) - this is the best we can do. |
@@ -771,7 +752,7 @@ void AudioContext::markForDeletion(AudioNode* node) |
{ |
ASSERT(isGraphOwner()); |
- if (isAudioThreadFinished()) |
+ if (!isInitialized()) |
m_nodesToDelete.append(node); |
else |
m_nodesMarkedForDeletion.append(node); |
@@ -785,7 +766,7 @@ void AudioContext::markForDeletion(AudioNode* node) |
void AudioContext::scheduleNodeDeletion() |
{ |
- bool isGood = m_isInitialized && isGraphOwner(); |
+ bool isGood = isInitialized() && isGraphOwner(); |
ASSERT(isGood); |
if (!isGood) |
return; |