diff --git a/dom/media/webaudio/AnalyserNode.cpp b/dom/media/webaudio/AnalyserNode.cpp index 35d6c9b35161..0027ce3a78ad 100644 --- a/dom/media/webaudio/AnalyserNode.cpp +++ b/dom/media/webaudio/AnalyserNode.cpp @@ -83,6 +83,11 @@ public: NS_DispatchToMainThread(transfer); } + virtual bool IsActive() const override + { + return mChunksToProcess != 0; + } + virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); diff --git a/dom/media/webaudio/AudioBufferSourceNode.cpp b/dom/media/webaudio/AudioBufferSourceNode.cpp index 0d165058dd5f..6ce49abd4f8b 100644 --- a/dom/media/webaudio/AudioBufferSourceNode.cpp +++ b/dom/media/webaudio/AudioBufferSourceNode.cpp @@ -508,6 +508,12 @@ public: } } + virtual bool IsActive() const override + { + // Whether buffer has been set and start() has been called. + return mBufferSampleRate != 0; + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { // Not owned: diff --git a/dom/media/webaudio/AudioDestinationNode.cpp b/dom/media/webaudio/AudioDestinationNode.cpp index 16071cb8b5c2..6b0326bea7d0 100644 --- a/dom/media/webaudio/AudioDestinationNode.cpp +++ b/dom/media/webaudio/AudioDestinationNode.cpp @@ -112,6 +112,14 @@ public: } } + virtual bool IsActive() const override + { + // Keep processing to track stream time, which is used for all timelines + // associated with the same AudioContext. + return true; + } + + class OnCompleteTask final : public nsRunnable { public: @@ -255,6 +263,16 @@ public: } } + virtual bool IsActive() const override + { + // Keep processing to track stream time, which is used for all timelines + // associated with the same AudioContext. If there are no other engines + // for the AudioContext, then this could return false to suspend the + // stream, but the stream is blocked anyway through + // AudioDestinationNode::SetIsOnlyNodeForContext(). + return true; + } + virtual void SetDoubleParameter(uint32_t aIndex, double aParam) override { if (aIndex == VOLUME) { diff --git a/dom/media/webaudio/AudioNodeEngine.h b/dom/media/webaudio/AudioNodeEngine.h index c3ae9dbd1367..f00f045dacd0 100644 --- a/dom/media/webaudio/AudioNodeEngine.h +++ b/dom/media/webaudio/AudioNodeEngine.h @@ -346,6 +346,12 @@ public: OutputChunks& aOutput, bool* aFinished); + // IsActive() returns true if the engine needs to continue processing an + // unfinished stream even when it has silent or no input connections. This + // includes tail-times and when sources have been scheduled to start. If + // returning false, then the stream can be suspended. + virtual bool IsActive() const { return false; } + bool HasNode() const { MOZ_ASSERT(NS_IsMainThread()); diff --git a/dom/media/webaudio/BiquadFilterNode.cpp b/dom/media/webaudio/BiquadFilterNode.cpp index ab4ce6455996..c657b7bff2bb 100644 --- a/dom/media/webaudio/BiquadFilterNode.cpp +++ b/dom/media/webaudio/BiquadFilterNode.cpp @@ -211,6 +211,11 @@ public: } } + virtual bool IsActive() const override + { + return !mBiquads.IsEmpty(); + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { // Not owned: diff --git a/dom/media/webaudio/ConvolverNode.cpp b/dom/media/webaudio/ConvolverNode.cpp index 9dcdcecb5655..d54fe97380ba 100644 --- a/dom/media/webaudio/ConvolverNode.cpp +++ b/dom/media/webaudio/ConvolverNode.cpp @@ -154,6 +154,11 @@ public: mReverb->process(&input, aOutput, WEBAUDIO_BLOCK_SIZE); } + virtual bool IsActive() const override + { + return mLeftOverData != INT32_MIN; + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf); diff --git a/dom/media/webaudio/DelayNode.cpp b/dom/media/webaudio/DelayNode.cpp index 10afd3445f72..18d61ca33290 100644 --- a/dom/media/webaudio/DelayNode.cpp +++ b/dom/media/webaudio/DelayNode.cpp @@ -161,6 +161,11 @@ public: mHaveProducedBeforeInput = true; } + virtual bool IsActive() const override + { + return mLeftOverData != INT32_MIN; + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf); diff --git a/dom/media/webaudio/OscillatorNode.cpp b/dom/media/webaudio/OscillatorNode.cpp index bd516b89ee30..1a18e0ddce0d 100644 --- a/dom/media/webaudio/OscillatorNode.cpp +++ b/dom/media/webaudio/OscillatorNode.cpp @@ -330,6 +330,12 @@ public: } + virtual bool IsActive() const override + { + // start() has been called. + return mStart != -1; + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { size_t amount = AudioNodeEngine::SizeOfExcludingThis(aMallocSizeOf); diff --git a/dom/media/webaudio/PannerNode.cpp b/dom/media/webaudio/PannerNode.cpp index 842258ab48f2..40a7a572dd97 100644 --- a/dom/media/webaudio/PannerNode.cpp +++ b/dom/media/webaudio/PannerNode.cpp @@ -172,6 +172,11 @@ public: (this->*mPanningModelFunction)(aInput, aOutput); } + virtual bool IsActive() const override + { + return mLeftOverData != INT_MIN; + } + void ComputeAzimuthAndElevation(float& aAzimuth, float& aElevation); float ComputeConeGain(); // Compute how much the distance contributes to the gain reduction. diff --git a/dom/media/webaudio/ScriptProcessorNode.cpp b/dom/media/webaudio/ScriptProcessorNode.cpp index 17a944ece018..587475ccd211 100644 --- a/dom/media/webaudio/ScriptProcessorNode.cpp +++ b/dom/media/webaudio/ScriptProcessorNode.cpp @@ -333,6 +333,14 @@ public: } } + virtual bool IsActive() const override + { + // Could return false when !mIsConnected after all output chunks produced + // by main thread events calling + // SharedBuffers::FinishProducingOutputBuffer() have been processed. + return true; + } + virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override { // Not owned: