diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc b/chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc index 93bc73d73f1..71a1013fdb2 100644 --- a/chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc +++ b/chromium/third_party/blink/renderer/modules/webaudio/audio_context.cc @@ -116,7 +116,8 @@ AudioContext* AudioContext::Create(Document& document, AudioContext::AudioContext(Document& document, const WebAudioLatencyHint& latency_hint) : BaseAudioContext(&document, kRealtimeContext), - context_id_(g_context_id++) { + context_id_(g_context_id++), + keep_alive_(this) { destination_node_ = DefaultAudioDestinationNode::Create(this, latency_hint); switch (GetAutoplayPolicy()) { @@ -143,7 +144,7 @@ void AudioContext::Uninitialize() { DCHECK(IsMainThread()); DCHECK_NE(g_hardware_context_count, 0u); --g_hardware_context_count; - + StopRendering(); DidClose(); RecordAutoplayMetrics(); BaseAudioContext::Uninitialize(); @@ -315,14 +316,26 @@ bool AudioContext::IsContextClosed() const { return close_resolver_ || BaseAudioContext::IsContextClosed(); } +void AudioContext::StartRendering() { + DCHECK(IsMainThread()); + + if (!keep_alive_) + keep_alive_ = this; + BaseAudioContext::StartRendering(); +} + void AudioContext::StopRendering() { DCHECK(IsMainThread()); DCHECK(destination()); - if (ContextState() == kRunning) { + // It is okay to perform the following on a suspended AudioContext because + // this method gets called from ExecutionContext::ContextDestroyed() meaning + // the AudioContext is already unreachable from the user code. + if (ContextState() != kClosed) { destination()->GetAudioDestinationHandler().StopRendering(); SetContextState(kSuspended); GetDeferredTaskHandler().ClearHandlersToBeDeleted(); + keep_alive_.Clear(); } } |