michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:set ts=2 sw=2 sts=2 et cindent: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "MediaStreamAudioSourceNode.h" michael@0: #include "mozilla/dom/MediaStreamAudioSourceNodeBinding.h" michael@0: #include "AudioNodeEngine.h" michael@0: #include "AudioNodeExternalInputStream.h" michael@0: #include "DOMMediaStream.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_CLASS(MediaStreamAudioSourceNode) michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaStreamAudioSourceNode) michael@0: NS_IMPL_CYCLE_COLLECTION_UNLINK(mInputStream) michael@0: NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(AudioNode) michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaStreamAudioSourceNode, AudioNode) michael@0: NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInputStream) michael@0: NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END michael@0: michael@0: NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamAudioSourceNode) michael@0: NS_INTERFACE_MAP_END_INHERITING(AudioNode) michael@0: michael@0: NS_IMPL_ADDREF_INHERITED(MediaStreamAudioSourceNode, AudioNode) michael@0: NS_IMPL_RELEASE_INHERITED(MediaStreamAudioSourceNode, AudioNode) michael@0: michael@0: MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(AudioContext* aContext, michael@0: DOMMediaStream* aMediaStream) michael@0: : AudioNode(aContext, michael@0: 2, michael@0: ChannelCountMode::Max, michael@0: ChannelInterpretation::Speakers), michael@0: mInputStream(aMediaStream) michael@0: { michael@0: AudioNodeEngine* engine = new AudioNodeEngine(this); michael@0: mStream = aContext->Graph()->CreateAudioNodeExternalInputStream(engine); michael@0: ProcessedMediaStream* outputStream = static_cast(mStream.get()); michael@0: mInputPort = outputStream->AllocateInputPort(aMediaStream->GetStream(), michael@0: MediaInputPort::FLAG_BLOCK_INPUT); michael@0: mInputStream->AddConsumerToKeepAlive(this); michael@0: } michael@0: michael@0: MediaStreamAudioSourceNode::~MediaStreamAudioSourceNode() michael@0: { michael@0: } michael@0: michael@0: size_t michael@0: MediaStreamAudioSourceNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const michael@0: { michael@0: // Future: michael@0: // - mInputStream michael@0: size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf); michael@0: amount += mInputPort->SizeOfIncludingThis(aMallocSizeOf); michael@0: return amount; michael@0: } michael@0: michael@0: size_t michael@0: MediaStreamAudioSourceNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const michael@0: { michael@0: return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); michael@0: } michael@0: michael@0: void michael@0: MediaStreamAudioSourceNode::DestroyMediaStream() michael@0: { michael@0: if (mInputPort) { michael@0: mInputPort->Destroy(); michael@0: mInputPort = nullptr; michael@0: } michael@0: AudioNode::DestroyMediaStream(); michael@0: } michael@0: michael@0: JSObject* michael@0: MediaStreamAudioSourceNode::WrapObject(JSContext* aCx) michael@0: { michael@0: return MediaStreamAudioSourceNodeBinding::Wrap(aCx, this); michael@0: } michael@0: michael@0: } michael@0: } michael@0: