@@ -44,6 +44,10 @@ AudioContext::AudioContext(nsPIDOMWindow* aWindow)
4444 // Actually play audio
4545 mDestination ->Stream ()->AddAudioOutput (&gWebAudioOutputKey );
4646 SetIsDOMBinding ();
47+
48+ mPannerNodes .Init ();
49+ mAudioBufferSourceNodes .Init ();
50+ mScriptProcessorNodes .Init ();
4751}
4852
4953AudioContext::~AudioContext ()
@@ -75,7 +79,7 @@ AudioContext::CreateBufferSource()
7579{
7680 nsRefPtr<AudioBufferSourceNode> bufferNode =
7781 new AudioBufferSourceNode (this );
78- mAudioBufferSourceNodes .AppendElement (bufferNode);
82+ mAudioBufferSourceNodes .PutEntry (bufferNode);
7983 return bufferNode.forget ();
8084}
8185
@@ -141,7 +145,7 @@ AudioContext::CreateScriptProcessor(uint32_t aBufferSize,
141145 nsRefPtr<ScriptProcessorNode> scriptProcessor =
142146 new ScriptProcessorNode (this , aBufferSize, aNumberOfInputChannels,
143147 aNumberOfOutputChannels);
144- mScriptProcessorNodes .AppendElement (scriptProcessor);
148+ mScriptProcessorNodes .PutEntry (scriptProcessor);
145149 return scriptProcessor.forget ();
146150}
147151
@@ -174,7 +178,7 @@ already_AddRefed<PannerNode>
174178AudioContext::CreatePanner ()
175179{
176180 nsRefPtr<PannerNode> pannerNode = new PannerNode (this );
177- mPannerNodes .AppendElement (pannerNode);
181+ mPannerNodes .PutEntry (pannerNode);
178182 return pannerNode.forget ();
179183}
180184
@@ -237,30 +241,40 @@ AudioContext::RemoveFromDecodeQueue(WebAudioDecodeJob* aDecodeJob)
237241void
238242AudioContext::UnregisterAudioBufferSourceNode (AudioBufferSourceNode* aNode)
239243{
240- mAudioBufferSourceNodes .RemoveElement (aNode);
244+ mAudioBufferSourceNodes .RemoveEntry (aNode);
241245}
242246
243247void
244248AudioContext::UnregisterPannerNode (PannerNode* aNode)
245249{
246- mPannerNodes .RemoveElement (aNode);
250+ mPannerNodes .RemoveEntry (aNode);
247251}
248252
249253void
250254AudioContext::UnregisterScriptProcessorNode (ScriptProcessorNode* aNode)
251255{
252- mScriptProcessorNodes .RemoveElement (aNode);
256+ mScriptProcessorNodes .RemoveEntry (aNode);
257+ }
258+
259+ static PLDHashOperator
260+ UnregisterPannerNodeOn (nsPtrHashKey<AudioBufferSourceNode>* aEntry, void * aData)
261+ {
262+ aEntry->GetKey ()->UnregisterPannerNode ();
263+ return PL_DHASH_NEXT ;
264+ }
265+
266+ static PLDHashOperator
267+ FindConnectedSourcesOn (nsPtrHashKey<PannerNode>* aEntry, void * aData)
268+ {
269+ aEntry->GetKey ()->FindConnectedSources ();
270+ return PL_DHASH_NEXT ;
253271}
254272
255273void
256274AudioContext::UpdatePannerSource ()
257275{
258- for (unsigned i = 0 ; i < mAudioBufferSourceNodes .Length (); i++) {
259- mAudioBufferSourceNodes [i]->UnregisterPannerNode ();
260- }
261- for (unsigned i = 0 ; i < mPannerNodes .Length (); i++) {
262- mPannerNodes [i]->FindConnectedSources ();
263- }
276+ mAudioBufferSourceNodes .EnumerateEntries (UnregisterPannerNodeOn, nullptr );
277+ mPannerNodes .EnumerateEntries (FindConnectedSourcesOn, nullptr );
264278}
265279
266280MediaStreamGraph*
@@ -281,6 +295,21 @@ AudioContext::CurrentTime() const
281295 return MediaTimeToSeconds (Destination ()->Stream ()->GetCurrentTime ());
282296}
283297
298+ static PLDHashOperator
299+ StopAudioBufferSourceNode (nsPtrHashKey<AudioBufferSourceNode>* aEntry, void * aData)
300+ {
301+ ErrorResult rv;
302+ aEntry->GetKey ()->Stop (0.0 , rv);
303+ return PL_DHASH_NEXT ;
304+ }
305+
306+ static PLDHashOperator
307+ StopScriptProcessorNode (nsPtrHashKey<ScriptProcessorNode>* aEntry, void * aData)
308+ {
309+ aEntry->GetKey ()->Stop ();
310+ return PL_DHASH_NEXT ;
311+ }
312+
284313void
285314AudioContext::Shutdown ()
286315{
@@ -289,15 +318,10 @@ AudioContext::Shutdown()
289318
290319 // Stop all audio buffer source nodes, to make sure that they release
291320 // their self-references.
292- for (uint32_t i = 0 ; i < mAudioBufferSourceNodes .Length (); ++i) {
293- ErrorResult rv;
294- mAudioBufferSourceNodes [i]->Stop (0.0 , rv);
295- }
321+ mAudioBufferSourceNodes .EnumerateEntries (StopAudioBufferSourceNode, nullptr );
296322 // Stop all script processor nodes, to make sure that they release
297323 // their self-references.
298- for (uint32_t i = 0 ; i < mScriptProcessorNodes .Length (); ++i) {
299- mScriptProcessorNodes [i]->Stop ();
300- }
324+ mScriptProcessorNodes .EnumerateEntries (StopScriptProcessorNode, nullptr );
301325}
302326
303327void
0 commit comments