WebAudio: Stub BiquadFilterNode

This commit is contained in:
bbb651 2024-07-21 21:25:14 +03:00 committed by Andreas Kling
parent 6672fb4b47
commit 64663d53fa
Notes: github-actions[bot] 2024-07-23 07:25:59 +00:00
11 changed files with 140 additions and 1 deletions

View file

@ -18,6 +18,8 @@ source_set("WebAudio") {
"AudioScheduledSourceNode.h",
"BaseAudioContext.cpp",
"BaseAudioContext.h",
"BiquadFilterNode.cpp",
"BiquadFilterNode.h",
"DynamicsCompressorNode.cpp",
"DynamicsCompressorNode.h",
"GainNode.cpp",

View file

@ -325,6 +325,7 @@ standard_idl_files = [
"//Userland/Libraries/LibWeb/WebAudio/AudioParam.idl",
"//Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl",
"//Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.idl",
"//Userland/Libraries/LibWeb/WebAudio/BiquadFilterNode.idl",
"//Userland/Libraries/LibWeb/WebAudio/DynamicsCompressorNode.idl",
"//Userland/Libraries/LibWeb/WebAudio/GainNode.idl",
"//Userland/Libraries/LibWeb/WebAudio/OfflineAudioContext.idl",

View file

@ -688,6 +688,7 @@ set(SOURCES
WebAudio/AudioParam.cpp
WebAudio/AudioScheduledSourceNode.cpp
WebAudio/BaseAudioContext.cpp
WebAudio/BiquadFilterNode.cpp
WebAudio/DynamicsCompressorNode.cpp
WebAudio/GainNode.cpp
WebAudio/OfflineAudioContext.cpp

View file

@ -717,6 +717,7 @@ class AudioNode;
class AudioParam;
class AudioScheduledSourceNode;
class BaseAudioContext;
class BiquadFilterNode;
class DynamicsCompressorNode;
class GainNode;
class OfflineAudioContext;

View file

@ -11,6 +11,7 @@
#include <LibWeb/WebAudio/AudioBuffer.h>
#include <LibWeb/WebAudio/AudioBufferSourceNode.h>
#include <LibWeb/WebAudio/BaseAudioContext.h>
#include <LibWeb/WebAudio/BiquadFilterNode.h>
#include <LibWeb/WebAudio/DynamicsCompressorNode.h>
#include <LibWeb/WebAudio/GainNode.h>
#include <LibWeb/WebAudio/OscillatorNode.h>
@ -41,6 +42,13 @@ WebIDL::CallbackType* BaseAudioContext::onstatechange()
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
WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBuffer>> BaseAudioContext::create_buffer(WebIDL::UnsignedLong number_of_channels, WebIDL::UnsignedLong length, float sample_rate)
{

View file

@ -9,6 +9,7 @@
#include <LibWeb/Bindings/BaseAudioContextPrototype.h>
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/WebAudio/BiquadFilterNode.h>
#include <LibWeb/WebIDL/Types.h>
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);
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<AudioBufferSourceNode>> create_buffer_source();
WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> create_oscillator();

View file

@ -26,7 +26,7 @@ interface BaseAudioContext : EventTarget {
attribute EventHandler onstatechange;
[FIXME] AnalyserNode createAnalyser ();
[FIXME] BiquadFilterNode createBiquadFilter ();
BiquadFilterNode createBiquadFilter ();
AudioBuffer createBuffer(unsigned long numberOfChannels, unsigned long length, float sampleRate);
AudioBufferSourceNode createBufferSource ();
[FIXME] ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);

View 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);
}
}

View 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;
};
}

View 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);
};

View file

@ -316,6 +316,7 @@ libweb_js_bindings(WebAudio/AudioNode)
libweb_js_bindings(WebAudio/AudioParam)
libweb_js_bindings(WebAudio/AudioScheduledSourceNode)
libweb_js_bindings(WebAudio/BaseAudioContext)
libweb_js_bindings(WebAudio/BiquadFilterNode)
libweb_js_bindings(WebAudio/DynamicsCompressorNode)
libweb_js_bindings(WebAudio/GainNode)
libweb_js_bindings(WebAudio/OfflineAudioContext)