From 5ae0ac7b730eaa13a5227e8c43a0a0276c0f6c34 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 28 Apr 2024 12:26:30 +1200 Subject: [PATCH] LibWeb: Add stub IDL interface for AudioParam An AudioParam is a fundamental building block in WebAudio as it controls the value of an individual parameter of an AudioNode, such as volume. --- .../BindingsGenerator/IDLGenerators.cpp | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/Forward.h | 1 + .../Libraries/LibWeb/WebAudio/AudioParam.cpp | 129 ++++++++++++++++++ .../Libraries/LibWeb/WebAudio/AudioParam.h | 56 ++++++++ .../Libraries/LibWeb/WebAudio/AudioParam.idl | 24 ++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 7 files changed, 213 insertions(+) create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioParam.cpp create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioParam.h create mode 100644 Userland/Libraries/LibWeb/WebAudio/AudioParam.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index e72b2358e32..598ba28ed10 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, + "AudioParam"sv, "AudioTrack"sv, "BaseAudioContext"sv, "Blob"sv, diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 950c03a42e0..36409c6887d 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/AudioParam.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 5bf7d5db404..7c5f6a85d55 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 AudioParam; class BaseAudioContext; class OfflineAudioContext; class PeriodicWave; diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioParam.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioParam.cpp new file mode 100644 index 00000000000..fc24942fc06 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioParam.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Web::WebAudio { + +JS_DEFINE_ALLOCATOR(AudioParam); + +AudioParam::~AudioParam() = default; + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-value +float AudioParam::value() const +{ + return m_current_value; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-value +void AudioParam::set_value(float value) +{ + m_current_value = value; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-automationrate +Bindings::AutomationRate AudioParam::automation_rate() const +{ + return m_automation_rate; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-automationrate +WebIDL::ExceptionOr AudioParam::set_automation_rate(Bindings::AutomationRate automation_rate) +{ + dbgln("FIXME: Fully implement AudioParam::set_automation_rate"); + m_automation_rate = automation_rate; + return {}; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-defaultvalue +float AudioParam::default_value() const +{ + return m_default_value; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-minvalue +float AudioParam::min_value() const +{ + return m_min_value; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-maxvalue +float AudioParam::max_value() const +{ + return m_max_value; +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-setvalueattime +WebIDL::ExceptionOr> AudioParam::set_value_at_time(float value, double start_time) +{ + (void)value; + (void)start_time; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::set_value_at_time"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-linearramptovalueattime +WebIDL::ExceptionOr> AudioParam::linear_ramp_to_value_at_time(float value, double end_time) +{ + (void)value; + (void)end_time; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::linear_ramp_to_value_at_time"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-exponentialramptovalueattime +WebIDL::ExceptionOr> AudioParam::exponential_ramp_to_value_at_time(float value, double end_time) +{ + (void)value; + (void)end_time; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::exponential_ramp_to_value_at_time"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-settargetattime +WebIDL::ExceptionOr> AudioParam::set_target_at_time(float target, double start_time, float time_constant) +{ + (void)target; + (void)start_time; + (void)time_constant; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::set_target_at_time"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-setvaluecurveattime +WebIDL::ExceptionOr> AudioParam::set_value_curve_at_time(Span values, double start_time, double duration) +{ + (void)values; + (void)start_time; + (void)duration; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::set_value_curve_at_time"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelscheduledvalues +WebIDL::ExceptionOr> AudioParam::cancel_scheduled_values(double cancel_time) +{ + (void)cancel_time; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::cancel_scheduled_values"_fly_string); +} + +// https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelandholdattime +WebIDL::ExceptionOr> AudioParam::cancel_and_hold_at_time(double cancel_time) +{ + (void)cancel_time; + return WebIDL::NotSupportedError::create(realm(), "FIXME: Implement AudioParam::cancel_and_hold_at_time"_fly_string); +} + +void AudioParam::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(AudioParam); +} + +void AudioParam::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); +} + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioParam.h b/Userland/Libraries/LibWeb/WebAudio/AudioParam.h new file mode 100644 index 00000000000..af6702f0195 --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioParam.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::WebAudio { + +// https://webaudio.github.io/web-audio-api/#AudioParam +class AudioParam final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(AudioParam, Bindings::PlatformObject); + JS_DECLARE_ALLOCATOR(AudioParam); + +public: + virtual ~AudioParam() override; + + float value() const; + void set_value(float); + + Bindings::AutomationRate automation_rate() const; + WebIDL::ExceptionOr set_automation_rate(Bindings::AutomationRate); + + float default_value() const; + float min_value() const; + float max_value() const; + + WebIDL::ExceptionOr> set_value_at_time(float value, double start_time); + WebIDL::ExceptionOr> linear_ramp_to_value_at_time(float value, double end_time); + WebIDL::ExceptionOr> exponential_ramp_to_value_at_time(float value, double end_time); + WebIDL::ExceptionOr> set_target_at_time(float target, double start_time, float time_constant); + WebIDL::ExceptionOr> set_value_curve_at_time(Span values, double start_time, double duration); + WebIDL::ExceptionOr> cancel_scheduled_values(double cancel_time); + WebIDL::ExceptionOr> cancel_and_hold_at_time(double cancel_time); + +private: + // https://webaudio.github.io/web-audio-api/#dom-audioparam-current-value-slot + float m_current_value {}; // [[current value]] + + float m_default_value {}; + + float m_min_value {}; + float m_max_value {}; + + Bindings::AutomationRate m_automation_rate {}; + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioParam.idl b/Userland/Libraries/LibWeb/WebAudio/AudioParam.idl new file mode 100644 index 00000000000..7411068df2f --- /dev/null +++ b/Userland/Libraries/LibWeb/WebAudio/AudioParam.idl @@ -0,0 +1,24 @@ +// https://webaudio.github.io/web-audio-api/#enumdef-automationrate +enum AutomationRate { + "a-rate", + "k-rate" +}; + +// https://webaudio.github.io/web-audio-api/#AudioParam +[Exposed=Window] +interface AudioParam { + attribute float value; + attribute AutomationRate automationRate; + readonly attribute float defaultValue; + readonly attribute float minValue; + readonly attribute float maxValue; + AudioParam setValueAtTime(float value, double startTime); + AudioParam linearRampToValueAtTime(float value, double endTime); + AudioParam exponentialRampToValueAtTime(float value, double endTime); + AudioParam setTargetAtTime(float target, double startTime, float timeConstant); + AudioParam setValueCurveAtTime(sequence values, + double startTime, + double duration); + AudioParam cancelScheduledValues(double cancelTime); + AudioParam cancelAndHoldAtTime(double cancelTime); +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 23afcda1f49..cb2912140cc 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/AudioParam) libweb_js_bindings(WebAudio/BaseAudioContext) libweb_js_bindings(WebAudio/OfflineAudioContext) libweb_js_bindings(WebAudio/PeriodicWave)