ScriptProcessorNode.h (4469B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 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 ScriptProcessorNode_h_ 8 #define ScriptProcessorNode_h_ 9 10 #include "AudioNode.h" 11 #include "mozilla/ErrorResult.h" 12 13 namespace mozilla::dom { 14 15 class AudioContext; 16 class SharedBuffers; 17 18 class ScriptProcessorNode final : public AudioNode { 19 public: 20 ScriptProcessorNode(AudioContext* aContext, uint32_t aBufferSize, 21 uint32_t aNumberOfInputChannels, 22 uint32_t aNumberOfOutputChannels); 23 24 NS_INLINE_DECL_REFCOUNTING_INHERITED(ScriptProcessorNode, AudioNode) 25 26 IMPL_EVENT_HANDLER(audioprocess) 27 28 using EventTarget::EventListenerAdded; 29 void EventListenerAdded(nsAtom* aType) override; 30 31 using EventTarget::EventListenerRemoved; 32 void EventListenerRemoved(nsAtom* aType) override; 33 34 JSObject* WrapObject(JSContext* aCx, 35 JS::Handle<JSObject*> aGivenProto) override; 36 37 AudioNode* Connect(AudioNode& aDestination, uint32_t aOutput, uint32_t aInput, 38 ErrorResult& aRv) override { 39 AudioNode* node = AudioNode::Connect(aDestination, aOutput, aInput, aRv); 40 if (!aRv.Failed()) { 41 UpdateConnectedStatus(); 42 } 43 return node; 44 } 45 46 void Connect(AudioParam& aDestination, uint32_t aOutput, 47 ErrorResult& aRv) override { 48 AudioNode::Connect(aDestination, aOutput, aRv); 49 if (!aRv.Failed()) { 50 UpdateConnectedStatus(); 51 } 52 } 53 void Disconnect(ErrorResult& aRv) override { 54 AudioNode::Disconnect(aRv); 55 UpdateConnectedStatus(); 56 } 57 void Disconnect(uint32_t aOutput, ErrorResult& aRv) override { 58 AudioNode::Disconnect(aOutput, aRv); 59 UpdateConnectedStatus(); 60 } 61 void NotifyInputsChanged() override { UpdateConnectedStatus(); } 62 void NotifyHasPhantomInput() override { 63 mHasPhantomInput = true; 64 // No need to UpdateConnectedStatus() because there was previously an 65 // input in InputNodes(). 66 } 67 void Disconnect(AudioNode& aDestination, ErrorResult& aRv) override { 68 AudioNode::Disconnect(aDestination, aRv); 69 UpdateConnectedStatus(); 70 } 71 void Disconnect(AudioNode& aDestination, uint32_t aOutput, 72 ErrorResult& aRv) override { 73 AudioNode::Disconnect(aDestination, aOutput, aRv); 74 UpdateConnectedStatus(); 75 } 76 void Disconnect(AudioNode& aDestination, uint32_t aOutput, uint32_t aInput, 77 ErrorResult& aRv) override { 78 AudioNode::Disconnect(aDestination, aOutput, aInput, aRv); 79 UpdateConnectedStatus(); 80 } 81 void Disconnect(AudioParam& aDestination, ErrorResult& aRv) override { 82 AudioNode::Disconnect(aDestination, aRv); 83 UpdateConnectedStatus(); 84 } 85 void Disconnect(AudioParam& aDestination, uint32_t aOutput, 86 ErrorResult& aRv) override { 87 AudioNode::Disconnect(aDestination, aOutput, aRv); 88 UpdateConnectedStatus(); 89 } 90 void SetChannelCount(uint32_t aChannelCount, ErrorResult& aRv) override { 91 if (aChannelCount != ChannelCount()) { 92 // Spec says to throw InvalidStateError, but see 93 // https://github.com/WebAudio/web-audio-api/issues/2153 94 aRv.ThrowNotSupportedError( 95 "Cannot change channel count of ScriptProcessorNode"); 96 } 97 } 98 void SetChannelCountModeValue(ChannelCountMode aMode, 99 ErrorResult& aRv) override { 100 if (aMode != ChannelCountMode::Explicit) { 101 // Spec says to throw InvalidStateError, but see 102 // https://github.com/WebAudio/web-audio-api/issues/2154 103 aRv.ThrowNotSupportedError( 104 "Cannot change channel count mode of ScriptProcessorNode"); 105 } 106 } 107 108 uint32_t BufferSize() const { return mBufferSize; } 109 110 uint32_t NumberOfOutputChannels() const { return mNumberOfOutputChannels; } 111 112 using DOMEventTargetHelper::DispatchTrustedEvent; 113 114 const char* NodeType() const override { return "ScriptProcessorNode"; } 115 116 size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override; 117 size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override; 118 119 private: 120 virtual ~ScriptProcessorNode(); 121 122 void UpdateConnectedStatus(); 123 124 const uint32_t mBufferSize; 125 const uint32_t mNumberOfOutputChannels; 126 bool mHasPhantomInput = false; 127 }; 128 129 } // namespace mozilla::dom 130 131 #endif