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 19 matching lines...) Expand all Loading... |
30 #include "AudioBus.h" | 30 #include "AudioBus.h" |
31 #include "AudioDestinationNode.h" | 31 #include "AudioDestinationNode.h" |
32 #include "EventListener.h" | 32 #include "EventListener.h" |
33 #include "EventTarget.h" | 33 #include "EventTarget.h" |
34 #include "HRTFDatabaseLoader.h" | 34 #include "HRTFDatabaseLoader.h" |
35 #include <wtf/HashSet.h> | 35 #include <wtf/HashSet.h> |
36 #include <wtf/OwnPtr.h> | 36 #include <wtf/OwnPtr.h> |
37 #include <wtf/PassRefPtr.h> | 37 #include <wtf/PassRefPtr.h> |
38 #include <wtf/RefCounted.h> | 38 #include <wtf/RefCounted.h> |
39 #include <wtf/RefPtr.h> | 39 #include <wtf/RefPtr.h> |
| 40 #include <wtf/ThreadSafeRefCounted.h> |
40 #include <wtf/Threading.h> | 41 #include <wtf/Threading.h> |
41 #include <wtf/Vector.h> | 42 #include <wtf/Vector.h> |
42 #include <wtf/text/AtomicStringHash.h> | 43 #include <wtf/text/AtomicStringHash.h> |
43 | 44 |
44 namespace WebCore { | 45 namespace WebCore { |
45 | 46 |
46 class ArrayBuffer; | 47 class ArrayBuffer; |
47 class AudioBuffer; | 48 class AudioBuffer; |
48 class AudioBufferCallback; | 49 class AudioBufferCallback; |
49 class AudioBufferSourceNode; | 50 class AudioBufferSourceNode; |
50 class AudioChannelMerger; | 51 class AudioChannelMerger; |
51 class AudioChannelSplitter; | 52 class AudioChannelSplitter; |
52 class AudioGainNode; | 53 class AudioGainNode; |
53 class AudioPannerNode; | 54 class AudioPannerNode; |
54 class AudioListener; | 55 class AudioListener; |
55 class BiquadFilterNode; | 56 class BiquadFilterNode; |
56 class DelayNode; | 57 class DelayNode; |
57 class Document; | 58 class Document; |
58 class LowPass2FilterNode; | 59 class LowPass2FilterNode; |
59 class HighPass2FilterNode; | 60 class HighPass2FilterNode; |
60 class ConvolverNode; | 61 class ConvolverNode; |
61 class DynamicsCompressorNode; | 62 class DynamicsCompressorNode; |
62 class RealtimeAnalyserNode; | 63 class RealtimeAnalyserNode; |
63 class WaveShaperNode; | 64 class WaveShaperNode; |
64 class JavaScriptAudioNode; | 65 class JavaScriptAudioNode; |
65 | 66 |
66 // AudioContext is the cornerstone of the web audio API and all AudioNodes are c
reated from it. | 67 // AudioContext is the cornerstone of the web audio API and all AudioNodes are c
reated from it. |
67 // For thread safety between the audio thread and the main thread, it has a rend
ering graph locking mechanism. | 68 // For thread safety between the audio thread and the main thread, it has a rend
ering graph locking mechanism. |
68 | 69 |
69 class AudioContext : public ActiveDOMObject, public RefCounted<AudioContext>, pu
blic EventTarget { | 70 class AudioContext : public ActiveDOMObject, public ThreadSafeRefCounted<AudioCo
ntext>, public EventTarget { |
70 public: | 71 public: |
71 // Create an AudioContext for rendering to the audio hardware. | 72 // Create an AudioContext for rendering to the audio hardware. |
72 static PassRefPtr<AudioContext> create(Document*); | 73 static PassRefPtr<AudioContext> create(Document*); |
73 | 74 |
74 // Create an AudioContext for offline (non-realtime) rendering. | 75 // Create an AudioContext for offline (non-realtime) rendering. |
75 static PassRefPtr<AudioContext> createOfflineContext(Document*, unsigned num
berOfChannels, size_t numberOfFrames, double sampleRate, ExceptionCode&); | 76 static PassRefPtr<AudioContext> createOfflineContext(Document*, unsigned num
berOfChannels, size_t numberOfFrames, double sampleRate, ExceptionCode&); |
76 | 77 |
77 virtual ~AudioContext(); | 78 virtual ~AudioContext(); |
78 | 79 |
79 bool isInitialized() const; | 80 bool isInitialized() const; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 129 |
129 // Called at the start of each render quantum. | 130 // Called at the start of each render quantum. |
130 void handlePreRenderTasks(); | 131 void handlePreRenderTasks(); |
131 | 132 |
132 // Called at the end of each render quantum. | 133 // Called at the end of each render quantum. |
133 void handlePostRenderTasks(); | 134 void handlePostRenderTasks(); |
134 | 135 |
135 // Called periodically at the end of each render quantum to dereference fini
shed source nodes. | 136 // Called periodically at the end of each render quantum to dereference fini
shed source nodes. |
136 void derefFinishedSourceNodes(); | 137 void derefFinishedSourceNodes(); |
137 | 138 |
138 // We reap all marked nodes at the end of each realtime render quantum in de
leteMarkedNodes(). | 139 // We schedule deletion of all marked nodes at the end of each realtime rend
er quantum. |
139 void markForDeletion(AudioNode*); | 140 void markForDeletion(AudioNode*); |
140 void deleteMarkedNodes(); | 141 void deleteMarkedNodes(); |
141 | 142 |
142 // Keeps track of the number of connections made. | 143 // Keeps track of the number of connections made. |
143 void incrementConnectionCount() | 144 void incrementConnectionCount() |
144 { | 145 { |
145 ASSERT(isMainThread()); | 146 ASSERT(isMainThread()); |
146 m_connectionCount++; | 147 m_connectionCount++; |
147 } | 148 } |
148 | 149 |
149 unsigned connectionCount() const { return m_connectionCount; } | 150 unsigned connectionCount() const { return m_connectionCount; } |
150 | 151 |
151 // | 152 // |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 void markAudioNodeOutputDirty(AudioNodeOutput*); | 202 void markAudioNodeOutputDirty(AudioNodeOutput*); |
202 | 203 |
203 // EventTarget | 204 // EventTarget |
204 virtual ScriptExecutionContext* scriptExecutionContext() const; | 205 virtual ScriptExecutionContext* scriptExecutionContext() const; |
205 virtual AudioContext* toAudioContext(); | 206 virtual AudioContext* toAudioContext(); |
206 virtual EventTargetData* eventTargetData() { return &m_eventTargetData; } | 207 virtual EventTargetData* eventTargetData() { return &m_eventTargetData; } |
207 virtual EventTargetData* ensureEventTargetData() { return &m_eventTargetData
; } | 208 virtual EventTargetData* ensureEventTargetData() { return &m_eventTargetData
; } |
208 | 209 |
209 DEFINE_ATTRIBUTE_EVENT_LISTENER(complete); | 210 DEFINE_ATTRIBUTE_EVENT_LISTENER(complete); |
210 | 211 |
211 // Reconcile ref/deref which are defined both in AudioNode and EventTarget. | 212 // Reconcile ref/deref which are defined both in ThreadSafeRefCounted and Ev
entTarget. |
212 using RefCounted<AudioContext>::ref; | 213 using ThreadSafeRefCounted<AudioContext>::ref; |
213 using RefCounted<AudioContext>::deref; | 214 using ThreadSafeRefCounted<AudioContext>::deref; |
214 | 215 |
215 void startRendering(); | 216 void startRendering(); |
216 void fireCompletionEvent(); | 217 void fireCompletionEvent(); |
217 | 218 |
218 static unsigned s_hardwareContextCount; | 219 static unsigned s_hardwareContextCount; |
219 | 220 |
220 private: | 221 private: |
221 AudioContext(Document*); | 222 AudioContext(Document*); |
222 AudioContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, do
uble sampleRate); | 223 AudioContext(Document*, unsigned numberOfChannels, size_t numberOfFrames, do
uble sampleRate); |
223 void constructCommon(); | 224 void constructCommon(); |
224 | 225 |
225 void lazyInitialize(); | 226 void lazyInitialize(); |
226 void uninitialize(); | 227 void uninitialize(); |
| 228 |
| 229 void scheduleNodeDeletion(); |
| 230 static void deleteMarkedNodesDispatch(void* userData); |
227 | 231 |
228 bool m_isInitialized; | 232 bool m_isInitialized; |
229 bool m_isAudioThreadFinished; | 233 bool m_isAudioThreadFinished; |
230 bool m_isAudioThreadShutdown; | 234 bool m_isAudioThreadShutdown; |
231 | 235 |
232 Document* m_document; | 236 Document* m_document; |
233 | 237 |
234 // The context itself keeps a reference to all source nodes. The source nod
es, then reference all nodes they're connected to. | 238 // The context itself keeps a reference to all source nodes. The source nod
es, then reference all nodes they're connected to. |
235 // In turn, these nodes reference all nodes they're connected to. All nodes
are ultimately connected to the AudioDestinationNode. | 239 // In turn, these nodes reference all nodes they're connected to. All nodes
are ultimately connected to the AudioDestinationNode. |
236 // When the context dereferences a source node, it will be deactivated from
the rendering graph along with all other nodes it is | 240 // When the context dereferences a source node, it will be deactivated from
the rendering graph along with all other nodes it is |
(...skipping 12 matching lines...) Expand all Loading... |
249 Vector<RefPtr<AudioBuffer> > m_allocatedBuffers; | 253 Vector<RefPtr<AudioBuffer> > m_allocatedBuffers; |
250 | 254 |
251 // Only accessed in the audio thread. | 255 // Only accessed in the audio thread. |
252 Vector<AudioNode*> m_finishedNodes; | 256 Vector<AudioNode*> m_finishedNodes; |
253 | 257 |
254 // We don't use RefPtr<AudioNode> here because AudioNode has a more complex
ref() / deref() implementation | 258 // We don't use RefPtr<AudioNode> here because AudioNode has a more complex
ref() / deref() implementation |
255 // with an optional argument for refType. We need to use the special refTyp
e: RefTypeConnection | 259 // with an optional argument for refType. We need to use the special refTyp
e: RefTypeConnection |
256 // Either accessed when the graph lock is held, or on the main thread when t
he audio thread has finished. | 260 // Either accessed when the graph lock is held, or on the main thread when t
he audio thread has finished. |
257 Vector<AudioNode*> m_referencedNodes; | 261 Vector<AudioNode*> m_referencedNodes; |
258 | 262 |
259 // Accumulate nodes which need to be deleted at the end of a render cycle (i
n realtime thread) here. | 263 // Accumulate nodes which need to be deleted here. |
| 264 // They will be scheduled for deletion (on the main thread) at the end of a
render cycle (in realtime thread). |
260 Vector<AudioNode*> m_nodesToDelete; | 265 Vector<AudioNode*> m_nodesToDelete; |
| 266 bool m_isDeletionScheduled; |
261 | 267 |
262 // Only accessed when the graph lock is held. | 268 // Only accessed when the graph lock is held. |
263 HashSet<AudioNodeInput*> m_dirtyAudioNodeInputs; | 269 HashSet<AudioNodeInput*> m_dirtyAudioNodeInputs; |
264 HashSet<AudioNodeOutput*> m_dirtyAudioNodeOutputs; | 270 HashSet<AudioNodeOutput*> m_dirtyAudioNodeOutputs; |
265 void handleDirtyAudioNodeInputs(); | 271 void handleDirtyAudioNodeInputs(); |
266 void handleDirtyAudioNodeOutputs(); | 272 void handleDirtyAudioNodeOutputs(); |
267 | 273 |
268 OwnPtr<AudioBus> m_temporaryMonoBus; | 274 OwnPtr<AudioBus> m_temporaryMonoBus; |
269 OwnPtr<AudioBus> m_temporaryStereoBus; | 275 OwnPtr<AudioBus> m_temporaryStereoBus; |
270 | 276 |
(...skipping 29 matching lines...) Expand all Loading... |
300 RefPtr<AudioBuffer> m_renderTarget; | 306 RefPtr<AudioBuffer> m_renderTarget; |
301 | 307 |
302 bool m_isOfflineContext; | 308 bool m_isOfflineContext; |
303 | 309 |
304 AsyncAudioDecoder m_audioDecoder; | 310 AsyncAudioDecoder m_audioDecoder; |
305 }; | 311 }; |
306 | 312 |
307 } // WebCore | 313 } // WebCore |
308 | 314 |
309 #endif // AudioContext_h | 315 #endif // AudioContext_h |
OLD | NEW |