diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index f08a162a08a..5e9c59c33d8 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -46,6 +46,7 @@ static bool is_platform_object(Type const& type) "Document"sv, "DocumentType"sv, "DOMRectReadOnly"sv, + "DynamicsCompressorNode"sv, "EventTarget"sv, "FileList"sv, "FontFace"sv, diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index be527836d81..e1c5c285a52 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -665,6 +665,7 @@ set(SOURCES WebAudio/AudioParam.cpp WebAudio/AudioScheduledSourceNode.cpp WebAudio/BaseAudioContext.cpp + WebAudio/DynamicsCompressorNode.cpp WebAudio/OfflineAudioContext.cpp WebAudio/OscillatorNode.cpp WebAudio/PeriodicWave.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 48c64a9d5df..2968a65138b 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -689,6 +689,7 @@ class AudioNode; class AudioParam; class AudioScheduledSourceNode; class BaseAudioContext; +class DynamicsCompressorNode; class OfflineAudioContext; class OscillatorNode; class PeriodicWave; @@ -696,6 +697,8 @@ class PeriodicWave; enum class AudioContextState; struct AudioContextOptions; +struct DynamicsCompressorOptions; +struct OscillatorOptions; } namespace Web::WebGL { diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp new file mode 100644 index 00000000000..cda26f52e05 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::WebAudio { + +JS_DEFINE_ALLOCATOR(DynamicsCompressorNode); + +DynamicsCompressorNode::~DynamicsCompressorNode() = default; + +WebIDL::ExceptionOr> DynamicsCompressorNode::create(JS::Realm& realm, JS::NonnullGCPtr context, DynamicsCompressorOptions const& options) +{ + return construct_impl(realm, context, options); +} + +// https://webaudio.github.io/web-audio-api/#dom-dynamicscompressornode-dynamicscompressornode +WebIDL::ExceptionOr> DynamicsCompressorNode::construct_impl(JS::Realm& realm, JS::NonnullGCPtr context, DynamicsCompressorOptions const& options) +{ + // FIXME: Invoke "Initialize the AudioNode" steps. + return realm.vm().heap().allocate(realm, realm, context, options); +} + +DynamicsCompressorNode::DynamicsCompressorNode(JS::Realm& realm, JS::NonnullGCPtr context, DynamicsCompressorOptions const&) + : AudioNode(realm, context) +{ +} + +void DynamicsCompressorNode::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(DynamicsCompressorNode); +} + +void DynamicsCompressorNode::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); +} + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h new file mode 100644 index 00000000000..d0d9be54734 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::WebAudio { + +// https://webaudio.github.io/web-audio-api/#DynamicsCompressorOptions +struct DynamicsCompressorOptions : AudioNodeOptions { + float attack { 0.003 }; + float knee { 30 }; + float ratio { 12 }; + float release { 0.25 }; + float threshold { -24 }; +}; + +// https://webaudio.github.io/web-audio-api/#DynamicsCompressorNode +class DynamicsCompressorNode : public AudioNode { + WEB_PLATFORM_OBJECT(DynamicsCompressorNode, AudioNode); + JS_DECLARE_ALLOCATOR(DynamicsCompressorNode); + +public: + virtual ~DynamicsCompressorNode() override; + + static WebIDL::ExceptionOr> create(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {}); + static WebIDL::ExceptionOr> construct_impl(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {}); + +protected: + DynamicsCompressorNode(JS::Realm&, JS::NonnullGCPtr, DynamicsCompressorOptions const& = {}); + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl new file mode 100644 index 00000000000..032cd953376 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl @@ -0,0 +1,25 @@ +#import +#import +#import + +// https://webaudio.github.io/web-audio-api/#DynamicsCompressorOptions +dictionary DynamicsCompressorOptions : AudioNodeOptions { + float attack = 0.003; + float knee = 30; + float ratio = 12; + float release = 0.25; + float threshold = -24; +}; + +// https://webaudio.github.io/web-audio-api/#DynamicsCompressorNode +[Exposed=Window] +interface DynamicsCompressorNode : AudioNode { + constructor(BaseAudioContext context, + optional DynamicsCompressorOptions options = {}); + // FIXME: readonly attribute AudioParam threshold; + // FIXME: readonly attribute AudioParam knee; + // FIXME: readonly attribute AudioParam ratio; + // FIXME: readonly attribute float reduction; + // FIXME: readonly attribute AudioParam attack; + // FIXME: readonly attribute AudioParam release; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 3c070787d31..88db52aae37 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -301,6 +301,7 @@ libweb_js_bindings(WebAudio/AudioNode) libweb_js_bindings(WebAudio/AudioParam) libweb_js_bindings(WebAudio/AudioScheduledSourceNode) libweb_js_bindings(WebAudio/BaseAudioContext) +libweb_js_bindings(WebAudio/DynamicsCompressorNode) libweb_js_bindings(WebAudio/OfflineAudioContext) libweb_js_bindings(WebAudio/OscillatorNode) libweb_js_bindings(WebAudio/PeriodicWave)