Coverage Report

Created: 2026-10-28 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibWeb/WebAudio/AudioBufferSourceNode.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2024, Bar Yemini <bar.ye651@gmail.com>
3
 *
4
 * SPDX-License-Identifier: BSD-2-Clause
5
 */
6
7
#pragma once
8
9
#include <LibWeb/Bindings/AudioBufferSourceNodePrototype.h>
10
#include <LibWeb/WebAudio/AudioBuffer.h>
11
#include <LibWeb/WebAudio/AudioParam.h>
12
#include <LibWeb/WebAudio/AudioScheduledSourceNode.h>
13
14
namespace Web::WebAudio {
15
16
// https://webaudio.github.io/web-audio-api/#AudioBufferSourceOptions
17
struct AudioBufferSourceOptions {
18
    JS::GCPtr<AudioBuffer> buffer;
19
    float detune { 0 };
20
    bool loop { false };
21
    double loop_end { 0 };
22
    double loop_start { 0 };
23
    float playback_rate { 1 };
24
};
25
26
// https://webaudio.github.io/web-audio-api/#AudioBufferSourceNode
27
class AudioBufferSourceNode : public AudioScheduledSourceNode {
28
    WEB_PLATFORM_OBJECT(AudioBufferSourceNode, AudioScheduledSourceNode);
29
    JS_DECLARE_ALLOCATOR(AudioBufferSourceNode);
30
31
public:
32
    virtual ~AudioBufferSourceNode() override;
33
34
    WebIDL::ExceptionOr<void> set_buffer(JS::GCPtr<AudioBuffer>);
35
    JS::GCPtr<AudioBuffer> buffer() const;
36
    JS::NonnullGCPtr<AudioParam> playback_rate() const;
37
    JS::NonnullGCPtr<AudioParam> detune() const;
38
    WebIDL::ExceptionOr<void> set_loop(bool);
39
    bool loop() const;
40
    WebIDL::ExceptionOr<void> set_loop_start(double);
41
    double loop_start() const;
42
    WebIDL::ExceptionOr<void> set_loop_end(double);
43
    double loop_end() const;
44
0
    WebIDL::UnsignedLong number_of_inputs() override { return 0; }
45
0
    WebIDL::UnsignedLong number_of_outputs() override { return 2; }
46
47
    WebIDL::ExceptionOr<void> start(Optional<double>, Optional<double>, Optional<double>);
48
49
    static WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBufferSourceNode>> create(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, AudioBufferSourceOptions const& = {});
50
    static WebIDL::ExceptionOr<JS::NonnullGCPtr<AudioBufferSourceNode>> construct_impl(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, AudioBufferSourceOptions const& = {});
51
52
protected:
53
    AudioBufferSourceNode(JS::Realm&, JS::NonnullGCPtr<BaseAudioContext>, AudioBufferSourceOptions const& = {});
54
55
    virtual void initialize(JS::Realm&) override;
56
    virtual void visit_edges(Cell::Visitor&) override;
57
58
private:
59
    JS::GCPtr<AudioBuffer> m_buffer;
60
    JS::NonnullGCPtr<AudioParam> m_playback_rate;
61
    JS::NonnullGCPtr<AudioParam> m_detune;
62
    bool m_loop { false };
63
    double m_loop_start { 0.0 };
64
    double m_loop_end { 0.0 };
65
};
66
67
}