summaryrefslogtreecommitdiffstats
path: root/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webaudio/MediaStreamAudioDestinationNode.cpp')
-rw-r--r--dom/media/webaudio/MediaStreamAudioDestinationNode.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
new file mode 100644
index 000000000..d8c732e47
--- /dev/null
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaStreamAudioDestinationNode.h"
+#include "nsIDocument.h"
+#include "mozilla/dom/MediaStreamAudioDestinationNodeBinding.h"
+#include "AudioNodeEngine.h"
+#include "AudioNodeStream.h"
+#include "DOMMediaStream.h"
+#include "MediaStreamTrack.h"
+#include "TrackUnionStream.h"
+
+namespace mozilla {
+namespace dom {
+
+class AudioDestinationTrackSource :
+ public MediaStreamTrackSource
+{
+public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+
+ AudioDestinationTrackSource(MediaStreamAudioDestinationNode* aNode,
+ nsIPrincipal* aPrincipal)
+ : MediaStreamTrackSource(aPrincipal, nsString())
+ , mNode(aNode)
+ {
+ }
+
+ void Destroy() override
+ {
+ if (mNode) {
+ mNode->DestroyMediaStream();
+ mNode = nullptr;
+ }
+ }
+
+ MediaSourceEnum GetMediaSource() const override
+ {
+ return MediaSourceEnum::AudioCapture;
+ }
+
+ void Stop() override
+ {
+ Destroy();
+ }
+
+private:
+ virtual ~AudioDestinationTrackSource() {}
+
+ RefPtr<MediaStreamAudioDestinationNode> mNode;
+};
+
+NS_IMPL_ADDREF_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+NS_IMPL_RELEASE_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioDestinationTrackSource)
+NS_INTERFACE_MAP_END_INHERITING(MediaStreamTrackSource)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(AudioDestinationTrackSource,
+ MediaStreamTrackSource,
+ mNode)
+
+NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaStreamAudioDestinationNode, AudioNode, mDOMStream)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaStreamAudioDestinationNode)
+NS_INTERFACE_MAP_END_INHERITING(AudioNode)
+
+NS_IMPL_ADDREF_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
+NS_IMPL_RELEASE_INHERITED(MediaStreamAudioDestinationNode, AudioNode)
+
+MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* aContext)
+ : AudioNode(aContext,
+ 2,
+ ChannelCountMode::Explicit,
+ ChannelInterpretation::Speakers)
+ , mDOMStream(
+ DOMAudioNodeMediaStream::CreateTrackUnionStreamAsInput(GetOwner(),
+ this,
+ aContext->Graph()))
+{
+ // Ensure an audio track with the correct ID is exposed to JS
+ nsIDocument* doc = aContext->GetParentObject()->GetExtantDoc();
+ RefPtr<MediaStreamTrackSource> source =
+ new AudioDestinationTrackSource(this, doc->NodePrincipal());
+ RefPtr<MediaStreamTrack> track =
+ mDOMStream->CreateDOMTrack(AudioNodeStream::AUDIO_TRACK,
+ 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,
+ aContext->Graph());
+ mPort = outputStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK);
+}
+
+MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode()
+{
+}
+
+size_t
+MediaStreamAudioDestinationNode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ // Future:
+ // - mDOMStream
+ size_t amount = AudioNode::SizeOfExcludingThis(aMallocSizeOf);
+ amount += mPort->SizeOfIncludingThis(aMallocSizeOf);
+ return amount;
+}
+
+size_t
+MediaStreamAudioDestinationNode::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
+{
+ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
+}
+
+void
+MediaStreamAudioDestinationNode::DestroyMediaStream()
+{
+ AudioNode::DestroyMediaStream();
+ if (mPort) {
+ mPort->Destroy();
+ mPort = nullptr;
+ }
+}
+
+JSObject*
+MediaStreamAudioDestinationNode::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return MediaStreamAudioDestinationNodeBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla