/* * Copyright (c) 2024, Bar Yemini * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::WebAudio { // https://webaudio.github.io/web-audio-api/#AudioBufferSourceOptions struct AudioBufferSourceOptions : AudioNodeOptions { GC::Ptr buffer; float detune { 0 }; bool loop { false }; double loop_end { 0 }; double loop_start { 0 }; float playback_rate { 1 }; }; // https://webaudio.github.io/web-audio-api/#AudioBufferSourceNode class AudioBufferSourceNode : public AudioScheduledSourceNode { WEB_PLATFORM_OBJECT(AudioBufferSourceNode, AudioScheduledSourceNode); GC_DECLARE_ALLOCATOR(AudioBufferSourceNode); public: virtual ~AudioBufferSourceNode() override; WebIDL::ExceptionOr set_buffer(GC::Ptr); GC::Ptr buffer() const; GC::Ref playback_rate() const; GC::Ref detune() const; WebIDL::ExceptionOr set_loop(bool); bool loop() const; WebIDL::ExceptionOr set_loop_start(double); double loop_start() const; WebIDL::ExceptionOr set_loop_end(double); double loop_end() const; WebIDL::UnsignedLong number_of_inputs() override { return 0; } WebIDL::UnsignedLong number_of_outputs() override { return 1; } WebIDL::ExceptionOr start(Optional, Optional, Optional); static WebIDL::ExceptionOr> create(JS::Realm&, GC::Ref, AudioBufferSourceOptions const& = {}); static WebIDL::ExceptionOr> construct_impl(JS::Realm&, GC::Ref, AudioBufferSourceOptions const& = {}); protected: AudioBufferSourceNode(JS::Realm&, GC::Ref, AudioBufferSourceOptions const& = {}); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; private: GC::Ptr m_buffer; GC::Ref m_playback_rate; GC::Ref m_detune; bool m_loop { false }; // https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer-set-slot bool m_buffer_set { false }; double m_loop_start { 0.0 }; double m_loop_end { 0.0 }; }; }