Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 6c274aa

Browse files
author
Ehsan Akhgari
committed
Bug 865548 - Convert the node arrays in AudioContext to hashsets; r=padenot
1 parent 5164c7b commit 6c274aa

2 files changed

Lines changed: 52 additions & 24 deletions

File tree

content/media/webaudio/AudioContext.cpp

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4953
AudioContext::~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>
174178
AudioContext::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)
237241
void
238242
AudioContext::UnregisterAudioBufferSourceNode(AudioBufferSourceNode* aNode)
239243
{
240-
mAudioBufferSourceNodes.RemoveElement(aNode);
244+
mAudioBufferSourceNodes.RemoveEntry(aNode);
241245
}
242246

243247
void
244248
AudioContext::UnregisterPannerNode(PannerNode* aNode)
245249
{
246-
mPannerNodes.RemoveElement(aNode);
250+
mPannerNodes.RemoveEntry(aNode);
247251
}
248252

249253
void
250254
AudioContext::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

255273
void
256274
AudioContext::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

266280
MediaStreamGraph*
@@ -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+
284313
void
285314
AudioContext::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

303327
void

content/media/webaudio/AudioContext.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "MediaBufferDecoder.h"
2020
#include "StreamBuffer.h"
2121
#include "MediaStreamGraph.h"
22+
#include "nsTHashtable.h"
2223

2324
// X11 has a #define for CurrentTime. Unbelievable :-(.
2425
// See content/media/DOMMediaStream.h for more fun!
@@ -167,11 +168,14 @@ class AudioContext MOZ_FINAL : public nsWrapperCache,
167168
nsRefPtr<AudioListener> mListener;
168169
MediaBufferDecoder mDecoder;
169170
nsTArray<nsAutoPtr<WebAudioDecodeJob> > mDecodeJobs;
170-
// Two arrays containing all the PannerNodes and AudioBufferSourceNodes,
171-
// to compute the doppler shift. Those are weak pointers.
172-
nsTArray<PannerNode*> mPannerNodes;
173-
nsTArray<AudioBufferSourceNode*> mAudioBufferSourceNodes;
174-
nsTArray<ScriptProcessorNode*> mScriptProcessorNodes;
171+
// Two hashsets containing all the PannerNodes and AudioBufferSourceNodes,
172+
// to compute the doppler shift, and also to stop AudioBufferSourceNodes.
173+
// These are all weak pointers.
174+
nsTHashtable<nsPtrHashKey<PannerNode> > mPannerNodes;
175+
nsTHashtable<nsPtrHashKey<AudioBufferSourceNode> > mAudioBufferSourceNodes;
176+
// Hashset containing all ScriptProcessorNodes in order to stop them.
177+
// These are all weak pointers.
178+
nsTHashtable<nsPtrHashKey<ScriptProcessorNode> > mScriptProcessorNodes;
175179
};
176180

177181
}

0 commit comments

Comments
 (0)