Prechádzať zdrojové kódy

WebAudio: Stub `AudioDestinationContext`

And expose it through `BaseAudioContext::destination`
bbb651 1 rok pred
rodič
commit
779e3072f9

+ 2 - 0
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",

+ 1 - 0
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",

+ 1 - 0
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;

+ 15 - 1
Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.cpp

@@ -1,13 +1,15 @@
 /*
  * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ * Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
 #include <LibWeb/Bindings/AudioDestinationNodePrototype.h>
 #include <LibWeb/Bindings/Intrinsics.h>
-#include <LibWeb/HTML/EventNames.h>
 #include <LibWeb/WebAudio/AudioDestinationNode.h>
+#include <LibWeb/WebAudio/AudioNode.h>
+#include <LibWeb/WebAudio/BaseAudioContext.h>
 
 namespace Web::WebAudio {
 
@@ -20,6 +22,18 @@ AudioDestinationNode::AudioDestinationNode(JS::Realm& realm, JS::NonnullGCPtr<Ba
 
 AudioDestinationNode::~AudioDestinationNode() = default;
 
+// https://webaudio.github.io/web-audio-api/#dom-audiodestinationnode-maxchannelcount
+WebIDL::UnsignedLong AudioDestinationNode::max_channel_count()
+{
+    dbgln("FIXME: Implement Audio::DestinationNode::max_channel_count()");
+    return 2;
+}
+
+JS::NonnullGCPtr<AudioDestinationNode> AudioDestinationNode::construct_impl(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext> context)
+{
+    return realm.heap().allocate<AudioDestinationNode>(realm, realm, context);
+}
+
 void AudioDestinationNode::initialize(JS::Realm& realm)
 {
     Base::initialize(realm);

+ 8 - 0
Userland/Libraries/LibWeb/WebAudio/AudioDestinationNode.h

@@ -1,12 +1,16 @@
 /*
  * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ * Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
 #pragma once
 
+#include <LibWeb/Bindings/AudioDestinationNodePrototype.h>
 #include <LibWeb/WebAudio/AudioNode.h>
+#include <LibWeb/WebAudio/BaseAudioContext.h>
+#include <LibWeb/WebIDL/Types.h>
 
 namespace Web::WebAudio {
 
@@ -18,6 +22,10 @@ class AudioDestinationNode : public AudioNode {
 public:
     virtual ~AudioDestinationNode() override;
 
+    WebIDL::UnsignedLong max_channel_count();
+
+    static JS::NonnullGCPtr<AudioDestinationNode> construct_impl(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>);
+
 protected:
     AudioDestinationNode(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>);
 

+ 1 - 1
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;
 };

+ 1 - 12
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<AudioDestinationNode> BaseAudioContext::destination()
-{
-    auto& realm = this->realm();
-
-    dbgln("FIXME: Properly implement BaseAudioContext::destination");
-
-    if (!m_destination)
-        m_destination = realm.heap().allocate<AudioDestinationNode>(realm, realm, *this);
-    return *m_destination;
-}
-
 void BaseAudioContext::set_onstatechange(WebIDL::CallbackType* event_handler)
 {
     set_event_handler_attribute(HTML::EventNames::statechange, event_handler);

+ 5 - 5
Userland/Libraries/LibWeb/WebAudio/BaseAudioContext.h

@@ -9,6 +9,7 @@
 
 #include <LibWeb/Bindings/BaseAudioContextPrototype.h>
 #include <LibWeb/DOM/EventTarget.h>
+#include <LibWeb/WebAudio/AudioDestinationNode.h>
 #include <LibWeb/WebAudio/BiquadFilterNode.h>
 #include <LibWeb/WebIDL/Types.h>
 
@@ -32,6 +33,7 @@ public:
     static constexpr float MIN_SAMPLE_RATE { 8000 };
     static constexpr float MAX_SAMPLE_RATE { 192000 };
 
+    JS::NonnullGCPtr<AudioDestinationNode> 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<JS::NonnullGCPtr<DynamicsCompressorNode>> create_dynamics_compressor();
     JS::NonnullGCPtr<GainNode> create_gain();
 
-    JS::NonnullGCPtr<AudioDestinationNode> destination();
-
 protected:
     explicit BaseAudioContext(JS::Realm&, float m_sample_rate = 0);
 
-    virtual void initialize(JS::Realm&) override;
+    JS::NonnullGCPtr<AudioDestinationNode> 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<AudioDestinationNode> m_destination;
 };
 
 }