mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-09 01:29:17 +00:00
WebAudio: Stub BiquadFilterNode
This commit is contained in:
parent
6672fb4b47
commit
64663d53fa
Notes:
github-actions[bot]
2024-07-23 07:25:59 +00:00
Author: https://github.com/bbb651
Commit: 64663d53fa
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/750
11 changed files with 140 additions and 1 deletions
|
@ -18,6 +18,8 @@ source_set("WebAudio") {
|
||||||
"AudioScheduledSourceNode.h",
|
"AudioScheduledSourceNode.h",
|
||||||
"BaseAudioContext.cpp",
|
"BaseAudioContext.cpp",
|
||||||
"BaseAudioContext.h",
|
"BaseAudioContext.h",
|
||||||
|
"BiquadFilterNode.cpp",
|
||||||
|
"BiquadFilterNode.h",
|
||||||
"DynamicsCompressorNode.cpp",
|
"DynamicsCompressorNode.cpp",
|
||||||
"DynamicsCompressorNode.h",
|
"DynamicsCompressorNode.h",
|
||||||
"GainNode.cpp",
|
"GainNode.cpp",
|
||||||
|
|
|
@ -325,6 +325,7 @@ standard_idl_files = [
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/AudioParam.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/AudioParam.idl",
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl",
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl",
|
||||||
|
"//Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.idl",
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl",
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/GainNode.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/GainNode.idl",
|
||||||
"//Userland/Libraries/LibWeb/WebAudio/OfflineAudioContext.idl",
|
"//Userland/Libraries/LibWeb/WebAudio/OfflineAudioContext.idl",
|
||||||
|
|
|
@ -688,6 +688,7 @@ set(SOURCES
|
||||||
WebAudio/AudioParam.cpp
|
WebAudio/AudioParam.cpp
|
||||||
WebAudio/AudioScheduledSourceNode.cpp
|
WebAudio/AudioScheduledSourceNode.cpp
|
||||||
WebAudio/BaseAudioContext.cpp
|
WebAudio/BaseAudioContext.cpp
|
||||||
|
WebAudio/BiquadFilterNode.cpp
|
||||||
WebAudio/DynamicsCompressorNode.cpp
|
WebAudio/DynamicsCompressorNode.cpp
|
||||||
WebAudio/GainNode.cpp
|
WebAudio/GainNode.cpp
|
||||||
WebAudio/OfflineAudioContext.cpp
|
WebAudio/OfflineAudioContext.cpp
|
||||||
|
|
|
@ -717,6 +717,7 @@ class AudioNode;
|
||||||
class AudioParam;
|
class AudioParam;
|
||||||
class AudioScheduledSourceNode;
|
class AudioScheduledSourceNode;
|
||||||
class BaseAudioContext;
|
class BaseAudioContext;
|
||||||
|
class BiquadFilterNode;
|
||||||
class DynamicsCompressorNode;
|
class DynamicsCompressorNode;
|
||||||
class GainNode;
|
class GainNode;
|
||||||
class OfflineAudioContext;
|
class OfflineAudioContext;
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <LibWeb/WebAudio/AudioBuffer.h>
|
#include <LibWeb/WebAudio/AudioBuffer.h>
|
||||||
#include <LibWeb/WebAudio/AudioBufferSourceNode.h>
|
#include <LibWeb/WebAudio/AudioBufferSourceNode.h>
|
||||||
#include <LibWeb/WebAudio/BaseAudioContext.h>
|
#include <LibWeb/WebAudio/BaseAudioContext.h>
|
||||||
|
#include <LibWeb/WebAudio/BiquadFilterNode.h>
|
||||||
#include <LibWeb/WebAudio/DynamicsCompressorNode.h>
|
#include <LibWeb/WebAudio/DynamicsCompressorNode.h>
|
||||||
#include <LibWeb/WebAudio/GainNode.h>
|
#include <LibWeb/WebAudio/GainNode.h>
|
||||||
#include <LibWeb/WebAudio/OscillatorNode.h>
|
#include <LibWeb/WebAudio/OscillatorNode.h>
|
||||||
|
@ -41,6 +42,13 @@ WebIDL::CallbackType* BaseAudioContext::onstatechange()
|
||||||
return event_handler_attribute(HTML::EventNames::statechange);
|
return event_handler_attribute(HTML::EventNames::statechange);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbiquadfilter
|
||||||
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> BaseAudioContext::create_biquad_filter()
|
||||||
|
{
|
||||||
|
// Factory method for a BiquadFilterNode representing a second order filter which can be configured as one of several common filter types.
|
||||||
|
return BiquadFilterNode::create(realm(), *this);
|
||||||
|
}
|
||||||
|
|
||||||
// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer
|
// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createbuffer
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBuffer>> BaseAudioContext::create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate)
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBuffer>> BaseAudioContext::create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <LibWeb/Bindings/BaseAudioContextPrototype.h>
|
#include <LibWeb/Bindings/BaseAudioContextPrototype.h>
|
||||||
#include <LibWeb/DOM/EventTarget.h>
|
#include <LibWeb/DOM/EventTarget.h>
|
||||||
|
#include <LibWeb/WebAudio/BiquadFilterNode.h>
|
||||||
#include <LibWeb/WebIDL/Types.h>
|
#include <LibWeb/WebIDL/Types.h>
|
||||||
|
|
||||||
namespace Web::WebAudio {
|
namespace Web::WebAudio {
|
||||||
|
@ -47,6 +48,7 @@ public:
|
||||||
|
|
||||||
static WebIDL::ExceptionOr<void> verify_audio_options_inside_nominal_range(JS::Realm&, WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate);
|
static WebIDL::ExceptionOr<void> verify_audio_options_inside_nominal_range(JS::Realm&, WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate);
|
||||||
|
|
||||||
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> create_biquad_filter();
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBuffer>> create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBuffer>> create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate);
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBufferSourceNode>> create_buffer_source();
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBufferSourceNode>> create_buffer_source();
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> create_oscillator();
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> create_oscillator();
|
||||||
|
|
|
@ -26,7 +26,7 @@ interface BaseAudioContext : EventTarget {
|
||||||
attribute EventHandler onstatechange;
|
attribute EventHandler onstatechange;
|
||||||
|
|
||||||
[FIXME] AnalyserNode createAnalyser ();
|
[FIXME] AnalyserNode createAnalyser ();
|
||||||
[FIXME] BiquadFilterNode createBiquadFilter ();
|
BiquadFilterNode createBiquadFilter ();
|
||||||
AudioBuffer createBuffer(unsigned long numberOfChannels, unsigned long length, float sampleRate);
|
AudioBuffer createBuffer(unsigned long numberOfChannels, unsigned long length, float sampleRate);
|
||||||
AudioBufferSourceNode createBufferSource ();
|
AudioBufferSourceNode createBufferSource ();
|
||||||
[FIXME] ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
|
[FIXME] ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
|
||||||
|
|
49
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.cpp
Normal file
49
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.cpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibWeb/Bindings/BiquadFilterNodePrototype.h>
|
||||||
|
#include <LibWeb/Bindings/Intrinsics.h>
|
||||||
|
#include <LibWeb/WebAudio/AudioNode.h>
|
||||||
|
#include <LibWeb/WebAudio/BiquadFilterNode.h>
|
||||||
|
|
||||||
|
namespace Web::WebAudio {
|
||||||
|
|
||||||
|
JS_DEFINE_ALLOCATOR(BiquadFilterNode);
|
||||||
|
|
||||||
|
BiquadFilterNode::BiquadFilterNode(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext> context, BiquadFilterOptions const&)
|
||||||
|
: AudioNode(realm, context)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BiquadFilterNode::~BiquadFilterNode() = default;
|
||||||
|
|
||||||
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> BiquadFilterNode::create(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext> context, BiquadFilterOptions const& options)
|
||||||
|
{
|
||||||
|
return construct_impl(realm, context, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-biquadfilternode
|
||||||
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> BiquadFilterNode::construct_impl(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext> context, BiquadFilterOptions const& options)
|
||||||
|
{
|
||||||
|
// When the constructor is called with a BaseAudioContext c and an option object option, the user agent
|
||||||
|
// MUST initialize the AudioNode this, with context and options as arguments.
|
||||||
|
|
||||||
|
auto node = realm.vm().heap().allocate<BiquadFilterNode>(realm, realm, context, options);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BiquadFilterNode::initialize(JS::Realm& realm)
|
||||||
|
{
|
||||||
|
Base::initialize(realm);
|
||||||
|
WEB_SET_PROTOTYPE_FOR_INTERFACE(BiquadFilterNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BiquadFilterNode::visit_edges(Cell::Visitor& visitor)
|
||||||
|
{
|
||||||
|
Base::visit_edges(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
41
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.h
Normal file
41
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <LibWeb/Bindings/BiquadFilterNodePrototype.h>
|
||||||
|
#include <LibWeb/WebAudio/AudioNode.h>
|
||||||
|
|
||||||
|
namespace Web::WebAudio {
|
||||||
|
|
||||||
|
// https://webaudio.github.io/web-audio-api/#BiquadFilterOptions
|
||||||
|
struct BiquadFilterOptions : AudioNodeOptions {
|
||||||
|
Bindings::BiquadFilterType type { Bindings::BiquadFilterType::Lowpass };
|
||||||
|
float q { 1 };
|
||||||
|
float detune { 0 };
|
||||||
|
float frequency { 350 };
|
||||||
|
float gain { 0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://webaudio.github.io/web-audio-api/#BiquadFilterNode
|
||||||
|
class BiquadFilterNode : public AudioNode {
|
||||||
|
WEB_PLATFORM_OBJECT(BiquadFilterNode, AudioNode);
|
||||||
|
JS_DECLARE_ALLOCATOR(BiquadFilterNode);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~BiquadFilterNode() override;
|
||||||
|
|
||||||
|
static WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> create(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, BiquadFilterOptions const& = {});
|
||||||
|
static WebIDL::ExceptionOr<JS::NonnullGCPtr<BiquadFilterNode>> construct_impl(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, BiquadFilterOptions const& = {});
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BiquadFilterNode(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, BiquadFilterOptions const& = {});
|
||||||
|
|
||||||
|
virtual void initialize(JS::Realm&) override;
|
||||||
|
virtual void visit_edges(Cell::Visitor&) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
33
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.idl
Normal file
33
Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.idl
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#import <WebAudio/AudioParam.idl>
|
||||||
|
#import <WebAudio/AudioNode.idl>
|
||||||
|
#import <WebAudio/BaseAudioContext.idl>
|
||||||
|
|
||||||
|
enum BiquadFilterType {
|
||||||
|
"lowpass",
|
||||||
|
"highpass",
|
||||||
|
"bandpass",
|
||||||
|
"lowshelf",
|
||||||
|
"highshelf",
|
||||||
|
"peaking",
|
||||||
|
"notch",
|
||||||
|
"allpass"
|
||||||
|
};
|
||||||
|
|
||||||
|
dictionary BiquadFilterOptions : AudioNodeOptions {
|
||||||
|
BiquadFilterType type = "lowpass";
|
||||||
|
float Q = 1;
|
||||||
|
float detune = 0;
|
||||||
|
float frequency = 350;
|
||||||
|
float gain = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
[Exposed=Window]
|
||||||
|
interface BiquadFilterNode : AudioNode {
|
||||||
|
constructor (BaseAudioContext context, optional BiquadFilterOptions options = {});
|
||||||
|
[FIXME] attribute BiquadFilterType type;
|
||||||
|
[FIXME] readonly attribute AudioParam frequency;
|
||||||
|
[FIXME] readonly attribute AudioParam detune;
|
||||||
|
[FIXME] readonly attribute AudioParam Q;
|
||||||
|
[FIXME] readonly attribute AudioParam gain;
|
||||||
|
[FIXME] undefined getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
|
||||||
|
};
|
|
@ -316,6 +316,7 @@ libweb_js_bindings(WebAudio/AudioNode)
|
||||||
libweb_js_bindings(WebAudio/AudioParam)
|
libweb_js_bindings(WebAudio/AudioParam)
|
||||||
libweb_js_bindings(WebAudio/AudioScheduledSourceNode)
|
libweb_js_bindings(WebAudio/AudioScheduledSourceNode)
|
||||||
libweb_js_bindings(WebAudio/BaseAudioContext)
|
libweb_js_bindings(WebAudio/BaseAudioContext)
|
||||||
|
libweb_js_bindings(WebAudio/BiquadFilterNode)
|
||||||
libweb_js_bindings(WebAudio/DynamicsCompressorNode)
|
libweb_js_bindings(WebAudio/DynamicsCompressorNode)
|
||||||
libweb_js_bindings(WebAudio/GainNode)
|
libweb_js_bindings(WebAudio/GainNode)
|
||||||
libweb_js_bindings(WebAudio/OfflineAudioContext)
|
libweb_js_bindings(WebAudio/OfflineAudioContext)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue