--- a/dom/media/MediaRecorder.cpp
+++ b/dom/media/MediaRecorder.cpp
@@ -1001,17 +1001,17 @@ MediaRecorder::MediaRecorder(AudioNode&
// union stream in recorder session won't be able to copy data from the
// stream of non-destination node. Create a pipe stream in this case.
if (aSrcAudioNode.NumberOfOutputs() > 0) {
AudioContext* ctx = aSrcAudioNode.Context();
AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
AudioNodeStream::Flags flags =
AudioNodeStream::EXTERNAL_OUTPUT |
AudioNodeStream::NEED_MAIN_THREAD_FINISHED;
- mPipeStream = AudioNodeStream::Create(ctx, engine, flags);
+ mPipeStream = AudioNodeStream::Create(ctx, engine, flags, ctx->Graph());
AudioNodeStream* ns = aSrcAudioNode.GetStream();
if (ns) {
mInputPort =
mPipeStream->AllocateInputPort(aSrcAudioNode.GetStream(),
TRACK_ANY, TRACK_ANY,
0, aSrcOutput);
}
}
--- a/dom/media/webaudio/AnalyserNode.cpp
+++ b/dom/media/webaudio/AnalyserNode.cpp
@@ -108,17 +108,18 @@ AnalyserNode::AnalyserNode(AudioContext*
ChannelInterpretation::Speakers)
, mAnalysisBlock(2048)
, mMinDecibels(-100.)
, mMaxDecibels(-30.)
, mSmoothingTimeConstant(.8)
{
mStream = AudioNodeStream::Create(aContext,
new AnalyserNodeEngine(this),
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
// Enough chunks must be recorded to handle the case of fftSize being
// increased to maximum immediately before getFloatTimeDomainData() is
// called, for example.
Unused << mChunks.SetLength(CHUNK_COUNT, fallible);
AllocateBuffer();
}
--- a/dom/media/webaudio/AudioBufferSourceNode.cpp
+++ b/dom/media/webaudio/AudioBufferSourceNode.cpp
@@ -597,17 +597,18 @@ AudioBufferSourceNode::AudioBufferSource
// mOffset and mDuration are initialized in Start().
, mPlaybackRate(new AudioParam(this, PLAYBACKRATE, 1.0f, "playbackRate"))
, mDetune(new AudioParam(this, DETUNE, 0.0f, "detune"))
, mLoop(false)
, mStartCalled(false)
{
AudioBufferSourceNodeEngine* engine = new AudioBufferSourceNodeEngine(this, aContext->Destination());
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NEED_MAIN_THREAD_FINISHED);
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
+ aContext->Graph());
engine->SetSourceStream(mStream);
mStream->AddMainThreadListener(this);
}
AudioBufferSourceNode::~AudioBufferSourceNode()
{
}
--- a/dom/media/webaudio/AudioNodeStream.cpp
+++ b/dom/media/webaudio/AudioNodeStream.cpp
@@ -66,30 +66,30 @@ AudioNodeStream::DestroyImpl()
ProcessedMediaStream::DestroyImpl();
}
/* static */ already_AddRefed<AudioNodeStream>
AudioNodeStream::Create(AudioContext* aCtx, AudioNodeEngine* aEngine,
Flags aFlags, MediaStreamGraph* aGraph)
{
MOZ_ASSERT(NS_IsMainThread());
+ MOZ_RELEASE_ASSERT(aGraph);
// MediaRecorders use an AudioNodeStream, but no AudioNode
AudioNode* node = aEngine->NodeMainThread();
- MediaStreamGraph* graph = aGraph ? aGraph : aCtx->Graph();
RefPtr<AudioNodeStream> stream =
- new AudioNodeStream(aEngine, aFlags, graph->GraphRate());
+ new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate());
stream->mSuspendedCount += aCtx->ShouldSuspendNewStream();
if (node) {
stream->SetChannelMixingParametersImpl(node->ChannelCount(),
node->ChannelCountModeValue(),
node->ChannelInterpretationValue());
}
- graph->AddStream(stream);
+ aGraph->AddStream(stream);
return stream.forget();
}
size_t
AudioNodeStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
size_t amount = 0;
--- a/dom/media/webaudio/AudioNodeStream.h
+++ b/dom/media/webaudio/AudioNodeStream.h
@@ -57,23 +57,22 @@ public:
// Internal AudioNodeStreams can only pass their output to another
// AudioNode, whereas external AudioNodeStreams can pass their output
// to other ProcessedMediaStreams or hardware audio output.
EXTERNAL_OUTPUT = 1U << 2,
};
/**
* Create a stream that will process audio for an AudioNode.
* Takes ownership of aEngine.
- * If aGraph is non-null, use that as the MediaStreamGraph, otherwise use
- * aCtx's graph. aGraph is only non-null when called for AudioDestinationNode
- * since the context's graph hasn't been set up in that case.
+ * aGraph is required and equals the graph of aCtx in most cases. An exception
+ * is AudioDestinationNode where the context's graph hasn't been set up yet.
*/
static already_AddRefed<AudioNodeStream>
Create(AudioContext* aCtx, AudioNodeEngine* aEngine, Flags aKind,
- MediaStreamGraph* aGraph = nullptr);
+ MediaStreamGraph* aGraph);
protected:
/**
* Transfers ownership of aEngine to the new AudioNodeStream.
*/
AudioNodeStream(AudioNodeEngine* aEngine,
Flags aFlags,
TrackRate aSampleRate);
--- a/dom/media/webaudio/AudioParam.cpp
+++ b/dom/media/webaudio/AudioParam.cpp
@@ -86,17 +86,18 @@ AudioParam::Stream()
{
if (mStream) {
return mStream;
}
AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
RefPtr<AudioNodeStream> stream =
AudioNodeStream::Create(mNode->Context(), engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ mNode->Context()->Graph());
// Force the input to have only one channel, and make it down-mix using
// the speaker rules if needed.
stream->SetChannelMixingParametersImpl(1, ChannelCountMode::Explicit, ChannelInterpretation::Speakers);
// Mark as an AudioParam helper stream
stream->SetAudioParamHelperStream();
mStream = stream.forget();
--- a/dom/media/webaudio/BiquadFilterNode.cpp
+++ b/dom/media/webaudio/BiquadFilterNode.cpp
@@ -254,17 +254,18 @@ BiquadFilterNode::BiquadFilterNode(Audio
350.f, "frequency"))
, mDetune(new AudioParam(this, BiquadFilterNodeEngine::DETUNE, 0.f, "detune"))
, mQ(new AudioParam(this, BiquadFilterNodeEngine::Q, 1.f, "Q"))
, mGain(new AudioParam(this, BiquadFilterNodeEngine::GAIN, 0.f, "gain"))
{
uint64_t windowID = aContext->GetParentObject()->WindowID();
BiquadFilterNodeEngine* engine = new BiquadFilterNodeEngine(this, aContext->Destination(), windowID);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
BiquadFilterNode::~BiquadFilterNode()
{
}
size_t
BiquadFilterNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/ChannelMergerNode.cpp
+++ b/dom/media/webaudio/ChannelMergerNode.cpp
@@ -66,17 +66,18 @@ ChannelMergerNode::ChannelMergerNode(Aud
: AudioNode(aContext,
1,
ChannelCountMode::Explicit,
ChannelInterpretation::Speakers)
, mInputCount(aInputCount)
{
mStream = AudioNodeStream::Create(aContext,
new ChannelMergerNodeEngine(this),
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
ChannelMergerNode::~ChannelMergerNode()
{
}
JSObject*
ChannelMergerNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
--- a/dom/media/webaudio/ChannelSplitterNode.cpp
+++ b/dom/media/webaudio/ChannelSplitterNode.cpp
@@ -57,17 +57,18 @@ ChannelSplitterNode::ChannelSplitterNode
: AudioNode(aContext,
2,
ChannelCountMode::Max,
ChannelInterpretation::Speakers)
, mOutputCount(aOutputCount)
{
mStream = AudioNodeStream::Create(aContext,
new ChannelSplitterNodeEngine(this),
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
ChannelSplitterNode::~ChannelSplitterNode()
{
}
JSObject*
ChannelSplitterNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
--- a/dom/media/webaudio/ConvolverNode.cpp
+++ b/dom/media/webaudio/ConvolverNode.cpp
@@ -195,17 +195,18 @@ ConvolverNode::ConvolverNode(AudioContex
: AudioNode(aContext,
2,
ChannelCountMode::Clamped_max,
ChannelInterpretation::Speakers)
, mNormalize(true)
{
ConvolverNodeEngine* engine = new ConvolverNodeEngine(this, mNormalize);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
ConvolverNode::~ConvolverNode()
{
}
size_t
ConvolverNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/DelayNode.cpp
+++ b/dom/media/webaudio/DelayNode.cpp
@@ -197,17 +197,18 @@ DelayNode::DelayNode(AudioContext* aCont
ChannelCountMode::Max,
ChannelInterpretation::Speakers)
, mDelay(new AudioParam(this, DelayNodeEngine::DELAY, 0.0f, "delayTime"))
{
DelayNodeEngine* engine =
new DelayNodeEngine(this, aContext->Destination(),
aContext->SampleRate() * aMaxDelay);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
DelayNode::~DelayNode()
{
}
size_t
DelayNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/DynamicsCompressorNode.cpp
+++ b/dom/media/webaudio/DynamicsCompressorNode.cpp
@@ -196,17 +196,18 @@ DynamicsCompressorNode::DynamicsCompress
, mReduction(0)
, mAttack(new AudioParam(this, DynamicsCompressorNodeEngine::ATTACK,
0.003f, "attack"))
, mRelease(new AudioParam(this, DynamicsCompressorNodeEngine::RELEASE,
0.25f, "release"))
{
DynamicsCompressorNodeEngine* engine = new DynamicsCompressorNodeEngine(this, aContext->Destination());
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
DynamicsCompressorNode::~DynamicsCompressorNode()
{
}
size_t
DynamicsCompressorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/GainNode.cpp
+++ b/dom/media/webaudio/GainNode.cpp
@@ -119,17 +119,18 @@ GainNode::GainNode(AudioContext* aContex
: AudioNode(aContext,
2,
ChannelCountMode::Max,
ChannelInterpretation::Speakers)
, mGain(new AudioParam(this, GainNodeEngine::GAIN, 1.0f, "gain"))
{
GainNodeEngine* engine = new GainNodeEngine(this, aContext->Destination());
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
GainNode::~GainNode()
{
}
size_t
GainNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/IIRFilterNode.cpp
+++ b/dom/media/webaudio/IIRFilterNode.cpp
@@ -159,17 +159,18 @@ IIRFilterNode::IIRFilterNode(AudioContex
}
// We check that this is exactly equal to one later in blink/IIRFilter.cpp
elements[0] = 1.0;
uint64_t windowID = aContext->GetParentObject()->WindowID();
IIRFilterNodeEngine* engine = new IIRFilterNodeEngine(this, aContext->Destination(), mFeedforward, mFeedback, windowID);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
IIRFilterNode::~IIRFilterNode()
{
}
size_t
IIRFilterNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -44,17 +44,18 @@ MediaStreamAudioDestinationNode::MediaSt
MediaSegment::AUDIO, source,
MediaTrackConstraints());
mDOMStream->AddTrackInternal(track);
ProcessedMediaStream* outputStream = mDOMStream->GetInputStream()->AsProcessedStream();
MOZ_ASSERT(!!outputStream);
AudioNodeEngine* engine = new AudioNodeEngine(this);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::EXTERNAL_OUTPUT);
+ AudioNodeStream::EXTERNAL_OUTPUT,
+ aContext->Graph());
mPort = outputStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK);
}
MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode()
{
}
size_t
--- a/dom/media/webaudio/OscillatorNode.cpp
+++ b/dom/media/webaudio/OscillatorNode.cpp
@@ -415,17 +415,18 @@ OscillatorNode::OscillatorNode(AudioCont
, mType(OscillatorType::Sine)
, mFrequency(new AudioParam(this, OscillatorNodeEngine::FREQUENCY,
440.0f, "frequency"))
, mDetune(new AudioParam(this, OscillatorNodeEngine::DETUNE, 0.0f, "detune"))
, mStartCalled(false)
{
OscillatorNodeEngine* engine = new OscillatorNodeEngine(this, aContext->Destination());
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NEED_MAIN_THREAD_FINISHED);
+ AudioNodeStream::NEED_MAIN_THREAD_FINISHED,
+ aContext->Graph());
engine->SetSourceStream(mStream);
mStream->AddMainThreadListener(this);
}
OscillatorNode::~OscillatorNode()
{
}
--- a/dom/media/webaudio/PannerNode.cpp
+++ b/dom/media/webaudio/PannerNode.cpp
@@ -310,17 +310,18 @@ PannerNode::PannerNode(AudioContext* aCo
, mMaxDistance(10000.)
, mRolloffFactor(1.)
, mConeInnerAngle(360.)
, mConeOuterAngle(360.)
, mConeOuterGain(0.)
{
mStream = AudioNodeStream::Create(aContext,
new PannerNodeEngine(this, aContext->Destination()),
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
// We should register once we have set up our stream and engine.
Context()->Listener()->RegisterPannerNode(this);
}
PannerNode::~PannerNode()
{
if (Context()) {
Context()->UnregisterPannerNode(this);
--- a/dom/media/webaudio/ScriptProcessorNode.cpp
+++ b/dom/media/webaudio/ScriptProcessorNode.cpp
@@ -499,17 +499,18 @@ ScriptProcessorNode::ScriptProcessorNode
{
MOZ_ASSERT(BufferSize() % WEBAUDIO_BLOCK_SIZE == 0, "Invalid buffer size");
ScriptProcessorNodeEngine* engine =
new ScriptProcessorNodeEngine(this,
aContext->Destination(),
BufferSize(),
aNumberOfInputChannels);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
ScriptProcessorNode::~ScriptProcessorNode()
{
}
size_t
ScriptProcessorNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/StereoPannerNode.cpp
+++ b/dom/media/webaudio/StereoPannerNode.cpp
@@ -174,17 +174,18 @@ StereoPannerNode::StereoPannerNode(Audio
: AudioNode(aContext,
2,
ChannelCountMode::Clamped_max,
ChannelInterpretation::Speakers)
, mPan(new AudioParam(this, StereoPannerNodeEngine::PAN, 0.f, "pan"))
{
StereoPannerNodeEngine* engine = new StereoPannerNodeEngine(this, aContext->Destination());
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
StereoPannerNode::~StereoPannerNode()
{
}
size_t
StereoPannerNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
--- a/dom/media/webaudio/WaveShaperNode.cpp
+++ b/dom/media/webaudio/WaveShaperNode.cpp
@@ -317,17 +317,18 @@ WaveShaperNode::WaveShaperNode(AudioCont
ChannelInterpretation::Speakers)
, mCurve(nullptr)
, mType(OverSampleType::None)
{
mozilla::HoldJSObjects(this);
WaveShaperNodeEngine* engine = new WaveShaperNodeEngine(this);
mStream = AudioNodeStream::Create(aContext, engine,
- AudioNodeStream::NO_STREAM_FLAGS);
+ AudioNodeStream::NO_STREAM_FLAGS,
+ aContext->Graph());
}
WaveShaperNode::~WaveShaperNode()
{
ClearCurve();
}
void