mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-11 13:42:52 +00:00
134 lines
5.3 KiB
C++
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 };
|
|
};
|
|
|
|
}
|