| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 } | 92 } |
| 93 | 93 |
| 94 AudioContext* audioContext = new AudioContext(&document); | 94 AudioContext* audioContext = new AudioContext(&document); |
| 95 audioContext->suspendIfNeeded(); | 95 audioContext->suspendIfNeeded(); |
| 96 return audioContext; | 96 return audioContext; |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Constructor for rendering to the audio hardware. | 99 // Constructor for rendering to the audio hardware. |
| 100 AudioContext::AudioContext(Document* document) | 100 AudioContext::AudioContext(Document* document) |
| 101 : ActiveDOMObject(document) | 101 : ActiveDOMObject(document) |
| 102 , m_destinationNode(nullptr) |
| 103 , m_didInitializeContextGraphMutex(false) |
| 104 , m_contextState(Suspended) |
| 102 , m_isStopScheduled(false) | 105 , m_isStopScheduled(false) |
| 103 , m_isCleared(false) | 106 , m_isCleared(false) |
| 104 , m_isInitialized(false) | 107 , m_isInitialized(false) |
| 105 , m_destinationNode(nullptr) | |
| 106 , m_isResolvingResumePromises(false) | 108 , m_isResolvingResumePromises(false) |
| 107 , m_connectionCount(0) | 109 , m_connectionCount(0) |
| 108 , m_didInitializeContextGraphMutex(false) | |
| 109 , m_deferredTaskHandler(DeferredTaskHandler::create()) | 110 , m_deferredTaskHandler(DeferredTaskHandler::create()) |
| 110 , m_isOfflineContext(false) | 111 , m_isOfflineContext(false) |
| 111 , m_contextState(Suspended) | |
| 112 , m_cachedSampleFrame(0) | 112 , m_cachedSampleFrame(0) |
| 113 { | 113 { |
| 114 m_didInitializeContextGraphMutex = true; | 114 m_didInitializeContextGraphMutex = true; |
| 115 m_destinationNode = DefaultAudioDestinationNode::create(this); | 115 m_destinationNode = DefaultAudioDestinationNode::create(this); |
| 116 | 116 |
| 117 initialize(); | 117 initialize(); |
| 118 } | 118 } |
| 119 | 119 |
| 120 // Constructor for offline (non-realtime) rendering. | 120 // Constructor for offline (non-realtime) rendering. |
| 121 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) | 121 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) |
| 122 : ActiveDOMObject(document) | 122 : ActiveDOMObject(document) |
| 123 , m_destinationNode(nullptr) |
| 124 , m_didInitializeContextGraphMutex(false) |
| 125 , m_contextState(Suspended) |
| 123 , m_isStopScheduled(false) | 126 , m_isStopScheduled(false) |
| 124 , m_isCleared(false) | 127 , m_isCleared(false) |
| 125 , m_isInitialized(false) | 128 , m_isInitialized(false) |
| 126 , m_destinationNode(nullptr) | |
| 127 , m_isResolvingResumePromises(false) | 129 , m_isResolvingResumePromises(false) |
| 128 , m_connectionCount(0) | 130 , m_connectionCount(0) |
| 129 , m_didInitializeContextGraphMutex(false) | |
| 130 , m_deferredTaskHandler(DeferredTaskHandler::create()) | 131 , m_deferredTaskHandler(DeferredTaskHandler::create()) |
| 131 , m_isOfflineContext(true) | 132 , m_isOfflineContext(true) |
| 132 , m_contextState(Suspended) | |
| 133 , m_cachedSampleFrame(0) | 133 , m_cachedSampleFrame(0) |
| 134 { | 134 { |
| 135 m_didInitializeContextGraphMutex = true; | 135 m_didInitializeContextGraphMutex = true; |
| 136 |
| 136 // Create a new destination for offline rendering. | 137 // Create a new destination for offline rendering. |
| 137 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); | 138 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); |
| 138 if (m_renderTarget.get()) | 139 if (m_renderTarget.get()) |
| 139 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); | 140 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); |
| 140 | 141 |
| 141 initialize(); | 142 initialize(); |
| 142 } | 143 } |
| 143 | 144 |
| 144 AudioContext::~AudioContext() | 145 AudioContext::~AudioContext() |
| 145 { | 146 { |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 } | 730 } |
| 730 | 731 |
| 731 if (newState == m_contextState) { | 732 if (newState == m_contextState) { |
| 732 // ASSERTs above failed; just return. | 733 // ASSERTs above failed; just return. |
| 733 return; | 734 return; |
| 734 } | 735 } |
| 735 | 736 |
| 736 m_contextState = newState; | 737 m_contextState = newState; |
| 737 | 738 |
| 738 // Notify context that state changed | 739 // Notify context that state changed |
| 739 if (executionContext()) | 740 if (executionContext()) { |
| 740 executionContext()->postTask(FROM_HERE, createSameThreadTask(&AudioConte
xt::notifyStateChange, this)); | 741 executionContext()->postTask(FROM_HERE, |
| 742 createSameThreadTask(&AudioContext::notifyStateChange, this)); |
| 743 } |
| 741 } | 744 } |
| 742 | 745 |
| 743 void AudioContext::notifyStateChange() | 746 void AudioContext::notifyStateChange() |
| 744 { | 747 { |
| 745 dispatchEvent(Event::create(EventTypeNames::statechange)); | 748 dispatchEvent(Event::create(EventTypeNames::statechange)); |
| 746 } | 749 } |
| 747 | 750 |
| 748 ScriptPromise AudioContext::suspendContext(ScriptState* scriptState) | 751 ScriptPromise AudioContext::suspendContext(ScriptState* scriptState) |
| 749 { | 752 { |
| 750 ASSERT(isMainThread()); | 753 ASSERT(isMainThread()); |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 982 ASSERT(m_destinationNode); | 985 ASSERT(m_destinationNode); |
| 983 ASSERT(!isOfflineContext()); | 986 ASSERT(!isOfflineContext()); |
| 984 | 987 |
| 985 if (m_contextState == Running) { | 988 if (m_contextState == Running) { |
| 986 destination()->audioDestinationHandler().stopRendering(); | 989 destination()->audioDestinationHandler().stopRendering(); |
| 987 setContextState(Suspended); | 990 setContextState(Suspended); |
| 988 deferredTaskHandler().clearHandlersToBeDeleted(); | 991 deferredTaskHandler().clearHandlersToBeDeleted(); |
| 989 } | 992 } |
| 990 } | 993 } |
| 991 | 994 |
| 995 void AudioContext::fireSuspendEvent() |
| 996 { |
| 997 ASSERT(isMainThread()); |
| 998 if (!isMainThread()) |
| 999 return; |
| 1000 |
| 1001 // AudioBuffer* renderedBuffer = m_renderTarget.get(); |
| 1002 |
| 1003 // setContextState(Suspended); |
| 1004 |
| 1005 // ASSERT(renderedBuffer); |
| 1006 // if (!renderedBuffer) |
| 1007 // return; |
| 1008 |
| 1009 // Avoid firing the event if the document has already gone away. |
| 1010 // if (executionContext()) { |
| 1011 // dispatchEvent(Event::create(EventTypeNames::statechange)); |
| 1012 // // m_offlineResolver->resolve(renderedBuffer); |
| 1013 // } |
| 1014 } |
| 1015 |
| 992 void AudioContext::fireCompletionEvent() | 1016 void AudioContext::fireCompletionEvent() |
| 993 { | 1017 { |
| 994 ASSERT(isMainThread()); | 1018 ASSERT(isMainThread()); |
| 995 if (!isMainThread()) | 1019 if (!isMainThread()) |
| 996 return; | 1020 return; |
| 997 | 1021 |
| 998 AudioBuffer* renderedBuffer = m_renderTarget.get(); | 1022 AudioBuffer* renderedBuffer = m_renderTarget.get(); |
| 999 | 1023 |
| 1000 // For an offline context, we set the state to closed here so that the oncom
plete handler sees | 1024 // For an offline context, we set the state to closed here so that the oncom
plete handler sees |
| 1001 // that the context has been closed. | 1025 // that the context has been closed. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 | 1087 |
| 1064 // Stop the audio context. This will stop the destination node from pulling
audio anymore. And | 1088 // Stop the audio context. This will stop the destination node from pulling
audio anymore. And |
| 1065 // since we have disconnected the destination from the audio graph, and thus
has no references, | 1089 // since we have disconnected the destination from the audio graph, and thus
has no references, |
| 1066 // the destination node can GCed if JS has no references. stop() will also r
esolve the Promise | 1090 // the destination node can GCed if JS has no references. stop() will also r
esolve the Promise |
| 1067 // created here. | 1091 // created here. |
| 1068 stop(); | 1092 stop(); |
| 1069 | 1093 |
| 1070 return promise; | 1094 return promise; |
| 1071 } | 1095 } |
| 1072 | 1096 |
| 1097 bool AudioContext::suspendIfNecessary() |
| 1098 { |
| 1099 ASSERT_WITH_MESSAGE(1, "suspendIfNecessary() only valid for offline audio co
ntext"); |
| 1100 return false; |
| 1101 } |
| 1102 |
| 1073 } // namespace blink | 1103 } // namespace blink |
| 1074 | 1104 |
| 1075 #endif // ENABLE(WEB_AUDIO) | 1105 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |