ladybird/Libraries/LibWeb/WebAudio/PannerNode.h

134 lines
5.3 KiB
C++

/*
* Copyright (c) 2024, Luke Wilde <luke@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/Bindings/PannerNodePrototype.h>
#include <LibWeb/WebAudio/AudioNode.h>
namespace Web::WebAudio {
// https://webaudio.github.io/web-audio-api/#PannerOptions
struct PannerOptions : AudioNodeOptions {
Bindings::PanningModelType panning_model { Bindings::PanningModelType::Equalpower };
Bindings::DistanceModelType distance_model { Bindings::DistanceModelType::Inverse };
float position_x { 0.0f };
float position_y { 0.0f };
float position_z { 0.0f };
float orientation_x { 1.0f };
float orientation_y { 0.0f };
float orientation_z { 0.0f };
double ref_distance { 1.0 };
double max_distance { 10000.0 };
double rolloff_factor { 1.0 };
double cone_inner_angle { 360.0 };
double cone_outer_angle { 360.0 };
double cone_outer_gain { 0.0 };
};
// https://webaudio.github.io/web-audio-api/#PannerNode
class PannerNode final : public AudioNode {
WEB_PLATFORM_OBJECT(PannerNode, AudioNode);
GC_DECLARE_ALLOCATOR(PannerNode);
public:
virtual ~PannerNode() override;
static WebIDL::ExceptionOr<GC::Ref<PannerNode>> create(JS::Realm&, GC::Ref<BaseAudioContext>, PannerOptions const& = {});
static WebIDL::ExceptionOr<GC::Ref<PannerNode>> construct_impl(JS::Realm&, GC::Ref<BaseAudioContext>, PannerOptions const& = {});
WebIDL::UnsignedLong number_of_inputs() override { return 1; }
WebIDL::UnsignedLong number_of_outputs() override { return 1; }
GC::Ref<AudioParam const> position_x() const { return m_position_x; }
GC::Ref<AudioParam const> position_y() const { return m_position_y; }
GC::Ref<AudioParam const> position_z() const { return m_position_z; }
GC::Ref<AudioParam const> orientation_x() const { return m_orientation_x; }
GC::Ref<AudioParam const> orientation_y() const { return m_orientation_y; }
GC::Ref<AudioParam const> orientation_z() const { return m_orientation_z; }
Bindings::PanningModelType panning_model() const { return m_panning_model; }
void set_panning_model(Bindings::PanningModelType value) { m_panning_model = value; }
Bindings::DistanceModelType distance_model() const { return m_distance_model; }
void set_distance_model(Bindings::DistanceModelType value) { m_distance_model = value; }
double ref_distance() const { return m_ref_distance; }
WebIDL::ExceptionOr<void> set_ref_distance(double);
double max_distance() const { return m_max_distance; }
WebIDL::ExceptionOr<void> set_max_distance(double);
double rolloff_factor() const { return m_rolloff_factor; }
WebIDL::ExceptionOr<void> set_rolloff_factor(double);
double cone_inner_angle() const { return m_cone_inner_angle; }
void set_cone_inner_angle(double value) { m_cone_inner_angle = value; }
double cone_outer_angle() const { return m_cone_outer_angle; }
void set_cone_outer_angle(double value) { m_cone_outer_angle = value; }
double cone_outer_gain() const { return m_cone_outer_gain; }
WebIDL::ExceptionOr<void> set_cone_outer_gain(double);
WebIDL::ExceptionOr<void> set_position(float x, float y, float z);
WebIDL::ExceptionOr<void> set_orientation(float x, float y, float z);
// ^AudioNode
virtual WebIDL::ExceptionOr<void> set_channel_count(WebIDL::UnsignedLong) override;
virtual WebIDL::ExceptionOr<void> set_channel_count_mode(Bindings::ChannelCountMode) override;
protected:
PannerNode(JS::Realm&, GC::Ref<BaseAudioContext>, PannerOptions const& = {});
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
private:
// https://webaudio.github.io/web-audio-api/#dom-pannernode-panningmodel
Bindings::PanningModelType m_panning_model { Bindings::PanningModelType::Equalpower };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-positionx
GC::Ref<AudioParam> m_position_x;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-positiony
GC::Ref<AudioParam> m_position_y;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-positionz
GC::Ref<AudioParam> m_position_z;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-orientationx
GC::Ref<AudioParam> m_orientation_x;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-orientationy
GC::Ref<AudioParam> m_orientation_y;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-orientationz
GC::Ref<AudioParam> m_orientation_z;
// https://webaudio.github.io/web-audio-api/#dom-pannernode-distancemodel
Bindings::DistanceModelType m_distance_model { Bindings::DistanceModelType::Inverse };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-refdistance
double m_ref_distance { 1.0 };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-maxdistance
double m_max_distance { 10000.0 };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-rollofffactor
double m_rolloff_factor { 1.0 };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-coneinnerangle
double m_cone_inner_angle { 360.0 };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-coneouterangle
double m_cone_outer_angle { 360.0 };
// https://webaudio.github.io/web-audio-api/#dom-pannernode-coneoutergain
double m_cone_outer_gain { 0.0 };
};
}