/* * 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); GC_DECLARE_ALLOCATOR(AudioParam); public: enum class FixedAutomationRate { No, Yes, }; static GC::Ref create(JS::Realm&, GC::Ref, float default_value, float min_value, float max_value, Bindings::AutomationRate, FixedAutomationRate = FixedAutomationRate::No); virtual ~AudioParam() override; GC::Ref context() const { return m_context; } 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: AudioParam(JS::Realm&, GC::Ref, float default_value, float min_value, float max_value, Bindings::AutomationRate, FixedAutomationRate = FixedAutomationRate::No); GC::Ref m_context; // 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 {}; FixedAutomationRate m_fixed_automation_rate { FixedAutomationRate::No }; virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; }; }