diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/WebAudio/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/WebAudio/BUILD.gn index f0ee11e4c15..1a70a024896 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/WebAudio/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/WebAudio/BUILD.gn @@ -10,6 +10,8 @@ source_set("WebAudio") { "AudioBufferSourceNode.h", "AudioContext.cpp", "AudioContext.h", + "AudioDestinationNode.cpp", + "AudioDestinationNode.h", "AudioNode.cpp", "AudioNode.h", "AudioParam.cpp", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index 0530fe4ba15..5277694584d 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -321,6 +321,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/WebAudio/AudioBuffer.idl", "//Userland/Libraries/LibWeb/WebAudio/AudioBufferSourceNode.idl", "//Userland/Libraries/LibWeb/WebAudio/AudioContext.idl", + "//Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.idl", "//Userland/Libraries/LibWeb/WebAudio/AudioNode.idl", "//Userland/Libraries/LibWeb/WebAudio/AudioParam.idl", "//Userland/Libraries/LibWeb/WebAudio/AudioScheduledSourceNode.idl", diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 69af70be34c..82a8255eecc 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -718,6 +718,7 @@ class AudioBuffer; class AudioBufferSourceNode; class AudioDestinationNode; class AudioContext; +class AudioDestinationNode; class AudioNode; class AudioParam; class AudioScheduledSourceNode; diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.cpp index 679b0f44ee1..5a76d78aba9 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.cpp +++ b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.cpp @@ -1,13 +1,15 @@ /* * Copyright (c) 2024, Shannon Booth + * Copyright (c) 2024, Bar Yemini * * SPDX-License-Identifier: BSD-2-Clause */ #include #include -#include #include +#include +#include namespace Web::WebAudio { @@ -20,6 +22,18 @@ AudioDestinationNode::AudioDestinationNode(JS::Realm& realm, JS::NonnullGCPtr AudioDestinationNode::construct_impl(JS::Realm& realm, JS::NonnullGCPtr context) +{ + return realm.heap().allocate(realm, realm, context); +} + void AudioDestinationNode::initialize(JS::Realm& realm) { Base::initialize(realm); diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.h b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.h index 481c9691637..0f20bc54fc1 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.h +++ b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.h @@ -1,12 +1,16 @@ /* * Copyright (c) 2024, Shannon Booth + * Copyright (c) 2024, Bar Yemini * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once +#include #include +#include +#include namespace Web::WebAudio { @@ -18,6 +22,10 @@ class AudioDestinationNode : public AudioNode { public: virtual ~AudioDestinationNode() override; + WebIDL::UnsignedLong max_channel_count(); + + static JS::NonnullGCPtr construct_impl(JS::Realm&, JS::NonnullGCPtr); + protected: AudioDestinationNode(JS::Realm&, JS::NonnullGCPtr); diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.idl b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.idl index d72748c4c5e..5f31c7506b4 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.idl +++ b/Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.idl @@ -3,5 +3,5 @@ // https://webaudio.github.io/web-audio-api/#AudioDestinationNode [Exposed=Window] interface AudioDestinationNode : AudioNode { - [FIXME] readonly attribute unsigned long maxChannelCount; + readonly attribute unsigned long maxChannelCount; }; diff --git a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp index 41f8eb94775..0ae00304aba 100644 --- a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp +++ b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.cpp @@ -21,6 +21,7 @@ namespace Web::WebAudio { BaseAudioContext::BaseAudioContext(JS::Realm& realm, float sample_rate) : DOM::EventTarget(realm) + , m_destination(AudioDestinationNode::construct_impl(realm, *this)) , m_sample_rate(sample_rate) { } @@ -39,18 +40,6 @@ void BaseAudioContext::visit_edges(Cell::Visitor& visitor) visitor.visit(m_destination); } -// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-destination -JS::NonnullGCPtr BaseAudioContext::destination() -{ - auto& realm = this->realm(); - - dbgln("FIXME: Properly implement BaseAudioContext::destination"); - - if (!m_destination) - m_destination = realm.heap().allocate(realm, realm, *this); - return *m_destination; -} - void BaseAudioContext::set_onstatechange(WebIDL::CallbackType* event_handler) { set_event_handler_attribute(HTML::EventNames::statechange, event_handler); diff --git a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h index e0a337135f1..42da0f00e98 100644 --- a/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h +++ b/Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -32,6 +33,7 @@ public: static constexpr float MIN_SAMPLE_RATE { 8000 }; static constexpr float MAX_SAMPLE_RATE { 192000 }; + JS::NonnullGCPtr destination() const { return m_destination; } float sample_rate() const { return m_sample_rate; } double current_time() const { return m_current_time; } Bindings::AudioContextState state() const { return m_control_thread_state; } @@ -55,14 +57,13 @@ public: WebIDL::ExceptionOr> create_dynamics_compressor(); JS::NonnullGCPtr create_gain(); - JS::NonnullGCPtr destination(); - protected: explicit BaseAudioContext(JS::Realm&, float m_sample_rate = 0); - virtual void initialize(JS::Realm&) override; + JS::NonnullGCPtr m_destination; - virtual void visit_edges(Cell::Visitor& visitor) override; + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; private: float m_sample_rate { 0 }; @@ -70,7 +71,6 @@ private: Bindings::AudioContextState m_control_thread_state = Bindings::AudioContextState::Suspended; Bindings::AudioContextState m_rendering_thread_state = Bindings::AudioContextState::Suspended; - JS::GCPtr m_destination; }; }