diff --git a/dom/media/webaudio/ConvolverNode.cpp b/dom/media/webaudio/ConvolverNode.cpp index 6471a91a6a16..522ee768c507 100644 --- a/dom/media/webaudio/ConvolverNode.cpp +++ b/dom/media/webaudio/ConvolverNode.cpp @@ -88,56 +88,7 @@ public: GraphTime aFrom, const AudioBlock& aInput, AudioBlock* aOutput, - bool* aFinished) override - { - if (!mReverb) { - aOutput->SetNull(WEBAUDIO_BLOCK_SIZE); - return; - } - - AudioBlock input = aInput; - if (aInput.IsNull()) { - if (mLeftOverData > 0) { - mLeftOverData -= WEBAUDIO_BLOCK_SIZE; - input.AllocateChannels(1); - WriteZeroesToAudioBlock(&input, 0, WEBAUDIO_BLOCK_SIZE); - } else { - if (mLeftOverData != INT32_MIN) { - mLeftOverData = INT32_MIN; - aStream->ScheduleCheckForInactive(); - RefPtr refchanged = - new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE); - aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate( - refchanged.forget()); - } - aOutput->SetNull(WEBAUDIO_BLOCK_SIZE); - return; - } - } else { - if (aInput.mVolume != 1.0f) { - // Pre-multiply the input's volume - uint32_t numChannels = aInput.ChannelCount(); - input.AllocateChannels(numChannels); - for (uint32_t i = 0; i < numChannels; ++i) { - const float* src = static_cast(aInput.mChannelData[i]); - float* dest = input.ChannelFloatsForWrite(i); - AudioBlockCopyChannelWithScale(src, aInput.mVolume, dest); - } - } - - if (mLeftOverData <= 0) { - RefPtr refchanged = - new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF); - aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate( - refchanged.forget()); - } - mLeftOverData = mReverb->impulseResponseLength(); - MOZ_ASSERT(mLeftOverData > 0); - } - aOutput->AllocateChannels(2); - - mReverb->process(&input, aOutput); - } + bool* aFinished) override; bool IsActive() const override { @@ -168,6 +119,62 @@ private: bool mNormalize; }; +void +ConvolverNodeEngine::ProcessBlock(AudioNodeStream* aStream, + GraphTime aFrom, + const AudioBlock& aInput, + AudioBlock* aOutput, + bool* aFinished) +{ + if (!mReverb) { + aOutput->SetNull(WEBAUDIO_BLOCK_SIZE); + return; + } + + AudioBlock input = aInput; + if (aInput.IsNull()) { + if (mLeftOverData > 0) { + mLeftOverData -= WEBAUDIO_BLOCK_SIZE; + input.AllocateChannels(1); + WriteZeroesToAudioBlock(&input, 0, WEBAUDIO_BLOCK_SIZE); + } else { + if (mLeftOverData != INT32_MIN) { + mLeftOverData = INT32_MIN; + aStream->ScheduleCheckForInactive(); + RefPtr refchanged = + new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE); + aStream->Graph()-> + DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget()); + } + aOutput->SetNull(WEBAUDIO_BLOCK_SIZE); + return; + } + } else { + if (aInput.mVolume != 1.0f) { + // Pre-multiply the input's volume + uint32_t numChannels = aInput.ChannelCount(); + input.AllocateChannels(numChannels); + for (uint32_t i = 0; i < numChannels; ++i) { + const float* src = static_cast(aInput.mChannelData[i]); + float* dest = input.ChannelFloatsForWrite(i); + AudioBlockCopyChannelWithScale(src, aInput.mVolume, dest); + } + } + + if (mLeftOverData <= 0) { + RefPtr refchanged = + new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF); + aStream->Graph()-> + DispatchToMainThreadAfterStreamStateUpdate(refchanged.forget()); + } + mLeftOverData = mReverb->impulseResponseLength(); + MOZ_ASSERT(mLeftOverData > 0); + } + aOutput->AllocateChannels(2); + + mReverb->process(&input, aOutput); +} + ConvolverNode::ConvolverNode(AudioContext* aContext) : AudioNode(aContext, 2,