Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: Source/modules/webaudio/AudioContext.cpp

Issue 1140723003: Implement suspend() and resume() for OfflineAudioContext (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Initial Design Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 } 727 }
727 728
728 if (newState == m_contextState) { 729 if (newState == m_contextState) {
729 // ASSERTs above failed; just return. 730 // ASSERTs above failed; just return.
730 return; 731 return;
731 } 732 }
732 733
733 m_contextState = newState; 734 m_contextState = newState;
734 735
735 // Notify context that state changed 736 // Notify context that state changed
736 if (executionContext()) 737 if (executionContext()) {
737 executionContext()->postTask(FROM_HERE, createSameThreadTask(&AudioConte xt::notifyStateChange, this)); 738 executionContext()->postTask(FROM_HERE,
739 createSameThreadTask(&AudioContext::notifyStateChange, this));
740 }
Raymond Toy 2015/05/13 17:16:08 Why?
hongchan 2015/05/13 17:30:53 Added some line breaks to make the code read bette
738 } 741 }
739 742
740 void AudioContext::notifyStateChange() 743 void AudioContext::notifyStateChange()
741 { 744 {
742 dispatchEvent(Event::create(EventTypeNames::statechange)); 745 dispatchEvent(Event::create(EventTypeNames::statechange));
743 } 746 }
744 747
745 ScriptPromise AudioContext::suspendContext(ScriptState* scriptState) 748 ScriptPromise AudioContext::suspendContext(ScriptState* scriptState)
746 { 749 {
747 ASSERT(isMainThread()); 750 ASSERT(isMainThread());
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 ASSERT(m_destinationNode); 1019 ASSERT(m_destinationNode);
1017 ASSERT(!isOfflineContext()); 1020 ASSERT(!isOfflineContext());
1018 1021
1019 if (m_contextState == Running) { 1022 if (m_contextState == Running) {
1020 destination()->audioDestinationHandler().stopRendering(); 1023 destination()->audioDestinationHandler().stopRendering();
1021 setContextState(Suspended); 1024 setContextState(Suspended);
1022 deferredTaskHandler().clearHandlersToBeDeleted(); 1025 deferredTaskHandler().clearHandlersToBeDeleted();
1023 } 1026 }
1024 } 1027 }
1025 1028
1029 void AudioContext::fireSuspendEvent()
1030 {
1031 ASSERT(isMainThread());
1032 if (!isMainThread())
1033 return;
1034
1035 // AudioBuffer* renderedBuffer = m_renderTarget.get();
1036
1037 setContextState(Suspended);
1038
1039 // ASSERT(renderedBuffer);
1040 // if (!renderedBuffer)
1041 // return;
1042
1043 // Avoid firing the event if the document has already gone away.
1044 // if (executionContext()) {
1045 // dispatchEvent(Event::create(EventTypeNames::statechange));
1046 // // m_offlineResolver->resolve(renderedBuffer);
1047 // }
1048 }
1049
1026 void AudioContext::fireCompletionEvent() 1050 void AudioContext::fireCompletionEvent()
1027 { 1051 {
1028 ASSERT(isMainThread()); 1052 ASSERT(isMainThread());
1029 if (!isMainThread()) 1053 if (!isMainThread())
1030 return; 1054 return;
1031 1055
1032 AudioBuffer* renderedBuffer = m_renderTarget.get(); 1056 AudioBuffer* renderedBuffer = m_renderTarget.get();
1033 1057
1034 // For an offline context, we set the state to closed here so that the oncom plete handler sees 1058 // For an offline context, we set the state to closed here so that the oncom plete handler sees
1035 // that the context has been closed. 1059 // that the context has been closed.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 1122
1099 // Stop the audio context. This will stop the destination node from pulling audio anymore. And 1123 // Stop the audio context. This will stop the destination node from pulling audio anymore. And
1100 // since we have disconnected the destination from the audio graph, and thus has no references, 1124 // since we have disconnected the destination from the audio graph, and thus has no references,
1101 // the destination node can GCed if JS has no references. stop() will also r esolve the Promise 1125 // the destination node can GCed if JS has no references. stop() will also r esolve the Promise
1102 // created here. 1126 // created here.
1103 stop(); 1127 stop();
1104 1128
1105 return promise; 1129 return promise;
1106 } 1130 }
1107 1131
1132 bool AudioContext::suspendIfNecessary()
1133 {
1134 ASSERT_WITH_MESSAGE(1, "suspendIfNecessary() only valid for offline audio co ntext");
1135 return false;
1136 }
1137
1108 } // namespace blink 1138 } // namespace blink
1109 1139
1110 #endif // ENABLE(WEB_AUDIO) 1140 #endif // ENABLE(WEB_AUDIO)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698