Index: Source/modules/webaudio/OfflineAudioContext.cpp |
diff --git a/Source/modules/webaudio/OfflineAudioContext.cpp b/Source/modules/webaudio/OfflineAudioContext.cpp |
index d3488419e947e373d50f13cb105be0fb0604d178..629b853e6205e569b79fe61b281bdc2cf2acd59f 100644 |
--- a/Source/modules/webaudio/OfflineAudioContext.cpp |
+++ b/Source/modules/webaudio/OfflineAudioContext.cpp |
@@ -31,7 +31,10 @@ |
#include "core/dom/Document.h" |
#include "core/dom/ExceptionCode.h" |
#include "core/dom/ExecutionContext.h" |
+#include "modules/webaudio/OfflineAudioDestinationNode.h" |
+#include "platform/ThreadSafeFunctional.h" |
#include "platform/audio/AudioUtilities.h" |
+#include "public/platform/Platform.h" |
namespace blink { |
@@ -92,6 +95,8 @@ OfflineAudioContext* OfflineAudioContext::create(ExecutionContext* context, unsi |
OfflineAudioContext::OfflineAudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) |
: AudioContext(document, numberOfChannels, numberOfFrames, sampleRate) |
+ , m_isSuspendScheduled(false) |
+ , m_suspendTime(-0.0) |
Raymond Toy
2015/05/13 17:16:08
Why -0.0? This probably won't do what you think i
hongchan
2015/05/13 17:30:53
What would be the proper 'null' value for this cas
|
{ |
} |
@@ -99,8 +104,24 @@ OfflineAudioContext::~OfflineAudioContext() |
{ |
} |
+bool OfflineAudioContext::suspendIfNecessary() |
+{ |
+ ASSERT(!isMainThread()); |
+ |
+ if (m_isSuspendScheduled && m_suspendTime <= currentTime()) { |
+ m_isSuspendScheduled = false; |
+ m_suspendTime = -0.0; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
ScriptPromise OfflineAudioContext::startOfflineRendering(ScriptState* scriptState) |
{ |
+ ASSERT(isMainThread()); |
+ AutoLocker locker(this); |
+ |
// Calling close() on an OfflineAudioContext is not supported/allowed, |
// but it might well have been stopped by its execution context. |
if (isContextClosed()) { |
@@ -121,10 +142,60 @@ ScriptPromise OfflineAudioContext::startOfflineRendering(ScriptState* scriptStat |
} |
m_offlineResolver = ScriptPromiseResolver::create(scriptState); |
- startRendering(); |
+ |
+ // This calls AudioContext.startRendering(). It seems to be odd to go up the |
+ // chain and call the parent's method, but the current OAC is basically a |
+ // thin wrapper on AudioContext. (a container-like object.) |
+ // |
+ // If we decide to fix this structural issue completely, we have to touch |
+ // AudioContext and AudioNode. |
+ // startRendering(); |
+ |
+ destination()->audioDestinationHandler().startRendering(); |
+ setContextState(Running); |
+ |
return m_offlineResolver->promise(); |
} |
+ScriptPromise OfflineAudioContext::suspendOfflineRendering(ScriptState* scriptState, double suspendTime) |
+{ |
+ ASSERT(isMainThread()); |
+ AutoLocker locker(this); |
+ |
+ // suspendTime should be greater than currentTime. Otherwise stop the |
+ // rendering as soon as possible. |
+ // |
+ // TODO: add extra time when suspendTime is earlier than currentTime |
+ if (currentTime() < suspendTime) { |
+ m_isSuspendScheduled = true; |
+ m_suspendTime = suspendTime; |
+ } |
+ |
+ RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ m_offlineSuspendResolvers.append(resolver); |
+ |
+ // fprintf(stderr, "suspend scheduled = %f\n", m_suspendTime); |
+ |
+ return promise; |
+} |
+ |
+ScriptPromise OfflineAudioContext::resumeOfflineRendering(ScriptState* scriptState) |
+{ |
+ ASSERT(isMainThread()); |
+ AutoLocker locker(this); |
+ |
+ RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ m_offlineResumeResolvers.append(resolver); |
+ |
+ // Calling startRendering() in OfflineAudioDestinationHandler. |
+ destination()->audioDestinationHandler().startRendering(); |
+ setContextState(Running); |
+ |
+ return promise; |
+} |
+ |
} // namespace blink |
#endif // ENABLE(WEB_AUDIO) |