1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef AudioBufferSourceNode_h_
#define AudioBufferSourceNode_h_
#include "AudioScheduledSourceNode.h"
#include "AudioBuffer.h"
namespace mozilla::dom {
struct AudioBufferSourceOptions;
class AudioParam;
class AudioBufferSourceNode final : public AudioScheduledSourceNode,
public MainThreadMediaTrackListener {
public:
static already_AddRefed<AudioBufferSourceNode> Create(
JSContext* aCx, AudioContext& aAudioContext,
const AudioBufferSourceOptions& aOptions);
void DestroyMediaTrack() override;
uint16_t NumberOfInputs() const final { return 0; }
AudioBufferSourceNode* AsAudioBufferSourceNode() override { return this; }
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioBufferSourceNode,
AudioScheduledSourceNode)
static already_AddRefed<AudioBufferSourceNode> Constructor(
const GlobalObject& aGlobal, AudioContext& aAudioContext,
const AudioBufferSourceOptions& aOptions) {
return Create(aGlobal.Context(), aAudioContext, aOptions);
}
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
void Start(double aWhen, double aOffset, const Optional<double>& aDuration,
ErrorResult& aRv);
void Start(double aWhen, ErrorResult& aRv) override;
void Stop(double aWhen, ErrorResult& aRv) override;
AudioBuffer* GetBuffer(JSContext* aCx) const { return mBuffer; }
void SetBuffer(JSContext* aCx, AudioBuffer* aBuffer, ErrorResult& aRv) {
if (aBuffer && mBufferSet) {
aRv.ThrowInvalidStateError(
"Cannot set the buffer attribute of an AudioBufferSourceNode "
"with an AudioBuffer more than once");
return;
}
if (aBuffer) {
mBufferSet = true;
}
mBuffer = aBuffer;
SendBufferParameterToTrack(aCx);
SendLoopParametersToTrack();
}
AudioParam* PlaybackRate() const { return mPlaybackRate; }
AudioParam* Detune() const { return mDetune; }
bool Loop() const { return mLoop; }
void SetLoop(bool aLoop) {
mLoop = aLoop;
SendLoopParametersToTrack();
}
double LoopStart() const { return mLoopStart; }
void SetLoopStart(double aStart) {
mLoopStart = aStart;
SendLoopParametersToTrack();
}
double LoopEnd() const { return mLoopEnd; }
void SetLoopEnd(double aEnd) {
mLoopEnd = aEnd;
SendLoopParametersToTrack();
}
void NotifyMainThreadTrackEnded() override;
const char* NodeType() const override { return "AudioBufferSourceNode"; }
size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
private:
explicit AudioBufferSourceNode(AudioContext* aContext);
~AudioBufferSourceNode() = default;
friend class AudioBufferSourceNodeEngine;
// START is sent during Start().
// STOP is sent during Stop().
// BUFFERSTART and DURATION are sent when SetBuffer() and Start() have
// been called (along with sending the buffer).
enum EngineParameters {
SAMPLE_RATE,
START,
STOP,
// BUFFERSTART is the "offset" passed to start(), multiplied by
// buffer.sampleRate.
BUFFERSTART,
DURATION,
LOOP,
LOOPSTART,
LOOPEND,
PLAYBACKRATE,
DETUNE
};
void SendLoopParametersToTrack();
void SendBufferParameterToTrack(JSContext* aCx);
void SendOffsetAndDurationParametersToTrack(AudioNodeTrack* aTrack);
double mLoopStart;
double mLoopEnd;
double mOffset;
double mDuration;
RefPtr<AudioBuffer> mBuffer;
RefPtr<AudioParam> mPlaybackRate;
RefPtr<AudioParam> mDetune;
bool mLoop;
bool mStartCalled;
bool mBufferSet;
};
} // namespace mozilla::dom
#endif
|