| Index: Source/modules/webaudio/AudioContext.cpp
|
| diff --git a/Source/modules/webaudio/AudioContext.cpp b/Source/modules/webaudio/AudioContext.cpp
|
| index e4fd7b7dee28250b02e6a236100dc514e36243b3..306485e48560889c5626c5c53bb6a3836b9f377e 100644
|
| --- a/Source/modules/webaudio/AudioContext.cpp
|
| +++ b/Source/modules/webaudio/AudioContext.cpp
|
| @@ -115,7 +115,6 @@
|
| , m_isOfflineContext(false)
|
| , m_contextState(Suspended)
|
| , m_cachedSampleFrame(0)
|
| - , m_closedContextSampleRate(-1)
|
| {
|
| m_didInitializeContextGraphMutex = true;
|
| m_destinationNode = DefaultAudioDestinationNode::create(this);
|
| @@ -137,7 +136,6 @@
|
| , m_isOfflineContext(true)
|
| , m_contextState(Suspended)
|
| , m_cachedSampleFrame(0)
|
| - , m_closedContextSampleRate(-1)
|
| {
|
| m_didInitializeContextGraphMutex = true;
|
| // Create a new destination for offline rendering.
|
| @@ -154,14 +152,12 @@
|
| fprintf(stderr, "%p: AudioContext::~AudioContext(): %u\n", this, m_contextId);
|
| #endif
|
| // AudioNodes keep a reference to their context, so there should be no way to be in the destructor if there are still AudioNodes around.
|
| -
|
| ASSERT(!m_isInitialized);
|
| ASSERT(!m_referencedNodes.size());
|
| ASSERT(!m_finishedNodes.size());
|
| ASSERT(!m_suspendResolvers.size());
|
| ASSERT(!m_isResolvingResumePromises);
|
| ASSERT(!m_resumeResolvers.size());
|
| - ASSERT(!m_audioDecoderResolvers.size());
|
| }
|
|
|
| void AudioContext::initialize()
|
| @@ -237,14 +233,6 @@
|
| ASSERT(m_listener);
|
| m_listener->waitForHRTFDatabaseLoaderThreadCompletion();
|
|
|
| - // Reject any decodeAudioData promises that haven't been fulfilled yet.
|
| - for (auto& resolver : m_audioDecoderResolvers) {
|
| - resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away"));
|
| - }
|
| - m_audioDecoderResolvers.clear();
|
| -
|
| - // Uninitialization done, so clear flags to indicate that the AudioContext has no pending
|
| - // activity anymore.
|
| clear();
|
| }
|
|
|
| @@ -281,30 +269,20 @@
|
| return AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate, exceptionState);
|
| }
|
|
|
| -ScriptPromise AudioContext::decodeAudioData(ScriptState* scriptState, DOMArrayBuffer* audioData, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, ExceptionState& exceptionState)
|
| -{
|
| +void AudioContext::decodeAudioData(DOMArrayBuffer* audioData, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, ExceptionState& exceptionState)
|
| +{
|
| + if (isContextClosed()) {
|
| + throwExceptionForClosedState(exceptionState);
|
| + return;
|
| + }
|
| +
|
| if (!audioData) {
|
| - RefPtrWillBeRawPtr<DOMException> error = DOMException::create(
|
| - NotSupportedError,
|
| + exceptionState.throwDOMException(
|
| + SyntaxError,
|
| "invalid ArrayBuffer for audioData.");
|
| - if (errorCallback) {
|
| - errorCallback->handleEvent(error.get());
|
| - }
|
| - return ScriptPromise::rejectWithDOMException(scriptState, error);
|
| - }
|
| -
|
| - RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
|
| - ScriptPromise promise = resolver->promise();
|
| -
|
| - m_audioDecoderResolvers.append(resolver);
|
| -
|
| - float rate = isContextClosed() ? m_closedContextSampleRate : sampleRate();
|
| -
|
| - ASSERT(rate > 0);
|
| -
|
| - m_audioDecoder.decodeAsync(audioData, rate, successCallback, errorCallback, resolver.get(), this);
|
| -
|
| - return promise;
|
| + return;
|
| + }
|
| + m_audioDecoder.decodeAsync(audioData, sampleRate(), successCallback, errorCallback);
|
| }
|
|
|
| AudioBufferSourceNode* AudioContext::createBufferSource(ExceptionState& exceptionState)
|
| @@ -934,19 +912,6 @@
|
| }
|
| }
|
| }
|
| -
|
| -void AudioContext::removeAudioDecoderResolver(ScriptPromiseResolver* resolver)
|
| -{
|
| - ASSERT(isMainThread());
|
| -
|
| - for (size_t k = 0; k < m_audioDecoderResolvers.size(); ++k) {
|
| - if (resolver == m_audioDecoderResolvers.at(k)) {
|
| - m_audioDecoderResolvers.remove(k);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| void AudioContext::handlePreRenderTasks()
|
| {
|
| ASSERT(isAudioThread());
|
| @@ -1164,7 +1129,8 @@
|
| {
|
| ASSERT(isMainThread());
|
|
|
| - // Audio context is closing down so reject any promises that are still pending.
|
| + // Audio context is closing down so reject any suspend or resume promises that are still
|
| + // pending.
|
|
|
| for (auto& resolver : m_suspendResolvers) {
|
| resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away"));
|
| @@ -1238,7 +1204,6 @@
|
|
|
| DEFINE_TRACE(AudioContext)
|
| {
|
| - visitor->trace(m_audioDecoderResolvers);
|
| visitor->trace(m_closeResolver);
|
| visitor->trace(m_offlineResolver);
|
| visitor->trace(m_renderTarget);
|
| @@ -1306,9 +1271,6 @@
|
| "Cannot close a context that is being closed or has already been closed."));
|
| }
|
|
|
| - // Save the current sample rate for any subsequent decodeAudioData calls.
|
| - m_closedContextSampleRate = sampleRate();
|
| -
|
| m_closeResolver = ScriptPromiseResolver::create(scriptState);
|
| ScriptPromise promise = m_closeResolver->promise();
|
|
|
|
|