MediaStreamTrackAudioSourceNode.h (3474B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef MediaStreamTrackAudioSourceNode_h_ 8 #define MediaStreamTrackAudioSourceNode_h_ 9 10 #include "AudioNode.h" 11 #include "AudioNodeEngine.h" 12 #include "PrincipalChangeObserver.h" 13 #include "mozilla/WeakPtr.h" 14 #include "mozilla/dom/MediaStreamTrack.h" 15 16 namespace mozilla::dom { 17 18 class AudioContext; 19 struct MediaStreamTrackAudioSourceOptions; 20 21 class MediaStreamTrackAudioSourceNodeEngine final : public AudioNodeEngine { 22 public: 23 explicit MediaStreamTrackAudioSourceNodeEngine(AudioNode* aNode) 24 : AudioNodeEngine(aNode), mEnabled(false) {} 25 26 bool IsEnabled() const { return mEnabled; } 27 enum Parameters { ENABLE }; 28 void SetInt32Parameter(uint32_t aIndex, int32_t aValue) override { 29 switch (aIndex) { 30 case ENABLE: 31 mEnabled = !!aValue; 32 break; 33 default: 34 NS_ERROR("MediaStreamTrackAudioSourceNodeEngine bad parameter index"); 35 } 36 } 37 38 private: 39 bool mEnabled; 40 }; 41 42 class MediaStreamTrackAudioSourceNode 43 : public AudioNode, 44 public PrincipalChangeObserver<MediaStreamTrack>, 45 public SupportsWeakPtr { 46 public: 47 static already_AddRefed<MediaStreamTrackAudioSourceNode> Create( 48 AudioContext& aContext, 49 const MediaStreamTrackAudioSourceOptions& aOptions, ErrorResult& aRv); 50 51 NS_DECL_ISUPPORTS_INHERITED 52 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamTrackAudioSourceNode, 53 AudioNode) 54 55 static already_AddRefed<MediaStreamTrackAudioSourceNode> Constructor( 56 const GlobalObject& aGlobal, AudioContext& aAudioContext, 57 const MediaStreamTrackAudioSourceOptions& aOptions, ErrorResult& aRv) { 58 return Create(aAudioContext, aOptions, aRv); 59 } 60 61 JSObject* WrapObject(JSContext* aCx, 62 JS::Handle<JSObject*> aGivenProto) override; 63 64 void DestroyMediaTrack() override; 65 66 uint16_t NumberOfInputs() const override { return 0; } 67 68 const char* NodeType() const override { 69 return "MediaStreamTrackAudioSourceNode"; 70 } 71 72 virtual const char* CrossOriginErrorString() const { 73 return "MediaStreamTrackAudioSourceNodeCrossOrigin"; 74 } 75 76 size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override; 77 size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override; 78 79 // From PrincipalChangeObserver<MediaStreamTrack>. 80 void PrincipalChanged(MediaStreamTrack* aMediaStreamTrack) override; 81 82 protected: 83 explicit MediaStreamTrackAudioSourceNode(AudioContext* aContext); 84 void Init(MediaStreamTrack* aMediaStreamTrack, ErrorResult& aRv); 85 void Destroy(); 86 virtual ~MediaStreamTrackAudioSourceNode(); 87 88 class TrackListener : public MediaStreamTrackConsumer { 89 public: 90 explicit TrackListener(MediaStreamTrackAudioSourceNode* aNode) 91 : mNode(aNode) {} 92 93 void NotifyEnded(MediaStreamTrack* aTrack) override { 94 if (mNode) { 95 mNode->MarkInactive(); 96 mNode->DestroyMediaTrack(); 97 mNode = nullptr; 98 } 99 } 100 101 private: 102 WeakPtr<MediaStreamTrackAudioSourceNode> mNode; 103 }; 104 105 private: 106 RefPtr<MediaInputPort> mInputPort; 107 RefPtr<MediaStreamTrack> mInputTrack; 108 TrackListener mTrackListener; 109 }; 110 111 } // namespace mozilla::dom 112 113 #endif