blob: 4e6d61a51d883b785435ccf1879def96f9e52d3f [file] [log] [blame]
/*
* Copyright (C) 2010, Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_NODE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_NODE_H_
#include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/webaudio/audio_handler.h"
#include "third_party/blink/renderer/modules/webaudio/inspector_helper_mixin.h"
#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
#include "third_party/blink/renderer/platform/heap/prefinalizer.h"
namespace blink {
class BaseAudioContext;
class AudioHandler;
class AudioNodeOptions;
class AudioParam;
class DeferredTaskHandler;
class ExceptionState;
class V8ChannelCountMode;
class V8ChannelInterpretation;
// An AudioNode is the basic building block for handling audio within an
// BaseAudioContext. It may be an audio source, an intermediate processing
// module, or an audio destination. Each AudioNode can have inputs and/or
// outputs. An AudioSourceNode has no inputs and a single output.
// An AudioDestinationNode has one input and no outputs and represents the final
// destination to the audio hardware. Most processing nodes such as filters
// will have one input and one output, although multiple inputs and outputs are
// possible.
// Each of AudioNode objects owns its dedicated AudioHandler object. AudioNode
// is responsible to provide IDL-accessible interface and its lifetime is
// managed by Oilpan GC. AudioHandler is responsible for anything else. We must
// not touch AudioNode objects in an audio rendering thread.
// AudioHandler is created and owned by an AudioNode almost all the time. When
// the AudioNode is about to die, the ownership of its AudioHandler is
// transferred to DeferredTaskHandler, and it does deref the AudioHandler on the
// main thread.
//
// Be careful to avoid reference cycles. If an AudioHandler has a reference
// cycle including the owner AudioNode, objects in the cycle are never
// collected.
class MODULES_EXPORT AudioNode : public EventTarget,
public InspectorHelperMixin {
DEFINE_WRAPPERTYPEINFO();
USING_PRE_FINALIZER(AudioNode, Dispose);
public:
~AudioNode() override;
void Trace(Visitor*) const override;
AudioHandler& Handler() const;
void HandleChannelOptions(const AudioNodeOptions*, ExceptionState&);
String GetNodeName() const;
AudioNode* connect(AudioNode*,
unsigned output_index,
unsigned input_index,
ExceptionState&);
void connect(AudioParam*, unsigned output_index, ExceptionState&);
void disconnect();
void disconnect(unsigned output_index, ExceptionState&);
void disconnect(AudioNode*, ExceptionState&);
void disconnect(AudioNode*, unsigned output_index, ExceptionState&);
void disconnect(AudioNode*,
unsigned output_index,
unsigned input_index,
ExceptionState&);
void disconnect(AudioParam*, ExceptionState&);
void disconnect(AudioParam*, unsigned output_index, ExceptionState&);
BaseAudioContext* context() const;
unsigned numberOfInputs() const;
unsigned numberOfOutputs() const;
unsigned channelCount() const;
void setChannelCount(unsigned, ExceptionState&);
V8ChannelCountMode channelCountMode() const;
void setChannelCountMode(const V8ChannelCountMode&, ExceptionState&);
V8ChannelInterpretation channelInterpretation() const;
void setChannelInterpretation(const V8ChannelInterpretation&,
ExceptionState&);
// EventTarget
const AtomicString& InterfaceName() const final;
ExecutionContext* GetExecutionContext() const final;
// Called inside AudioHandler constructors.
void DidAddOutput(unsigned number_of_outputs);
protected:
explicit AudioNode(BaseAudioContext&);
// This should be called in a constructor.
void SetHandler(scoped_refptr<AudioHandler>);
// During construction time the handler may not be set properly. Since the
// garbage collector can call into HasPendingActivity() such calls need to be
// able to see whether a handle has been set.
bool ContainsHandler() const;
private:
void WarnIfContextClosed() const;
void Dispose();
void DisconnectAllFromOutput(unsigned output_index);
// Returns true if the specified AudioNodeInput was connected.
bool DisconnectFromOutputIfConnected(unsigned output_index,
AudioNode& destination,
unsigned input_index_of_destination);
// Returns true if the specified AudioParam was connected.
bool DisconnectFromOutputIfConnected(unsigned output_index, AudioParam&);
// Any derived node may implement this method to handle the destination
// connection.
virtual void ConnectToDestinationReady() {}
// https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/media/capture/README.md#logs
void SendLogMessage(const char* const function_name, const String& message);
Member<BaseAudioContext> context_;
scoped_refptr<DeferredTaskHandler> deferred_task_handler_;
scoped_refptr<AudioHandler> handler_;
// Represents audio node graph with Oilpan references. N-th HeapHashSet
// represents a set of AudioNode objects connected to this AudioNode's N-th
// output.
HeapVector<Member<GCedHeapHashSet<Member<AudioNode>>>> connected_nodes_;
// Represents audio node graph with Oilpan references. N-th HeapHashSet
// represents a set of AudioParam objects connected to this AudioNode's N-th
// output.
HeapVector<Member<GCedHeapHashSet<Member<AudioParam>>>> connected_params_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_NODE_H_