Index: Source/modules/webaudio/AsyncAudioDecoder.cpp |
diff --git a/Source/modules/webaudio/AsyncAudioDecoder.cpp b/Source/modules/webaudio/AsyncAudioDecoder.cpp |
index d0b1269634f8adaac7213f46700c56a0fd8b97b3..5385f8d87c8046ff28d7ff713a984dec4870f810 100644 |
--- a/Source/modules/webaudio/AsyncAudioDecoder.cpp |
+++ b/Source/modules/webaudio/AsyncAudioDecoder.cpp |
@@ -26,9 +26,13 @@ |
#if ENABLE(WEB_AUDIO) |
#include "modules/webaudio/AsyncAudioDecoder.h" |
+#include "bindings/core/v8/ScriptPromiseResolver.h" |
#include "core/dom/DOMArrayBuffer.h" |
+#include "core/dom/DOMException.h" |
+#include "core/dom/ExceptionCode.h" |
#include "modules/webaudio/AudioBuffer.h" |
#include "modules/webaudio/AudioBufferCallback.h" |
+#include "modules/webaudio/AudioContext.h" |
#include "platform/Task.h" |
#include "platform/audio/AudioBus.h" |
#include "platform/audio/AudioFileReader.h" |
@@ -48,40 +52,50 @@ AsyncAudioDecoder::~AsyncAudioDecoder() |
{ |
} |
-void AsyncAudioDecoder::decodeAsync(DOMArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback) |
+void AsyncAudioDecoder::decodeAsync(DOMArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, ScriptPromiseResolver* resolver, AudioContext* context) |
{ |
ASSERT(isMainThread()); |
ASSERT(audioData); |
- if (!audioData) |
- return; |
// Add a ref to keep audioData alive until completion of decoding. |
RefPtr<DOMArrayBuffer> audioDataRef(audioData); |
// The leak references to successCallback and errorCallback are picked up on notifyComplete. |
- m_thread->postTask(FROM_HERE, new Task(bind(&AsyncAudioDecoder::decode, audioDataRef.release().leakRef(), sampleRate, successCallback, errorCallback))); |
+ m_thread->postTask(FROM_HERE, new Task(bind(&AsyncAudioDecoder::decode, audioDataRef.release().leakRef(), sampleRate, successCallback, errorCallback, resolver, context))); |
} |
-void AsyncAudioDecoder::decode(DOMArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback) |
+void AsyncAudioDecoder::decode(DOMArrayBuffer* audioData, float sampleRate, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, ScriptPromiseResolver* resolver, AudioContext* context) |
{ |
RefPtr<AudioBus> bus = createBusFromInMemoryAudioFile(audioData->data(), audioData->byteLength(), false, sampleRate); |
// Decoding is finished, but we need to do the callbacks on the main thread. |
// The leaked reference to audioBuffer is picked up in notifyComplete. |
- Platform::current()->mainThread()->postTask(FROM_HERE, bind(&AsyncAudioDecoder::notifyComplete, audioData, successCallback, errorCallback, bus.release().leakRef())); |
+ Platform::current()->mainThread()->postTask(FROM_HERE, bind(&AsyncAudioDecoder::notifyComplete, audioData, successCallback, errorCallback, bus.release().leakRef(), resolver, context)); |
} |
-void AsyncAudioDecoder::notifyComplete(DOMArrayBuffer* audioData, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, AudioBus* audioBus) |
+void AsyncAudioDecoder::notifyComplete(DOMArrayBuffer* audioData, AudioBufferCallback* successCallback, AudioBufferCallback* errorCallback, AudioBus* audioBus, ScriptPromiseResolver* resolver, AudioContext* context) |
{ |
+ ASSERT(isMainThread()); |
+ |
// Adopt references, so everything gets correctly dereffed. |
RefPtr<DOMArrayBuffer> audioDataRef = adoptRef(audioData); |
RefPtr<AudioBus> audioBusRef = adoptRef(audioBus); |
AudioBuffer* audioBuffer = AudioBuffer::createFromAudioBus(audioBus); |
- if (audioBuffer && successCallback) |
- successCallback->handleEvent(audioBuffer); |
- else if (errorCallback) |
- errorCallback->handleEvent(audioBuffer); |
+ if (audioBuffer) { |
+ resolver->resolve(audioBuffer); |
+ if (successCallback) |
+ successCallback->handleEvent(audioBuffer); |
+ } else { |
+ RefPtrWillBeRawPtr<DOMException> error = DOMException::create( |
+ EncodingError, |
+ "Unable to decode audio data"); |
+ resolver->reject(error); |
+ if (errorCallback) |
+ errorCallback->handleEvent(error.get()); |
+ } |
+ // Tell context to remove this resolver since it's been fulfilled. |
+ context->removeAudioDecoderResolver(resolver); |
} |
} // namespace blink |