/* * Copyright (c) 2024, Bar Yemini * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace Web::WebAudio { GC_DEFINE_ALLOCATOR(BiquadFilterNode); BiquadFilterNode::BiquadFilterNode(JS::Realm& realm, GC::Ref context, BiquadFilterOptions const& options) : AudioNode(realm, context) , m_type(options.type) , m_frequency(AudioParam::create(realm, options.frequency, NumericLimits::lowest(), NumericLimits::max(), Bindings::AutomationRate::ARate)) , m_detune(AudioParam::create(realm, options.detune, NumericLimits::lowest(), NumericLimits::max(), Bindings::AutomationRate::ARate)) , m_q(AudioParam::create(realm, options.q, NumericLimits::lowest(), NumericLimits::max(), Bindings::AutomationRate::ARate)) , m_gain(AudioParam::create(realm, options.gain, NumericLimits::lowest(), NumericLimits::max(), Bindings::AutomationRate::ARate)) { } BiquadFilterNode::~BiquadFilterNode() = default; // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-type void BiquadFilterNode::set_type(Bindings::BiquadFilterType type) { m_type = type; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-type Bindings::BiquadFilterType BiquadFilterNode::type() const { return m_type; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-frequency GC::Ref BiquadFilterNode::frequency() const { return m_frequency; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-detune GC::Ref BiquadFilterNode::detune() const { return m_detune; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-q GC::Ref BiquadFilterNode::q() const { return m_q; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-gain GC::Ref BiquadFilterNode::gain() const { return m_gain; } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-getfrequencyresponse WebIDL::ExceptionOr BiquadFilterNode::get_frequency_response(GC::Root const& frequency_hz, GC::Root const& mag_response, GC::Root const& phase_response) { (void)frequency_hz; (void)mag_response; (void)phase_response; dbgln("FIXME: Implement BiquadFilterNode::get_frequency_response(Float32Array, Float32Array, Float32Array)"); return {}; } WebIDL::ExceptionOr> BiquadFilterNode::create(JS::Realm& realm, GC::Ref context, BiquadFilterOptions const& options) { return construct_impl(realm, context, options); } // https://webaudio.github.io/web-audio-api/#dom-biquadfilternode-biquadfilternode WebIDL::ExceptionOr> BiquadFilterNode::construct_impl(JS::Realm& realm, GC::Ref 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.create(realm, context, options); // Default options for channel count and interpretation // https://webaudio.github.io/web-audio-api/#BiquadFilterNode AudioNodeDefaultOptions default_options; default_options.channel_count_mode = Bindings::ChannelCountMode::Max; default_options.channel_interpretation = Bindings::ChannelInterpretation::Speakers; default_options.channel_count = 2; // FIXME: Set tail-time to yes TRY(node->initialize_audio_node_options(options, default_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); visitor.visit(m_frequency); visitor.visit(m_detune); visitor.visit(m_q); visitor.visit(m_gain); } }