diff --git a/dom/media/webaudio/AudioContext.cpp b/dom/media/webaudio/AudioContext.cpp index 69a5d62260..e3aaa21e3e 100755 --- a/dom/media/webaudio/AudioContext.cpp +++ b/dom/media/webaudio/AudioContext.cpp @@ -315,18 +315,8 @@ bool IsValidBufferSize(uint32_t aBufferSize) { already_AddRefed AudioContext::CreateMediaStreamDestination(ErrorResult& aRv) { - if (mIsOffline) { - aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); - return nullptr; - } - - if (CheckClosed(aRv)) { - return nullptr; - } - - RefPtr node = - new MediaStreamAudioDestinationNode(this); - return node.forget(); + return MediaStreamAudioDestinationNode::Create(*this, AudioNodeOptions(), + aRv); } already_AddRefed diff --git a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp index a2b548a5ae..8ee326739e 100644 --- a/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp +++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.cpp @@ -15,7 +15,7 @@ namespace mozilla { namespace dom { -class AudioDestinationTrackSource : +class AudioDestinationTrackSource final : public MediaStreamTrackSource { public: @@ -49,7 +49,7 @@ public: } private: - virtual ~AudioDestinationTrackSource() {} + ~AudioDestinationTrackSource() = default; RefPtr mNode; }; @@ -101,8 +101,29 @@ MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* a mPort = outputStream->AllocateInputPort(mStream, AudioNodeStream::AUDIO_TRACK); } -MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode() +/* static */ already_AddRefed +MediaStreamAudioDestinationNode::Create(AudioContext& aAudioContext, + const AudioNodeOptions& aOptions, + ErrorResult& aRv) { + if (aAudioContext.IsOffline()) { + aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); + return nullptr; + } + + if (aAudioContext.CheckClosed(aRv)) { + return nullptr; + } + + RefPtr audioNode = + new MediaStreamAudioDestinationNode(&aAudioContext); + + audioNode->Initialize(aOptions, aRv); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + return audioNode.forget(); } size_t diff --git a/dom/media/webaudio/MediaStreamAudioDestinationNode.h b/dom/media/webaudio/MediaStreamAudioDestinationNode.h index 423d16875d..56b7295263 100644 --- a/dom/media/webaudio/MediaStreamAudioDestinationNode.h +++ b/dom/media/webaudio/MediaStreamAudioDestinationNode.h @@ -11,14 +11,26 @@ namespace mozilla { namespace dom { +class AudioContext; +struct AudioNodeOptions; + class MediaStreamAudioDestinationNode final : public AudioNode { public: - explicit MediaStreamAudioDestinationNode(AudioContext* aContext); + static already_AddRefed + Create(AudioContext& aAudioContext, const AudioNodeOptions& aOptions, + ErrorResult& aRv); NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamAudioDestinationNode, AudioNode) + static already_AddRefed + Constructor(const GlobalObject& aGlobal, AudioContext& aAudioContext, + const AudioNodeOptions& aOptions, ErrorResult& aRv) + { + return Create(aAudioContext, aOptions, aRv); + } + JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; uint16_t NumberOfOutputs() const final override @@ -41,10 +53,10 @@ public: size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override; size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override; -protected: - virtual ~MediaStreamAudioDestinationNode(); - private: + explicit MediaStreamAudioDestinationNode(AudioContext* aContext); + ~MediaStreamAudioDestinationNode() = default; + RefPtr mDOMStream; RefPtr mPort; }; diff --git a/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html b/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html index 5aa1a79105..aee0548e9f 100644 --- a/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html +++ b/dom/media/webaudio/test/test_mediaStreamAudioDestinationNode.html @@ -23,7 +23,7 @@ addLoadEvent(function() { var source = context.createBufferSource(); source.buffer = buffer; - var dest = context.createMediaStreamDestination(); + var dest = new MediaStreamAudioDestinationNode(context); source.connect(dest); var elem = document.getElementById('audioelem'); diff --git a/dom/webidl/MediaStreamAudioDestinationNode.webidl b/dom/webidl/MediaStreamAudioDestinationNode.webidl index aafff964ee..9776ab994f 100644 --- a/dom/webidl/MediaStreamAudioDestinationNode.webidl +++ b/dom/webidl/MediaStreamAudioDestinationNode.webidl @@ -10,9 +10,8 @@ * liability, trademark and document use rules apply. */ -[Pref="dom.webaudio.enabled"] +[Pref="dom.webaudio.enabled", + Constructor(AudioContext context, optional AudioNodeOptions options)] interface MediaStreamAudioDestinationNode : AudioNode { - readonly attribute MediaStream stream; - };