| 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 29 matching lines...) Expand all Loading... |
| 40 namespace blink { | 40 namespace blink { |
| 41 | 41 |
| 42 class BaseAudioContext; | 42 class BaseAudioContext; |
| 43 class OfflineAudioContext; | 43 class OfflineAudioContext; |
| 44 class AudioHandler; | 44 class AudioHandler; |
| 45 class AudioNodeOutput; | 45 class AudioNodeOutput; |
| 46 class AudioSummingJunction; | 46 class AudioSummingJunction; |
| 47 | 47 |
| 48 // DeferredTaskHandler manages the major part of pre- and post- rendering tasks, | 48 // DeferredTaskHandler manages the major part of pre- and post- rendering tasks, |
| 49 // and provides a lock mechanism against the audio rendering graph. A | 49 // and provides a lock mechanism against the audio rendering graph. A |
| 50 // DeferredTaskHandler object is created when an BaseAudioContext object is crea
ted. | 50 // DeferredTaskHandler object is created when an BaseAudioContext object is |
| 51 // created. |
| 51 // | 52 // |
| 52 // DeferredTaskHandler outlives the BaseAudioContext only if all of the followin
g | 53 // DeferredTaskHandler outlives the BaseAudioContext only if all of the |
| 53 // conditions match: | 54 // following conditions match: |
| 54 // - An audio rendering thread is running, | 55 // - An audio rendering thread is running, |
| 55 // - It is requested to stop, | 56 // - It is requested to stop, |
| 56 // - The audio rendering thread calls requestToDeleteHandlersOnMainThread(), | 57 // - The audio rendering thread calls requestToDeleteHandlersOnMainThread(), |
| 57 // - It posts a task of deleteHandlersOnMainThread(), and | 58 // - It posts a task of deleteHandlersOnMainThread(), and |
| 58 // - GC happens and it collects the BaseAudioContext before the task execution. | 59 // - GC happens and it collects the BaseAudioContext before the task execution. |
| 59 // | 60 // |
| 60 class MODULES_EXPORT DeferredTaskHandler final | 61 class MODULES_EXPORT DeferredTaskHandler final |
| 61 : public ThreadSafeRefCounted<DeferredTaskHandler> { | 62 : public ThreadSafeRefCounted<DeferredTaskHandler> { |
| 62 public: | 63 public: |
| 63 static PassRefPtr<DeferredTaskHandler> create(); | 64 static PassRefPtr<DeferredTaskHandler> create(); |
| 64 ~DeferredTaskHandler(); | 65 ~DeferredTaskHandler(); |
| 65 | 66 |
| 66 void handleDeferredTasks(); | 67 void handleDeferredTasks(); |
| 67 void contextWillBeDestroyed(); | 68 void contextWillBeDestroyed(); |
| 68 | 69 |
| 69 // BaseAudioContext can pull node(s) at the end of each render quantum even wh
en | 70 // BaseAudioContext can pull node(s) at the end of each render quantum even |
| 70 // they are not connected to any downstream nodes. These two methods are | 71 // when they are not connected to any downstream nodes. These two methods are |
| 71 // called by the nodes who want to add/remove themselves into/from the | 72 // called by the nodes who want to add/remove themselves into/from the |
| 72 // automatic pull lists. | 73 // automatic pull lists. |
| 73 void addAutomaticPullNode(AudioHandler*); | 74 void addAutomaticPullNode(AudioHandler*); |
| 74 void removeAutomaticPullNode(AudioHandler*); | 75 void removeAutomaticPullNode(AudioHandler*); |
| 75 // Called right before handlePostRenderTasks() to handle nodes which need to | 76 // Called right before handlePostRenderTasks() to handle nodes which need to |
| 76 // be pulled even when they are not connected to anything. | 77 // be pulled even when they are not connected to anything. |
| 77 void processAutomaticPullNodes(size_t framesToProcess); | 78 void processAutomaticPullNodes(size_t framesToProcess); |
| 78 | 79 |
| 79 // Keep track of AudioNode's that have their channel count mode changed. We | 80 // Keep track of AudioNode's that have their channel count mode changed. We |
| 80 // process the changes in the post rendering phase. | 81 // process the changes in the post rendering phase. |
| 81 void addChangedChannelCountMode(AudioHandler*); | 82 void addChangedChannelCountMode(AudioHandler*); |
| 82 void removeChangedChannelCountMode(AudioHandler*); | 83 void removeChangedChannelCountMode(AudioHandler*); |
| 83 | 84 |
| 84 // Keep track of AudioNode's that have their channel interpretation | 85 // Keep track of AudioNode's that have their channel interpretation |
| 85 // changed. We process the changes in the post rendering phase. | 86 // changed. We process the changes in the post rendering phase. |
| 86 void addChangedChannelInterpretation(AudioHandler*); | 87 void addChangedChannelInterpretation(AudioHandler*); |
| 87 void removeChangedChannelInterpretation(AudioHandler*); | 88 void removeChangedChannelInterpretation(AudioHandler*); |
| 88 | 89 |
| 89 // Only accessed when the graph lock is held. | 90 // Only accessed when the graph lock is held. |
| 90 void markSummingJunctionDirty(AudioSummingJunction*); | 91 void markSummingJunctionDirty(AudioSummingJunction*); |
| 91 // Only accessed when the graph lock is held. Must be called on the main threa
d. | 92 // Only accessed when the graph lock is held. Must be called on the main |
| 93 // thread. |
| 92 void removeMarkedSummingJunction(AudioSummingJunction*); | 94 void removeMarkedSummingJunction(AudioSummingJunction*); |
| 93 | 95 |
| 94 void markAudioNodeOutputDirty(AudioNodeOutput*); | 96 void markAudioNodeOutputDirty(AudioNodeOutput*); |
| 95 void removeMarkedAudioNodeOutput(AudioNodeOutput*); | 97 void removeMarkedAudioNodeOutput(AudioNodeOutput*); |
| 96 | 98 |
| 97 // In AudioNode::breakConnection() and deref(), a tryLock() is used for | 99 // In AudioNode::breakConnection() and deref(), a tryLock() is used for |
| 98 // calling actual processing, but if it fails keep track here. | 100 // calling actual processing, but if it fails keep track here. |
| 99 void addDeferredBreakConnection(AudioHandler&); | 101 void addDeferredBreakConnection(AudioHandler&); |
| 100 void breakConnections(); | 102 void breakConnections(); |
| 101 | 103 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 void handleDirtyAudioSummingJunctions(); | 172 void handleDirtyAudioSummingJunctions(); |
| 171 void handleDirtyAudioNodeOutputs(); | 173 void handleDirtyAudioNodeOutputs(); |
| 172 void deleteHandlersOnMainThread(); | 174 void deleteHandlersOnMainThread(); |
| 173 | 175 |
| 174 // For the sake of thread safety, we maintain a seperate Vector of automatic | 176 // For the sake of thread safety, we maintain a seperate Vector of automatic |
| 175 // pull nodes for rendering in m_renderingAutomaticPullNodes. It will be | 177 // pull nodes for rendering in m_renderingAutomaticPullNodes. It will be |
| 176 // copied from m_automaticPullNodes by updateAutomaticPullNodes() at the | 178 // copied from m_automaticPullNodes by updateAutomaticPullNodes() at the |
| 177 // very start or end of the rendering quantum. | 179 // very start or end of the rendering quantum. |
| 178 HashSet<AudioHandler*> m_automaticPullNodes; | 180 HashSet<AudioHandler*> m_automaticPullNodes; |
| 179 Vector<AudioHandler*> m_renderingAutomaticPullNodes; | 181 Vector<AudioHandler*> m_renderingAutomaticPullNodes; |
| 180 // m_automaticPullNodesNeedUpdating keeps track if m_automaticPullNodes is mod
ified. | 182 // m_automaticPullNodesNeedUpdating keeps track if m_automaticPullNodes is |
| 183 // modified. |
| 181 bool m_automaticPullNodesNeedUpdating; | 184 bool m_automaticPullNodesNeedUpdating; |
| 182 | 185 |
| 183 // Collection of nodes where the channel count mode has changed. We want the | 186 // Collection of nodes where the channel count mode has changed. We want the |
| 184 // channel count mode to change in the pre- or post-rendering phase so as | 187 // channel count mode to change in the pre- or post-rendering phase so as |
| 185 // not to disturb the running audio thread. | 188 // not to disturb the running audio thread. |
| 186 HashSet<AudioHandler*> m_deferredCountModeChange; | 189 HashSet<AudioHandler*> m_deferredCountModeChange; |
| 187 | 190 |
| 188 HashSet<AudioHandler*> m_deferredChannelInterpretationChange; | 191 HashSet<AudioHandler*> m_deferredChannelInterpretationChange; |
| 189 | 192 |
| 190 // These two HashSet must be accessed only when the graph lock is held. | 193 // These two HashSet must be accessed only when the graph lock is held. |
| 191 // These raw pointers are safe because their destructors unregister them. | 194 // These raw pointers are safe because their destructors unregister them. |
| 192 HashSet<AudioSummingJunction*> m_dirtySummingJunctions; | 195 HashSet<AudioSummingJunction*> m_dirtySummingJunctions; |
| 193 HashSet<AudioNodeOutput*> m_dirtyAudioNodeOutputs; | 196 HashSet<AudioNodeOutput*> m_dirtyAudioNodeOutputs; |
| 194 | 197 |
| 195 // Only accessed in the audio thread. | 198 // Only accessed in the audio thread. |
| 196 Vector<AudioHandler*> m_deferredBreakConnectionList; | 199 Vector<AudioHandler*> m_deferredBreakConnectionList; |
| 197 | 200 |
| 198 Vector<RefPtr<AudioHandler>> m_renderingOrphanHandlers; | 201 Vector<RefPtr<AudioHandler>> m_renderingOrphanHandlers; |
| 199 Vector<RefPtr<AudioHandler>> m_deletableOrphanHandlers; | 202 Vector<RefPtr<AudioHandler>> m_deletableOrphanHandlers; |
| 200 | 203 |
| 201 // Graph locking. | 204 // Graph locking. |
| 202 RecursiveMutex m_contextGraphMutex; | 205 RecursiveMutex m_contextGraphMutex; |
| 203 volatile ThreadIdentifier m_audioThread; | 206 volatile ThreadIdentifier m_audioThread; |
| 204 }; | 207 }; |
| 205 | 208 |
| 206 } // namespace blink | 209 } // namespace blink |
| 207 | 210 |
| 208 #endif // DeferredTaskHandler_h | 211 #endif // DeferredTaskHandler_h |
| OLD | NEW |