mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-12 02:59:45 +00:00
LibWeb/WebAudio: Implement PannerNode
Required by https://scottts.itch.io/different-strokes
This commit is contained in:
parent
27a654c739
commit
4f691c2410
Notes:
github-actions[bot]
2024-12-17 12:39:30 +00:00
Author: https://github.com/Lubrsi
Commit: 4f691c2410
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2942
Reviewed-by: https://github.com/gmta ✅
7 changed files with 356 additions and 0 deletions
130
Libraries/LibWeb/WebAudio/PannerNode.h
Normal file
130
Libraries/LibWeb/WebAudio/PannerNode.h
Normal file
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* 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);
|
||||
|
||||
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 };
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue