Bug 1301675 - Implement AudioDestinationTrackSource. r?padenot draft
authorAndreas Pehrson <pehrsons@gmail.com>
Fri, 16 Sep 2016 11:25:38 +0200
changeset 432221 a1ff0b48cde6209a2c714880b694b8fa6f527b7c
parent 432220 a193e05c53d16ded50ad8058dd448d2b0f75f07b
child 432222 07ee983c15074517fdadcda54f4bcae827f87b6f
push id34235
push userbmo:pehrson@telenordigital.com
push dateTue, 01 Nov 2016 13:40:03 +0000
reviewerspadenot
bugs1301675
milestone52.0a1
Bug 1301675 - Implement AudioDestinationTrackSource. r?padenot So stop()ing the output track can clean up the destination node. MozReview-Commit-ID: CmMXRCpOeFY
dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
--- a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
+++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp
@@ -11,16 +11,65 @@
 #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)
 
@@ -32,18 +81,17 @@ MediaStreamAudioDestinationNode::MediaSt
   , 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 BasicUnstoppableTrackSource(doc->NodePrincipal(),
-                                    MediaSourceEnum::AudioCapture);
+    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);