From c9b2c1c747aa54dc6d3957cf4c40811ff072ce35 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 28 Apr 2024 13:17:44 +1200 Subject: [PATCH] LibWeb: Add stub IDL interface for AudioScheduledSourceNode This is a base class of a few different audio nodes, most notably for our immediate needs - OscillatorNode. --- .../BindingsGenerator/IDLGenerators.cpp | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + .../WebAudio/AudioScheduledSourceNode.cpp | 55 +++++++++++++++++++ .../WebAudio/AudioScheduledSourceNode.h | 32 +++++++++++ .../WebAudio/AudioScheduledSourceNode.idl | 10 ++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 7 files changed, 101 insertions(+) create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.cpp create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.h create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 96f8952d793..9407bd5a944 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -35,6 +35,7 @@ static bool is_platform_object(Type const& type) "Attr"sv, "AudioNode"sv, "AudioParam"sv, + "AudioScheduledSourceNode"sv, "AudioTrack"sv, "BaseAudioContext"sv, "Blob"sv, diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index a54ca87f664..426ef8cac83 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -661,6 +661,7 @@ set(SOURCES WebAudio/AudioContext.cpp WebAudio/AudioNode.cpp WebAudio/AudioParam.cpp + WebAudio/AudioScheduledSourceNode.cpp WebAudio/BaseAudioContext.cpp WebAudio/OfflineAudioContext.cpp WebAudio/PeriodicWave.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 88c5d88176b..f4f68b74309 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -683,6 +683,7 @@ namespace Web::WebAudio { class AudioContext; class AudioNode; class AudioParam; +class AudioScheduledSourceNode; class BaseAudioContext; class OfflineAudioContext; class PeriodicWave; diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.cpp new file mode 100644 index 00000000000..30c7677d69c --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Web::WebAudio { + +JS_DEFINE_ALLOCATOR(AudioScheduledSourceNode); + +AudioScheduledSourceNode::~AudioScheduledSourceNode() = default; + +// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-onended +JS::GCPtr AudioScheduledSourceNode::onended() +{ + return event_handler_attribute(HTML::EventNames::ended); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-onended +void AudioScheduledSourceNode::set_onended(JS::GCPtr value) +{ + set_event_handler_attribute(HTML::EventNames::ended, value); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-start +WebIDL::ExceptionOr AudioScheduledSourceNode::start(double when) +{ + (void)when; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioScheduledSourceNode::start"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-stop +WebIDL::ExceptionOr AudioScheduledSourceNode::stop(double when) +{ + (void)when; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioScheduledSourceNode::stop"_fly_string); +} + +void AudioScheduledSourceNode::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(AudioScheduledSourceNode); +} + +void AudioScheduledSourceNode::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); +} + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.h b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.h new file mode 100644 index 00000000000..8c375c7671c --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::WebAudio { + +// https://webaudio.github.io/web-audio-api/#AudioScheduledSourceNode +class AudioScheduledSourceNode : public AudioNode { + WEB_PLATFORM_OBJECT(AudioScheduledSourceNode, AudioNode); + JS_DECLARE_ALLOCATOR(AudioScheduledSourceNode); + +public: + virtual ~AudioScheduledSourceNode() override; + + JS::GCPtr onended(); + void set_onended(JS::GCPtr); + + WebIDL::ExceptionOr start(double when = 0); + WebIDL::ExceptionOr stop(double when = 0); + +protected: + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl new file mode 100644 index 00000000000..25c41cfbe53 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl @@ -0,0 +1,10 @@ +#import +#import + +// https://webaudio.github.io/web-audio-api/#AudioScheduledSourceNode +[Exposed=Window] +interface AudioScheduledSourceNode : AudioNode { + attribute EventHandler onended; + undefined start(optional double when = 0); + undefined stop(optional double when = 0); +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 2a05e3341d0..e5487c84f0f 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -297,6 +297,7 @@ libweb_js_bindings(WebAudio/AudioBuffer) libweb_js_bindings(WebAudio/AudioContext) libweb_js_bindings(WebAudio/AudioNode) libweb_js_bindings(WebAudio/AudioParam) +libweb_js_bindings(WebAudio/AudioScheduledSourceNode) libweb_js_bindings(WebAudio/BaseAudioContext) libweb_js_bindings(WebAudio/OfflineAudioContext) libweb_js_bindings(WebAudio/PeriodicWave)