OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012, Google Inc. All rights reserved. | 2 * Copyright (C) 2012, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 // | 170 // |
171 // See: crbug.com/435867 | 171 // See: crbug.com/435867 |
172 if (isContextClosed()) { | 172 if (isContextClosed()) { |
173 return ScriptPromise::rejectWithDOMException( | 173 return ScriptPromise::rejectWithDOMException( |
174 scriptState, | 174 scriptState, |
175 DOMException::create(InvalidStateError, | 175 DOMException::create(InvalidStateError, |
176 "cannot call startRendering on an " | 176 "cannot call startRendering on an " |
177 "OfflineAudioContext in a stopped state.")); | 177 "OfflineAudioContext in a stopped state.")); |
178 } | 178 } |
179 | 179 |
180 // If the context is not in the suspended state (i.e. running), reject the pro
mise. | 180 // If the context is not in the suspended state (i.e. running), reject the |
| 181 // promise. |
181 if (contextState() != AudioContextState::Suspended) { | 182 if (contextState() != AudioContextState::Suspended) { |
182 return ScriptPromise::rejectWithDOMException( | 183 return ScriptPromise::rejectWithDOMException( |
183 scriptState, | 184 scriptState, |
184 DOMException::create( | 185 DOMException::create( |
185 InvalidStateError, | 186 InvalidStateError, |
186 "cannot startRendering when an OfflineAudioContext is " + state())); | 187 "cannot startRendering when an OfflineAudioContext is " + state())); |
187 } | 188 } |
188 | 189 |
189 // Can't call startRendering more than once. Return a rejected promise now. | 190 // Can't call startRendering more than once. Return a rejected promise now. |
190 if (m_isRenderingStarted) { | 191 if (m_isRenderingStarted) { |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 | 391 |
391 void OfflineAudioContext::resolveSuspendOnMainThread(size_t frame) { | 392 void OfflineAudioContext::resolveSuspendOnMainThread(size_t frame) { |
392 DCHECK(isMainThread()); | 393 DCHECK(isMainThread()); |
393 | 394 |
394 // Suspend the context first. This will fire onstatechange event. | 395 // Suspend the context first. This will fire onstatechange event. |
395 setContextState(Suspended); | 396 setContextState(Suspended); |
396 | 397 |
397 // Wait until the suspend map is available for the removal. | 398 // Wait until the suspend map is available for the removal. |
398 AutoLocker locker(this); | 399 AutoLocker locker(this); |
399 | 400 |
400 // If the context is going away, m_scheduledSuspends could have had all its en
tries removed. | 401 // If the context is going away, m_scheduledSuspends could have had all its |
401 // Check for that here. | 402 // entries removed. Check for that here. |
402 if (m_scheduledSuspends.size()) { | 403 if (m_scheduledSuspends.size()) { |
403 // |frame| must exist in the map. | 404 // |frame| must exist in the map. |
404 DCHECK(m_scheduledSuspends.contains(frame)); | 405 DCHECK(m_scheduledSuspends.contains(frame)); |
405 | 406 |
406 SuspendMap::iterator it = m_scheduledSuspends.find(frame); | 407 SuspendMap::iterator it = m_scheduledSuspends.find(frame); |
407 it->value->resolve(); | 408 it->value->resolve(); |
408 | 409 |
409 m_scheduledSuspends.remove(it); | 410 m_scheduledSuspends.remove(it); |
410 } | 411 } |
411 } | 412 } |
412 | 413 |
413 void OfflineAudioContext::rejectPendingResolvers() { | 414 void OfflineAudioContext::rejectPendingResolvers() { |
414 DCHECK(isMainThread()); | 415 DCHECK(isMainThread()); |
415 | 416 |
416 // Wait until the suspend map is available for removal. | 417 // Wait until the suspend map is available for removal. |
417 AutoLocker locker(this); | 418 AutoLocker locker(this); |
418 | 419 |
419 // Offline context is going away so reject any promises that are still pending
. | 420 // Offline context is going away so reject any promises that are still |
| 421 // pending. |
420 | 422 |
421 for (auto& pendingSuspendResolver : m_scheduledSuspends) { | 423 for (auto& pendingSuspendResolver : m_scheduledSuspends) { |
422 pendingSuspendResolver.value->reject( | 424 pendingSuspendResolver.value->reject( |
423 DOMException::create(InvalidStateError, "Audio context is going away")); | 425 DOMException::create(InvalidStateError, "Audio context is going away")); |
424 } | 426 } |
425 | 427 |
426 m_scheduledSuspends.clear(); | 428 m_scheduledSuspends.clear(); |
427 DCHECK_EQ(m_resumeResolvers.size(), 0u); | 429 DCHECK_EQ(m_resumeResolvers.size(), 0u); |
428 | 430 |
429 rejectPendingDecodeAudioDataResolvers(); | 431 rejectPendingDecodeAudioDataResolvers(); |
430 } | 432 } |
431 | 433 |
432 bool OfflineAudioContext::shouldSuspend() { | 434 bool OfflineAudioContext::shouldSuspend() { |
433 DCHECK(isAudioThread()); | 435 DCHECK(isAudioThread()); |
434 | 436 |
435 // Note that the GraphLock is required before this check. Since this needs | 437 // Note that the GraphLock is required before this check. Since this needs |
436 // to run on the audio thread, OfflineGraphAutoLocker must be used. | 438 // to run on the audio thread, OfflineGraphAutoLocker must be used. |
437 if (m_scheduledSuspends.contains(currentSampleFrame())) | 439 if (m_scheduledSuspends.contains(currentSampleFrame())) |
438 return true; | 440 return true; |
439 | 441 |
440 return false; | 442 return false; |
441 } | 443 } |
442 | 444 |
443 } // namespace blink | 445 } // namespace blink |
OLD | NEW |