Bläddra i källkod

LibWeb: Add stub IDL interface for OscillatorNode

This source node generates a periodic wave form.
Shannon Booth 1 år sedan
förälder
incheckning
a83f4216a5

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -664,6 +664,7 @@ set(SOURCES
     WebAudio/AudioScheduledSourceNode.cpp
     WebAudio/BaseAudioContext.cpp
     WebAudio/OfflineAudioContext.cpp
+    WebAudio/OscillatorNode.cpp
     WebAudio/PeriodicWave.cpp
     WebDriver/Capabilities.cpp
     WebDriver/Client.cpp

+ 1 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -686,6 +686,7 @@ class AudioParam;
 class AudioScheduledSourceNode;
 class BaseAudioContext;
 class OfflineAudioContext;
+class OscillatorNode;
 class PeriodicWave;
 
 enum class AudioContextState;

+ 39 - 0
Userland/Libraries/LibWeb/WebAudio/OscillatorNode.cpp

@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/Bindings/OscillatorNodePrototype.h>
+#include <LibWeb/WebAudio/OscillatorNode.h>
+
+namespace Web::WebAudio {
+
+JS_DEFINE_ALLOCATOR(OscillatorNode);
+
+OscillatorNode::~OscillatorNode() = default;
+
+WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> OscillatorNode::create(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext> context, OscillatorOptions const& options)
+{
+    return construct_impl(realm, context, options);
+}
+
+// https://webaudio.github.io/web-audio-api/#dom-oscillatornode-oscillatornode
+WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> OscillatorNode::construct_impl(JS::Realm& realm, JS::NonnullGCPtr<BaseAudioContext>, OscillatorOptions const&)
+{
+    return WebIDL::NotSupportedError::create(realm, "FIXME: Implement OscillatorNode::construct_impl"_fly_string);
+}
+
+void OscillatorNode::initialize(JS::Realm& realm)
+{
+    Base::initialize(realm);
+    WEB_SET_PROTOTYPE_FOR_INTERFACE(OscillatorNode);
+}
+
+void OscillatorNode::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+}
+
+}

+ 38 - 0
Userland/Libraries/LibWeb/WebAudio/OscillatorNode.h

@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/Bindings/OscillatorNodePrototype.h>
+#include <LibWeb/WebAudio/AudioScheduledSourceNode.h>
+
+namespace Web::WebAudio {
+
+// https://webaudio.github.io/web-audio-api/#OscillatorOptions
+struct OscillatorOptions : AudioNodeOptions {
+    Bindings::OscillatorType type { Bindings::OscillatorType::Sine };
+    float frequency { 440 };
+    float detune { 0 };
+    JS::GCPtr<PeriodicWave> periodic_wave;
+};
+
+// https://webaudio.github.io/web-audio-api/#OscillatorNode
+class OscillatorNode : public AudioScheduledSourceNode {
+    WEB_PLATFORM_OBJECT(OscillatorNode, AudioScheduledSourceNode);
+    JS_DECLARE_ALLOCATOR(OscillatorNode);
+
+public:
+    virtual ~OscillatorNode() override;
+
+    static WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> create(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, OscillatorOptions const& = {});
+    static WebIDL::ExceptionOr<JS::NonnullGCPtr<OscillatorNode>> construct_impl(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, OscillatorOptions const& = {});
+
+protected:
+    virtual void initialize(JS::Realm&) override;
+    virtual void visit_edges(Cell::Visitor&) override;
+};
+
+}

+ 29 - 0
Userland/Libraries/LibWeb/WebAudio/OscillatorNode.idl

@@ -0,0 +1,29 @@
+#import <WebAudio/AudioScheduledSourceNode.idl>
+#import <WebAudio/PeriodicWave.idl>
+
+// https://webaudio.github.io/web-audio-api/#enumdef-oscillatortype
+enum OscillatorType {
+    "sine",
+    "square",
+    "sawtooth",
+    "triangle",
+    "custom"
+};
+
+// https://webaudio.github.io/web-audio-api/#OscillatorOptions
+dictionary OscillatorOptions : AudioNodeOptions {
+    OscillatorType type = "sine";
+    float frequency = 440;
+    float detune = 0;
+    PeriodicWave periodicWave;
+};
+
+// https://webaudio.github.io/web-audio-api/#OscillatorNode
+[Exposed=Window]
+interface OscillatorNode : AudioScheduledSourceNode {
+    constructor(BaseAudioContext context, optional OscillatorOptions options = {});
+    // FIXME: attribute OscillatorType type;
+    // FIXME: readonly attribute AudioParam frequency;
+    // FIXME: readonly attribute AudioParam detune;
+    // FIXME: undefined setPeriodicWave(PeriodicWave periodicWave);
+};

+ 1 - 0
Userland/Libraries/LibWeb/idl_files.cmake

@@ -300,6 +300,7 @@ libweb_js_bindings(WebAudio/AudioParam)
 libweb_js_bindings(WebAudio/AudioScheduledSourceNode)
 libweb_js_bindings(WebAudio/BaseAudioContext)
 libweb_js_bindings(WebAudio/OfflineAudioContext)
+libweb_js_bindings(WebAudio/OscillatorNode)
 libweb_js_bindings(WebAudio/PeriodicWave)
 libweb_js_bindings(WebGL/WebGLContextEvent)
 libweb_js_bindings(WebGL/WebGLRenderingContext)