Преглед на файлове

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.
Shannon Booth преди 1 година
родител
ревизия
5ae0ac7b73

+ 1 - 0
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,

+ 1 - 0
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

+ 1 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -681,6 +681,7 @@ class Table;
 
 namespace Web::WebAudio {
 class AudioContext;
+class AudioParam;
 class BaseAudioContext;
 class OfflineAudioContext;
 class PeriodicWave;

+ 129 - 0
Userland/Libraries/LibWeb/WebAudio/AudioParam.cpp

@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Bindings/AudioParamPrototype.h>
+#include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/WebAudio/AudioParam.h>
+#include <LibWeb/WebIDL/ExceptionOr.h>
+
+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<void> 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<JS::NonnullGCPtr<AudioParam>> 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<JS::NonnullGCPtr<AudioParam>> 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<JS::NonnullGCPtr<AudioParam>> 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<JS::NonnullGCPtr<AudioParam>> 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<JS::NonnullGCPtr<AudioParam>> AudioParam::set_value_curve_at_time(Span<float> 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<JS::NonnullGCPtr<AudioParam>> 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<JS::NonnullGCPtr<AudioParam>> 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);
+}
+
+}

+ 56 - 0
Userland/Libraries/LibWeb/WebAudio/AudioParam.h

@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Forward.h>
+#include <LibWeb/Bindings/AudioParamPrototype.h>
+#include <LibWeb/Bindings/PlatformObject.h>
+
+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<void> set_automation_rate(Bindings::AutomationRate);
+
+    float default_value() const;
+    float min_value() const;
+    float max_value() const;
+
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> set_value_at_time(float value, double start_time);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> linear_ramp_to_value_at_time(float value, double end_time);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> exponential_ramp_to_value_at_time(float value, double end_time);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> set_target_at_time(float target, double start_time, float time_constant);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> set_value_curve_at_time(Span<float> values, double start_time, double duration);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> cancel_scheduled_values(double cancel_time);
+    WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioParam>> 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;
+};
+
+}

+ 24 - 0
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<float> values,
+                                   double startTime,
+                                   double duration);
+    AudioParam cancelScheduledValues(double cancelTime);
+    AudioParam cancelAndHoldAtTime(double cancelTime);
+};

+ 1 - 0
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)