diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 598ba28ed10..96f8952d793 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -33,6 +33,7 @@ static bool is_platform_object(Type const& type) "AnimationEffect"sv, "AnimationTimeline"sv, "Attr"sv, + "AudioNode"sv, "AudioParam"sv, "AudioTrack"sv, "BaseAudioContext"sv, diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 36409c6887d..a54ca87f664 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -659,6 +659,7 @@ set(SOURCES WebAssembly/WebAssembly.cpp WebAudio/AudioBuffer.cpp WebAudio/AudioContext.cpp + WebAudio/AudioNode.cpp WebAudio/AudioParam.cpp WebAudio/BaseAudioContext.cpp WebAudio/OfflineAudioContext.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 7c5f6a85d55..88c5d88176b 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -681,6 +681,7 @@ class Table; namespace Web::WebAudio { class AudioContext; +class AudioNode; class AudioParam; class BaseAudioContext; class OfflineAudioContext; diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioNode.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioNode.cpp new file mode 100644 index 00000000000..7b8e84fe484 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioNode.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::WebAudio { + +JS_DEFINE_ALLOCATOR(AudioNode); + +AudioNode::~AudioNode() = default; + +// https://webaudio.github.io/web-audio-api/#dom-audionode-connect +WebIDL::ExceptionOr> AudioNode::connect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output, WebIDL::UnsignedLong input) +{ + (void)destination_node; + (void)output; + (void)input; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioNode::connect (AudioNode)"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-connect-destinationparam-output +WebIDL::ExceptionOr> AudioNode::connect(JS::NonnullGCPtr destination_param, WebIDL::UnsignedLong output) +{ + (void)destination_param; + (void)output; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioNode::connect (AudioParam)"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect +void AudioNode::disconnect() +{ + dbgln("FIXME: Implement AudioNode::disconnect()"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-output +void AudioNode::disconnect(WebIDL::UnsignedLong output) +{ + (void)output; + dbgln("FIXME: Implement AudioNode::disconnect(output)"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-destinationnode +void AudioNode::disconnect(JS::NonnullGCPtr destination_node) +{ + (void)destination_node; + dbgln("FIXME: Implement AudioNode::disconnect(destination_node)"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-destinationnode-output +void AudioNode::disconnect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output) +{ + (void)destination_node; + (void)output; + dbgln("FIXME: Implement AudioNode::disconnect(destination_node, output)"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-destinationnode-output-input +void AudioNode::disconnect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output, WebIDL::UnsignedLong input) +{ + (void)destination_node; + (void)output; + (void)input; + dbgln("FIXME: Implement AudioNode::disconnect(destination_node, output, input)"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-destinationparam +void AudioNode::disconnect(JS::NonnullGCPtr destination_param) +{ + (void)destination_param; + dbgln("FIXME: Implement AudioNode::disconnect(destination_param)"); +} + +// https://webaudio.github.io/web-audio-api/#dom-audionode-disconnect-destinationparam-output +void AudioNode::disconnect(JS::NonnullGCPtr destination_param, WebIDL::UnsignedLong output) +{ + (void)destination_param; + (void)output; + dbgln("FIXME: Implement AudioNode::disconnect(destination_param, output)"); +} + +void AudioNode::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(AudioNode); +} + +void AudioNode::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); +} + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioNode.h b/Userland/Libraries/LibWeb/WebAudio/AudioNode.h new file mode 100644 index 00000000000..0f7572aa5d6 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioNode.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace Web::WebAudio { + +// https://webaudio.github.io/web-audio-api/#AudioNodeOptions +struct AudioNodeOptions { + Optional channel_count; + Bindings::ChannelCountMode channel_count_mode; + Bindings::ChannelInterpretation channel_interpretation; +}; + +// https://webaudio.github.io/web-audio-api/#AudioNode +class AudioNode : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(AudioNode, DOM::EventTarget); + JS_DECLARE_ALLOCATOR(AudioNode); + +public: + virtual ~AudioNode() override; + + WebIDL::ExceptionOr> connect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output = 0, WebIDL::UnsignedLong input = 0); + WebIDL::ExceptionOr> connect(JS::NonnullGCPtr destination_param, WebIDL::UnsignedLong output = 0); + + void disconnect(); + void disconnect(WebIDL::UnsignedLong output); + void disconnect(JS::NonnullGCPtr destination_node); + void disconnect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output); + void disconnect(JS::NonnullGCPtr destination_node, WebIDL::UnsignedLong output, WebIDL::UnsignedLong input); + void disconnect(JS::NonnullGCPtr destination_param); + void disconnect(JS::NonnullGCPtr destination_param, WebIDL::UnsignedLong output); + +protected: + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioNode.idl b/Userland/Libraries/LibWeb/WebAudio/AudioNode.idl new file mode 100644 index 00000000000..2ed762d8cab --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioNode.idl @@ -0,0 +1,46 @@ +#import +#import + +// https://webaudio.github.io/web-audio-api/#enumdef-channelcountmode +enum ChannelCountMode { + "max", + "clamped-max", + "explicit" +}; + +// https://webaudio.github.io/web-audio-api/#enumdef-channelinterpretation +enum ChannelInterpretation { + "speakers", + "discrete" +}; + +// https://webaudio.github.io/web-audio-api/#AudioNodeOptions +dictionary AudioNodeOptions { + unsigned long channelCount; + ChannelCountMode channelCountMode; + ChannelInterpretation channelInterpretation; +}; + +// https://webaudio.github.io/web-audio-api/#AudioNode +[Exposed=Window] +interface AudioNode : EventTarget { + AudioNode connect(AudioNode destinationNode, + optional unsigned long output = 0, + optional unsigned long input = 0); + undefined connect(AudioParam destinationParam, optional unsigned long output = 0); + undefined disconnect(); + undefined disconnect(unsigned long output); + undefined disconnect(AudioNode destinationNode); + undefined disconnect(AudioNode destinationNode, unsigned long output); + undefined disconnect(AudioNode destinationNode, + unsigned long output, + unsigned long input); + undefined disconnect(AudioParam destinationParam); + undefined disconnect(AudioParam destinationParam, unsigned long output); + // FIXME: readonly attribute BaseAudioContext context; + // FIXME: readonly attribute unsigned long numberOfInputs; + // FIXME: readonly attribute unsigned long numberOfOutputs; + // FIXME: attribute unsigned long channelCount; + // FIXME: attribute ChannelCountMode channelCountMode; + // FIXME: attribute ChannelInterpretation channelInterpretation; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index cb2912140cc..2a05e3341d0 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -295,6 +295,7 @@ libweb_js_bindings(WebAssembly/Table) libweb_js_bindings(WebAssembly/WebAssembly NAMESPACE) libweb_js_bindings(WebAudio/AudioBuffer) libweb_js_bindings(WebAudio/AudioContext) +libweb_js_bindings(WebAudio/AudioNode) libweb_js_bindings(WebAudio/AudioParam) libweb_js_bindings(WebAudio/BaseAudioContext) libweb_js_bindings(WebAudio/OfflineAudioContext)