react-native-audio-api 0.6.1-rc.1 → 0.6.1-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +94 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +9 -0
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +8 -0
- package/common/cpp/audioapi/core/BaseAudioContext.h +3 -3
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -0
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +240 -0
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +72 -0
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +3 -4
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
- package/lib/commonjs/api.js +7 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js +46 -0
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -0
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +4 -0
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/module/api.js +1 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js +40 -0
- package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -0
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +4 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +1 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +16 -0
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +4 -3
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/events/types.d.ts +8 -2
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +9 -0
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/api.ts +1 -0
- package/src/core/AudioBufferQueueSourceNode.ts +71 -0
- package/src/core/AudioScheduledSourceNode.ts +3 -3
- package/src/core/BaseAudioContext.ts +8 -0
- package/src/events/types.ts +9 -2
- package/src/interfaces.ts +18 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/HostObjects/AudioBufferHostObject.h>
|
|
4
|
+
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
|
|
5
|
+
#include <audioapi/HostObjects/AudioParamHostObject.h>
|
|
6
|
+
#include <audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h>
|
|
7
|
+
|
|
8
|
+
#include <memory>
|
|
9
|
+
#include <vector>
|
|
10
|
+
|
|
11
|
+
namespace audioapi {
|
|
12
|
+
using namespace facebook;
|
|
13
|
+
|
|
14
|
+
class AudioBufferQueueSourceNodeHostObject
|
|
15
|
+
: public AudioScheduledSourceNodeHostObject {
|
|
16
|
+
public:
|
|
17
|
+
explicit AudioBufferQueueSourceNodeHostObject(
|
|
18
|
+
const std::shared_ptr<AudioBufferQueueSourceNode> &node)
|
|
19
|
+
: AudioScheduledSourceNodeHostObject(node) {
|
|
20
|
+
addGetters(
|
|
21
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferQueueSourceNodeHostObject, detune),
|
|
22
|
+
JSI_EXPORT_PROPERTY_GETTER(AudioBufferQueueSourceNodeHostObject, playbackRate));
|
|
23
|
+
|
|
24
|
+
addSetters(
|
|
25
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferQueueSourceNodeHostObject, onPositionChanged),
|
|
26
|
+
JSI_EXPORT_PROPERTY_SETTER(AudioBufferQueueSourceNodeHostObject, onPositionChangedInterval));
|
|
27
|
+
|
|
28
|
+
// start method is overridden in this class
|
|
29
|
+
functions_->erase("start");
|
|
30
|
+
|
|
31
|
+
addFunctions(
|
|
32
|
+
JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, start),
|
|
33
|
+
JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, enqueueBuffer));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
JSI_PROPERTY_GETTER(detune) {
|
|
37
|
+
auto audioBufferSourceNode =
|
|
38
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
39
|
+
auto detune = audioBufferSourceNode->getDetuneParam();
|
|
40
|
+
auto detuneHostObject = std::make_shared<AudioParamHostObject>(detune);
|
|
41
|
+
return jsi::Object::createFromHostObject(runtime, detuneHostObject);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
JSI_PROPERTY_GETTER(playbackRate) {
|
|
45
|
+
auto audioBufferSourceNode =
|
|
46
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
47
|
+
auto playbackRate = audioBufferSourceNode->getPlaybackRateParam();
|
|
48
|
+
auto playbackRateHostObject =
|
|
49
|
+
std::make_shared<AudioParamHostObject>(playbackRate);
|
|
50
|
+
return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
JSI_PROPERTY_SETTER(onPositionChanged) {
|
|
54
|
+
auto audioBufferQueueSourceNode =
|
|
55
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
56
|
+
|
|
57
|
+
audioBufferQueueSourceNode->setOnPositionChangedCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
JSI_PROPERTY_SETTER(onPositionChangedInterval) {
|
|
61
|
+
auto audioBufferQueueSourceNode =
|
|
62
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
63
|
+
|
|
64
|
+
audioBufferQueueSourceNode->setOnPositionChangedInterval(value.getNumber());
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
JSI_HOST_FUNCTION(start) {
|
|
68
|
+
auto when = args[0].getNumber();
|
|
69
|
+
auto offset = args[1].getNumber();
|
|
70
|
+
|
|
71
|
+
auto audioBufferQueueSourceNode =
|
|
72
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
73
|
+
|
|
74
|
+
audioBufferQueueSourceNode->start(when, offset);
|
|
75
|
+
|
|
76
|
+
return jsi::Value::undefined();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
JSI_HOST_FUNCTION(enqueueBuffer) {
|
|
80
|
+
auto audioBufferQueueSourceNode =
|
|
81
|
+
std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);
|
|
82
|
+
|
|
83
|
+
auto audioBufferHostObject =
|
|
84
|
+
args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
|
|
85
|
+
int bufferId = args[1].asNumber();
|
|
86
|
+
auto isLastBuffer = args[2].asBool();
|
|
87
|
+
|
|
88
|
+
audioBufferQueueSourceNode->enqueueBuffer(audioBufferHostObject->audioBuffer_, bufferId, isLastBuffer);
|
|
89
|
+
|
|
90
|
+
return jsi::Value::undefined();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
} // namespace audioapi
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
#include <audioapi/jsi/JsiPromise.h>
|
|
5
5
|
#include <audioapi/HostObjects/AudioBufferHostObject.h>
|
|
6
6
|
#include <audioapi/HostObjects/AudioBufferSourceNodeHostObject.h>
|
|
7
|
+
#include <audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h>
|
|
7
8
|
#include <audioapi/HostObjects/AudioDestinationNodeHostObject.h>
|
|
8
9
|
#include <audioapi/core/BaseAudioContext.h>
|
|
9
10
|
#include <audioapi/HostObjects/BiquadFilterNodeHostObject.h>
|
|
@@ -43,6 +44,7 @@ class BaseAudioContextHostObject : public JsiHostObject {
|
|
|
43
44
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),
|
|
44
45
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),
|
|
45
46
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferSource),
|
|
47
|
+
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferQueueSource),
|
|
46
48
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBuffer),
|
|
47
49
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),
|
|
48
50
|
JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),
|
|
@@ -103,6 +105,13 @@ class BaseAudioContextHostObject : public JsiHostObject {
|
|
|
103
105
|
return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);
|
|
104
106
|
}
|
|
105
107
|
|
|
108
|
+
JSI_HOST_FUNCTION(createBufferQueueSource) {
|
|
109
|
+
auto bufferSource = context_->createBufferQueueSource();
|
|
110
|
+
auto bufferStreamSourceHostObject =
|
|
111
|
+
std::make_shared<AudioBufferQueueSourceNodeHostObject>(bufferSource);
|
|
112
|
+
return jsi::Object::createFromHostObject(runtime, bufferStreamSourceHostObject);
|
|
113
|
+
}
|
|
114
|
+
|
|
106
115
|
JSI_HOST_FUNCTION(createBuffer) {
|
|
107
116
|
auto numberOfChannels = static_cast<int>(args[0].getNumber());
|
|
108
117
|
auto length = static_cast<size_t>(args[1].getNumber());
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include <audioapi/core/effects/GainNode.h>
|
|
6
6
|
#include <audioapi/core/effects/StereoPannerNode.h>
|
|
7
7
|
#include <audioapi/core/sources/AudioBuffer.h>
|
|
8
|
+
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
|
|
8
9
|
#include <audioapi/core/sources/AudioBufferSourceNode.h>
|
|
9
10
|
#include <audioapi/core/sources/OscillatorNode.h>
|
|
10
11
|
#include <audioapi/core/utils/AudioDecoder.h>
|
|
@@ -79,6 +80,13 @@ std::shared_ptr<AudioBufferSourceNode> BaseAudioContext::createBufferSource(
|
|
|
79
80
|
return bufferSource;
|
|
80
81
|
}
|
|
81
82
|
|
|
83
|
+
std::shared_ptr<AudioBufferQueueSourceNode>
|
|
84
|
+
BaseAudioContext::createBufferQueueSource() {
|
|
85
|
+
auto bufferSource = std::make_shared<AudioBufferQueueSourceNode>(this);
|
|
86
|
+
nodeManager_->addSourceNode(bufferSource);
|
|
87
|
+
return bufferSource;
|
|
88
|
+
}
|
|
89
|
+
|
|
82
90
|
std::shared_ptr<AudioBuffer> BaseAudioContext::createBuffer(
|
|
83
91
|
int numberOfChannels,
|
|
84
92
|
size_t length,
|
|
@@ -24,6 +24,7 @@ class AudioNodeManager;
|
|
|
24
24
|
class BiquadFilterNode;
|
|
25
25
|
class AudioDestinationNode;
|
|
26
26
|
class AudioBufferSourceNode;
|
|
27
|
+
class AudioBufferQueueSourceNode;
|
|
27
28
|
class AudioDecoder;
|
|
28
29
|
class AnalyserNode;
|
|
29
30
|
class AudioEventHandlerRegistry;
|
|
@@ -44,6 +45,7 @@ class BaseAudioContext {
|
|
|
44
45
|
std::shared_ptr<StereoPannerNode> createStereoPanner();
|
|
45
46
|
std::shared_ptr<BiquadFilterNode> createBiquadFilter();
|
|
46
47
|
std::shared_ptr<AudioBufferSourceNode> createBufferSource(bool pitchCorrection);
|
|
48
|
+
std::shared_ptr<AudioBufferQueueSourceNode> createBufferQueueSource();
|
|
47
49
|
static std::shared_ptr<AudioBuffer>
|
|
48
50
|
createBuffer(int numberOfChannels, size_t length, float sampleRate);
|
|
49
51
|
std::shared_ptr<PeriodicWave> createPeriodicWave(
|
|
@@ -79,9 +81,7 @@ class BaseAudioContext {
|
|
|
79
81
|
std::shared_ptr<PeriodicWave> cachedSawtoothWave_ = nullptr;
|
|
80
82
|
std::shared_ptr<PeriodicWave> cachedTriangleWave_ = nullptr;
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
friend class AudioScheduledSourceNode;
|
|
84
|
-
|
|
84
|
+
public:
|
|
85
85
|
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
86
86
|
};
|
|
87
87
|
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
#include <audioapi/core/AudioParam.h>
|
|
2
|
+
#include <audioapi/core/BaseAudioContext.h>
|
|
3
|
+
#include <audioapi/core/Constants.h>
|
|
4
|
+
#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>
|
|
5
|
+
#include <audioapi/core/utils/Locker.h>
|
|
6
|
+
#include <audioapi/dsp/AudioUtils.h>
|
|
7
|
+
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
8
|
+
#include <audioapi/utils/AudioArray.h>
|
|
9
|
+
#include <audioapi/utils/AudioBus.h>
|
|
10
|
+
|
|
11
|
+
namespace audioapi {
|
|
12
|
+
|
|
13
|
+
AudioBufferQueueSourceNode::AudioBufferQueueSourceNode(
|
|
14
|
+
BaseAudioContext *context)
|
|
15
|
+
: AudioScheduledSourceNode(context), vReadIndex_(0.0) {
|
|
16
|
+
buffers_ = {};
|
|
17
|
+
|
|
18
|
+
detuneParam_ = std::make_shared<AudioParam>(
|
|
19
|
+
0.0, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
|
|
20
|
+
playbackRateParam_ = std::make_shared<AudioParam>(
|
|
21
|
+
1.0, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
|
|
22
|
+
|
|
23
|
+
playbackRateBus_ = std::make_shared<AudioBus>(
|
|
24
|
+
RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
25
|
+
|
|
26
|
+
stretch_ =
|
|
27
|
+
std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
|
|
28
|
+
stretch_->presetDefault(channelCount_, context_->getSampleRate(), true);
|
|
29
|
+
|
|
30
|
+
onPositionChangedInterval_ = static_cast<int>(context_->getSampleRate() / 10);
|
|
31
|
+
|
|
32
|
+
isInitialized_ = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
AudioBufferQueueSourceNode::~AudioBufferQueueSourceNode() {
|
|
36
|
+
Locker locker(getBufferLock());
|
|
37
|
+
|
|
38
|
+
buffers_ = {};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
std::shared_ptr<AudioParam> AudioBufferQueueSourceNode::getDetuneParam() const {
|
|
42
|
+
return detuneParam_;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
std::shared_ptr<AudioParam> AudioBufferQueueSourceNode::getPlaybackRateParam()
|
|
46
|
+
const {
|
|
47
|
+
return playbackRateParam_;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
void AudioBufferQueueSourceNode::start(double when, double offset) {
|
|
51
|
+
AudioScheduledSourceNode::start(when);
|
|
52
|
+
|
|
53
|
+
vReadIndex_ = static_cast<double>(context_->getSampleRate() * offset);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void AudioBufferQueueSourceNode::enqueueBuffer(
|
|
57
|
+
const std::shared_ptr<AudioBuffer> &buffer,
|
|
58
|
+
int bufferId,
|
|
59
|
+
bool isLastBuffer) {
|
|
60
|
+
auto locker = Locker(getBufferLock());
|
|
61
|
+
buffers_.emplace(bufferId, buffer);
|
|
62
|
+
|
|
63
|
+
isLastBuffer_ = isLastBuffer;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void AudioBufferQueueSourceNode::disable() {
|
|
67
|
+
audioapi::AudioNode::disable();
|
|
68
|
+
|
|
69
|
+
std::string state = "stopped";
|
|
70
|
+
|
|
71
|
+
// if it has not been stopped, it is ended
|
|
72
|
+
if (stopTime_ < 0) {
|
|
73
|
+
state = "ended";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
std::unordered_map<std::string, EventValue> body = {
|
|
77
|
+
{"value", getStopTime()}, {"state", state}, {"bufferId", bufferId_}};
|
|
78
|
+
|
|
79
|
+
context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
80
|
+
"ended", onEndedCallbackId_, body);
|
|
81
|
+
buffers_ = {};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
std::mutex &AudioBufferQueueSourceNode::getBufferLock() {
|
|
85
|
+
return bufferLock_;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
void AudioBufferQueueSourceNode::processNode(
|
|
89
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
90
|
+
int framesToProcess) {
|
|
91
|
+
if (auto locker = Locker::tryLock(getBufferLock())) {
|
|
92
|
+
// No audio data to fill, zero the output and return.
|
|
93
|
+
if (buffers_.empty()) {
|
|
94
|
+
processingBus->zero();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
processWithPitchCorrection(processingBus, framesToProcess);
|
|
99
|
+
|
|
100
|
+
handleStopScheduled();
|
|
101
|
+
} else {
|
|
102
|
+
processingBus->zero();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
double AudioBufferQueueSourceNode::getStopTime() const {
|
|
107
|
+
return dsp::sampleFrameToTime(
|
|
108
|
+
static_cast<int>(vReadIndex_), context_->getSampleRate());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
void AudioBufferQueueSourceNode::setOnPositionChangedCallbackId(
|
|
112
|
+
uint64_t callbackId) {
|
|
113
|
+
onPositionChangedCallbackId_ = callbackId;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
void AudioBufferQueueSourceNode::sendOnPositionChangedEvent() {
|
|
117
|
+
if (onPositionChangedTime_ > onPositionChangedInterval_) {
|
|
118
|
+
std::unordered_map<std::string, EventValue> body = {
|
|
119
|
+
{"value", getStopTime()}, {"bufferId", bufferId_}};
|
|
120
|
+
|
|
121
|
+
context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
122
|
+
"positionChanged", onPositionChangedCallbackId_, body);
|
|
123
|
+
|
|
124
|
+
onPositionChangedTime_ = 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
onPositionChangedTime_ += RENDER_QUANTUM_SIZE;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
void AudioBufferQueueSourceNode::setOnPositionChangedInterval(int interval) {
|
|
131
|
+
onPositionChangedInterval_ = static_cast<int>(
|
|
132
|
+
context_->getSampleRate() * 1000 / static_cast<float>(interval));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Helper functions
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
void AudioBufferQueueSourceNode::processWithPitchCorrection(
|
|
140
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
141
|
+
int framesToProcess) {
|
|
142
|
+
size_t startOffset = 0;
|
|
143
|
+
size_t offsetLength = 0;
|
|
144
|
+
|
|
145
|
+
auto time = context_->getCurrentTime();
|
|
146
|
+
auto playbackRate = std::clamp(
|
|
147
|
+
playbackRateParam_->processKRateParam(framesToProcess, time), 0.0f, 3.0f);
|
|
148
|
+
auto detune = std::clamp(
|
|
149
|
+
detuneParam_->processKRateParam(framesToProcess, time) / 100.0f,
|
|
150
|
+
-12.0f,
|
|
151
|
+
12.0f);
|
|
152
|
+
|
|
153
|
+
playbackRateBus_->zero();
|
|
154
|
+
|
|
155
|
+
updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
|
|
156
|
+
|
|
157
|
+
if (playbackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
|
|
158
|
+
processingBus->zero();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Send position changed event
|
|
163
|
+
sendOnPositionChangedEvent();
|
|
164
|
+
|
|
165
|
+
auto framesNeededToStretch =
|
|
166
|
+
static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
|
|
167
|
+
auto stretchedStartOffset =
|
|
168
|
+
static_cast<size_t>(static_cast<float>(startOffset) * playbackRate);
|
|
169
|
+
auto stretchedOffsetLength =
|
|
170
|
+
static_cast<size_t>(static_cast<float>(offsetLength) * playbackRate);
|
|
171
|
+
|
|
172
|
+
processWithoutInterpolation(
|
|
173
|
+
playbackRateBus_, stretchedStartOffset, stretchedOffsetLength);
|
|
174
|
+
|
|
175
|
+
stretch_->process(
|
|
176
|
+
playbackRateBus_.get()[0],
|
|
177
|
+
framesNeededToStretch,
|
|
178
|
+
processingBus.get()[0],
|
|
179
|
+
framesToProcess);
|
|
180
|
+
|
|
181
|
+
if (detune != 0.0f) {
|
|
182
|
+
stretch_->setTransposeSemitones(detune);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
void AudioBufferQueueSourceNode::processWithoutInterpolation(
|
|
187
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
188
|
+
size_t startOffset,
|
|
189
|
+
size_t offsetLength) {
|
|
190
|
+
auto readIndex = static_cast<size_t>(vReadIndex_);
|
|
191
|
+
size_t writeIndex = startOffset;
|
|
192
|
+
|
|
193
|
+
auto queueData = buffers_.front();
|
|
194
|
+
bufferId_ = queueData.first;
|
|
195
|
+
auto buffer = queueData.second;
|
|
196
|
+
|
|
197
|
+
size_t framesLeft = offsetLength;
|
|
198
|
+
|
|
199
|
+
while (framesLeft > 0) {
|
|
200
|
+
size_t framesToEnd = buffer->getLength() - readIndex;
|
|
201
|
+
size_t framesToCopy = std::min(framesToEnd, framesLeft);
|
|
202
|
+
framesToCopy = framesToCopy > 0 ? framesToCopy : 0;
|
|
203
|
+
|
|
204
|
+
assert(readIndex >= 0);
|
|
205
|
+
assert(writeIndex >= 0);
|
|
206
|
+
assert(writeIndex + framesToCopy <= processingBus->getSize());
|
|
207
|
+
|
|
208
|
+
processingBus->copy(
|
|
209
|
+
buffer->bus_.get(), readIndex, writeIndex, framesToCopy);
|
|
210
|
+
|
|
211
|
+
writeIndex += framesToCopy;
|
|
212
|
+
readIndex += framesToCopy;
|
|
213
|
+
framesLeft -= framesToCopy;
|
|
214
|
+
|
|
215
|
+
if (readIndex >= buffer->getLength()) {
|
|
216
|
+
buffers_.pop();
|
|
217
|
+
|
|
218
|
+
if (buffers_.empty()) {
|
|
219
|
+
processingBus->zero(writeIndex, framesLeft);
|
|
220
|
+
readIndex = 0;
|
|
221
|
+
|
|
222
|
+
if (isLastBuffer_) {
|
|
223
|
+
playbackState_ = PlaybackState::STOP_SCHEDULED;
|
|
224
|
+
}
|
|
225
|
+
break;
|
|
226
|
+
} else {
|
|
227
|
+
queueData = buffers_.front();
|
|
228
|
+
bufferId_ = queueData.first;
|
|
229
|
+
buffer = queueData.second;
|
|
230
|
+
|
|
231
|
+
readIndex = 0;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// update reading index for next render quantum
|
|
237
|
+
vReadIndex_ = static_cast<double>(readIndex);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/core/sources/AudioBuffer.h>
|
|
4
|
+
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
5
|
+
#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
|
|
6
|
+
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <cstddef>
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <string>
|
|
11
|
+
#include <queue>
|
|
12
|
+
|
|
13
|
+
namespace audioapi {
|
|
14
|
+
|
|
15
|
+
class AudioBus;
|
|
16
|
+
class AudioParam;
|
|
17
|
+
|
|
18
|
+
class AudioBufferQueueSourceNode : public AudioScheduledSourceNode {
|
|
19
|
+
public:
|
|
20
|
+
explicit AudioBufferQueueSourceNode(BaseAudioContext *context);
|
|
21
|
+
~AudioBufferQueueSourceNode() override;
|
|
22
|
+
|
|
23
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
24
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
|
|
25
|
+
|
|
26
|
+
void start(double when, double offset);
|
|
27
|
+
void enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer, int bufferId, bool isLastBuffer);
|
|
28
|
+
void disable() override;
|
|
29
|
+
|
|
30
|
+
void setOnPositionChangedCallbackId(uint64_t callbackId);
|
|
31
|
+
void setOnPositionChangedInterval(int interval);
|
|
32
|
+
void sendOnPositionChangedEvent();
|
|
33
|
+
|
|
34
|
+
protected:
|
|
35
|
+
std::mutex &getBufferLock();
|
|
36
|
+
void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
37
|
+
double getStopTime() const override;
|
|
38
|
+
|
|
39
|
+
private:
|
|
40
|
+
std::mutex bufferLock_;
|
|
41
|
+
|
|
42
|
+
// pitch correction
|
|
43
|
+
std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
|
|
44
|
+
std::shared_ptr<AudioBus> playbackRateBus_;
|
|
45
|
+
|
|
46
|
+
// k-rate params
|
|
47
|
+
std::shared_ptr<AudioParam> detuneParam_;
|
|
48
|
+
std::shared_ptr<AudioParam> playbackRateParam_;
|
|
49
|
+
|
|
50
|
+
// internal helper
|
|
51
|
+
double vReadIndex_;
|
|
52
|
+
|
|
53
|
+
// User provided buffers
|
|
54
|
+
std::queue<std::pair<int, std::shared_ptr<AudioBuffer>>> buffers_;
|
|
55
|
+
int bufferId_ = 0;
|
|
56
|
+
bool isLastBuffer_ = false;
|
|
57
|
+
|
|
58
|
+
// positionChanged event props: callbackId, update interval in frames, time since last update in frames
|
|
59
|
+
uint64_t onPositionChangedCallbackId_ = 0;
|
|
60
|
+
int onPositionChangedInterval_;
|
|
61
|
+
int onPositionChangedTime_ = 0;
|
|
62
|
+
|
|
63
|
+
void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
|
|
64
|
+
int framesToProcess);
|
|
65
|
+
|
|
66
|
+
void processWithoutInterpolation(
|
|
67
|
+
const std::shared_ptr<AudioBus>& processingBus,
|
|
68
|
+
size_t startOffset,
|
|
69
|
+
size_t offsetLength);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
} // namespace audioapi
|
|
@@ -17,7 +17,7 @@ class AudioParam;
|
|
|
17
17
|
class AudioBufferSourceNode : public AudioScheduledSourceNode {
|
|
18
18
|
public:
|
|
19
19
|
explicit AudioBufferSourceNode(BaseAudioContext *context, bool pitchCorrection);
|
|
20
|
-
~AudioBufferSourceNode();
|
|
20
|
+
~AudioBufferSourceNode() override;
|
|
21
21
|
|
|
22
22
|
[[nodiscard]] bool getLoop() const;
|
|
23
23
|
[[nodiscard]] double getLoopStart() const;
|
|
@@ -10,9 +10,9 @@ namespace audioapi {
|
|
|
10
10
|
|
|
11
11
|
AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
|
|
12
12
|
: AudioNode(context),
|
|
13
|
-
playbackState_(PlaybackState::UNSCHEDULED),
|
|
14
13
|
startTime_(-1.0),
|
|
15
|
-
stopTime_(-1.0)
|
|
14
|
+
stopTime_(-1.0),
|
|
15
|
+
playbackState_(PlaybackState::UNSCHEDULED) {
|
|
16
16
|
numberOfInputs_ = 0;
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -43,6 +43,9 @@ class AudioScheduledSourceNode : public AudioNode {
|
|
|
43
43
|
void disable() override;
|
|
44
44
|
|
|
45
45
|
protected:
|
|
46
|
+
double startTime_;
|
|
47
|
+
double stopTime_;
|
|
48
|
+
|
|
46
49
|
PlaybackState playbackState_;
|
|
47
50
|
|
|
48
51
|
void updatePlaybackInfo(
|
|
@@ -53,10 +56,6 @@ class AudioScheduledSourceNode : public AudioNode {
|
|
|
53
56
|
|
|
54
57
|
void handleStopScheduled();
|
|
55
58
|
|
|
56
|
-
private:
|
|
57
|
-
double startTime_;
|
|
58
|
-
double stopTime_;
|
|
59
|
-
|
|
60
59
|
uint64_t onEndedCallbackId_ = 0;
|
|
61
60
|
};
|
|
62
61
|
|
|
@@ -49,9 +49,10 @@ class AudioEventHandlerRegistry {
|
|
|
49
49
|
"volumeChange",
|
|
50
50
|
};
|
|
51
51
|
|
|
52
|
-
static constexpr std::array<std::string_view,
|
|
52
|
+
static constexpr std::array<std::string_view, 5> AUDIO_API_EVENT_NAMES = {
|
|
53
53
|
"ended",
|
|
54
54
|
"audioReady",
|
|
55
|
+
"positionChanged",
|
|
55
56
|
"audioError",
|
|
56
57
|
"systemStateChanged"
|
|
57
58
|
};
|
package/lib/commonjs/api.js
CHANGED
|
@@ -15,6 +15,12 @@ Object.defineProperty(exports, "AudioBuffer", {
|
|
|
15
15
|
return _AudioBuffer.default;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
+
Object.defineProperty(exports, "AudioBufferQueueSourceNode", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _AudioBufferQueueSourceNode.default;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
18
24
|
Object.defineProperty(exports, "AudioBufferSourceNode", {
|
|
19
25
|
enumerable: true,
|
|
20
26
|
get: function () {
|
|
@@ -180,6 +186,7 @@ Object.defineProperty(exports, "useSystemVolume", {
|
|
|
180
186
|
var _specs = require("./specs");
|
|
181
187
|
var _AudioBuffer = _interopRequireDefault(require("./core/AudioBuffer"));
|
|
182
188
|
var _AudioBufferSourceNode = _interopRequireDefault(require("./core/AudioBufferSourceNode"));
|
|
189
|
+
var _AudioBufferQueueSourceNode = _interopRequireDefault(require("./core/AudioBufferQueueSourceNode"));
|
|
183
190
|
var _AudioContext = _interopRequireDefault(require("./core/AudioContext"));
|
|
184
191
|
var _OfflineAudioContext = _interopRequireDefault(require("./core/OfflineAudioContext"));
|
|
185
192
|
var _AudioDestinationNode = _interopRequireDefault(require("./core/AudioDestinationNode"));
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAuCA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,2BAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,aAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,oBAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,qBAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,UAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,aAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,WAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,yBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,iBAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,iBAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,SAAA,GAAAZ,sBAAA,CAAAF,OAAA;AACA,IAAAe,eAAA,GAAAb,sBAAA,CAAAF,OAAA;AACA,IAAAgB,iBAAA,GAAAd,sBAAA,CAAAF,OAAA;AACA,IAAAiB,cAAA,GAAAf,sBAAA,CAAAF,OAAA;AACA,IAAAkB,OAAA,GAAAhB,sBAAA,CAAAF,OAAA;AACA,IAAAmB,eAAA,GAAAjB,sBAAA,CAAAF,OAAA;AAEA,IAAAoB,MAAA,GAAApB,OAAA;AAUA,IAAAqB,OAAA,GAAArB,OAAA;AAMkB,SAAAE,uBAAAoB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAjElB;;AAaA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
|
|
8
|
+
var _AudioParam = _interopRequireDefault(require("./AudioParam"));
|
|
9
|
+
var _errors = require("../errors");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
class AudioBufferQueueSourceNode extends _AudioScheduledSourceNode.default {
|
|
12
|
+
constructor(context, node) {
|
|
13
|
+
super(context, node);
|
|
14
|
+
this.detune = new _AudioParam.default(node.detune, context);
|
|
15
|
+
this.playbackRate = new _AudioParam.default(node.playbackRate, context);
|
|
16
|
+
}
|
|
17
|
+
enqueueBuffer(buffer, bufferId = 0, isLastBuffer = false) {
|
|
18
|
+
this.node.enqueueBuffer(buffer.buffer, bufferId, isLastBuffer);
|
|
19
|
+
}
|
|
20
|
+
start(when = 0, offset = 0) {
|
|
21
|
+
if (when < 0) {
|
|
22
|
+
throw new _errors.RangeError(`when must be a finite non-negative number: ${when}`);
|
|
23
|
+
}
|
|
24
|
+
if (offset < 0) {
|
|
25
|
+
throw new _errors.RangeError(`offset must be a finite non-negative number: ${offset}`);
|
|
26
|
+
}
|
|
27
|
+
if (this.hasBeenStarted) {
|
|
28
|
+
throw new _errors.InvalidStateError('Cannot call start more than once');
|
|
29
|
+
}
|
|
30
|
+
this.hasBeenStarted = true;
|
|
31
|
+
this.node.start(when, offset);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line accessor-pairs
|
|
35
|
+
set onPositionChanged(callback) {
|
|
36
|
+
const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
37
|
+
this.node.onPositionChanged = subscription.subscriptionId;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line accessor-pairs
|
|
41
|
+
set onPositionChangedInterval(value) {
|
|
42
|
+
this.node.onPositionChangedInterval = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.default = AudioBufferQueueSourceNode;
|
|
46
|
+
//# sourceMappingURL=AudioBufferQueueSourceNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","_AudioParam","_errors","e","__esModule","default","AudioBufferQueueSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","enqueueBuffer","buffer","bufferId","isLastBuffer","start","when","offset","RangeError","hasBeenStarted","InvalidStateError","onPositionChanged","callback","subscription","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferQueueSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,WAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAA0D,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAG3C,MAAMG,0BAA0B,SAASC,iCAAwB,CAAC;EAI/EC,WAAWA,CAACC,OAAyB,EAAEC,IAAiC,EAAE;IACxE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIC,mBAAU,CAACF,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACI,YAAY,GAAG,IAAID,mBAAU,CAACF,IAAI,CAACG,YAAY,EAAEJ,OAAO,CAAC;EAChE;EAEOK,aAAaA,CAClBC,MAAmB,EACnBC,QAAgB,GAAG,CAAC,EACpBC,YAAqB,GAAG,KAAK,EACvB;IACL,IAAI,CAACP,IAAI,CAAiCI,aAAa,CACtDC,MAAM,CAACA,MAAM,EACbC,QAAQ,EACRC,YACF,CAAC;EACH;EAEOC,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAc,GAAG,CAAC,EAAQ;IACvD,IAAID,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIE,kBAAU,CAClB,8CAA8CF,IAAI,EACpD,CAAC;IACH;IAEA,IAAIC,MAAM,GAAG,CAAC,EAAE;MACd,MAAM,IAAIC,kBAAU,CAClB,gDAAgDD,MAAM,EACxD,CAAC;IACH;IAEA,IAAI,IAAI,CAACE,cAAc,EAAE;MACvB,MAAM,IAAIC,yBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACD,cAAc,GAAG,IAAI;IACzB,IAAI,CAACZ,IAAI,CAAiCQ,KAAK,CAACC,IAAI,EAAEC,MAAM,CAAC;EAChE;;EAEA;EACA,IAAWI,iBAAiBA,CAC1BC,QAAqD,EACrD;IACA,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAACC,qBAAqB,CAC/D,iBAAiB,EACjBH,QACF,CAAC;IAEA,IAAI,CAACf,IAAI,CAAiCc,iBAAiB,GAC1DE,YAAY,CAACG,cAAc;EAC/B;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACrB,IAAI,CAAiCoB,yBAAyB,GAClEC,KAAK;EACT;AACF;AAACC,OAAA,CAAA3B,OAAA,GAAAC,0BAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","onended","callback","subscription","addAudioEventListener","subscriptionId","exports"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;
|
|
1
|
+
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","onended","callback","subscription","addAudioEventListener","subscriptionId","exports"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAA8C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/B,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIC,yBAAiB,CAC1DC,MAAM,CAACD,iBACT,CAAC;EAEME,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAQ;IACnC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,IAAI,CAACL,cAAc,EAAE;MACvB,MAAM,IAAIO,yBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACP,cAAc,GAAG,IAAI;IACzB,IAAI,CAACQ,IAAI,CAA+BJ,KAAK,CAACC,IAAI,CAAC;EACtD;EAEOI,IAAIA,CAACJ,IAAY,GAAG,CAAC,EAAQ;IAClC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACL,cAAc,EAAE;MACxB,MAAM,IAAIO,yBAAiB,CACzB,8CACF,CAAC;IACH;IAEC,IAAI,CAACC,IAAI,CAA+BC,IAAI,CAACJ,IAAI,CAAC;EACrD;;EAEA;EACA,IAAWK,OAAOA,CAACC,QAA2C,EAAE;IAC9D,MAAMC,YAAY,GAAG,IAAI,CAACX,iBAAiB,CAACY,qBAAqB,CAC/D,OAAO,EACPF,QACF,CAAC;IAEA,IAAI,CAACH,IAAI,CAA+BE,OAAO,GAC9CE,YAAY,CAACE,cAAc;EAC/B;AACF;AAACC,OAAA,CAAAlB,OAAA,GAAAC,wBAAA","ignoreList":[]}
|
|
@@ -13,6 +13,7 @@ var _AudioBufferSourceNode = _interopRequireDefault(require("./AudioBufferSource
|
|
|
13
13
|
var _AudioBuffer = _interopRequireDefault(require("./AudioBuffer"));
|
|
14
14
|
var _PeriodicWave = _interopRequireDefault(require("./PeriodicWave"));
|
|
15
15
|
var _AnalyserNode = _interopRequireDefault(require("./AnalyserNode"));
|
|
16
|
+
var _AudioBufferQueueSourceNode = _interopRequireDefault(require("./AudioBufferQueueSourceNode"));
|
|
16
17
|
var _errors = require("../errors");
|
|
17
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
19
|
class BaseAudioContext {
|
|
@@ -43,6 +44,9 @@ class BaseAudioContext {
|
|
|
43
44
|
const pitchCorrection = options?.pitchCorrection ?? false;
|
|
44
45
|
return new _AudioBufferSourceNode.default(this, this.context.createBufferSource(pitchCorrection));
|
|
45
46
|
}
|
|
47
|
+
createBufferQueueSource() {
|
|
48
|
+
return new _AudioBufferQueueSourceNode.default(this, this.context.createBufferQueueSource());
|
|
49
|
+
}
|
|
46
50
|
createBuffer(numOfChannels, length, sampleRate) {
|
|
47
51
|
if (numOfChannels < 1 || numOfChannels >= 32) {
|
|
48
52
|
throw new _errors.NotSupportedError(`The number of channels provided (${numOfChannels}) is outside the range [1, 32]`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","arrayBuffer","Uint8Array","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":";;;;;;AAMA,IAAAA,qBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,iBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,sBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,YAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,aAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,aAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,OAAA,
|
|
1
|
+
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_AudioBufferQueueSourceNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","arrayBuffer","Uint8Array","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":";;;;;;AAMA,IAAAA,qBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,iBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,sBAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,YAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,aAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,aAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,2BAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,OAAA,GAAAV,OAAA;AAAkE,SAAAD,uBAAAY,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnD,MAAMG,gBAAgB,CAAC;EAKpCC,WAAWA,CAACC,OAA0B,EAAE;IACtC,IAAI,CAACA,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAG,IAAIC,6BAAoB,CAAC,IAAI,EAAEF,OAAO,CAACC,WAAW,CAAC;IACtE,IAAI,CAACE,UAAU,GAAGH,OAAO,CAACG,UAAU;EACtC;EAEA,IAAWC,WAAWA,CAAA,EAAW;IAC/B,OAAO,IAAI,CAACJ,OAAO,CAACI,WAAW;EACjC;EAEA,IAAWC,KAAKA,CAAA,EAAiB;IAC/B,OAAO,IAAI,CAACL,OAAO,CAACK,KAAK;EAC3B;EAEAC,gBAAgBA,CAAA,EAAmB;IACjC,OAAO,IAAIC,uBAAc,CAAC,IAAI,EAAE,IAAI,CAACP,OAAO,CAACM,gBAAgB,CAAC,CAAC,CAAC;EAClE;EAEAE,UAAUA,CAAA,EAAa;IACrB,OAAO,IAAIC,iBAAQ,CAAC,IAAI,EAAE,IAAI,CAACT,OAAO,CAACQ,UAAU,CAAC,CAAC,CAAC;EACtD;EAEAE,kBAAkBA,CAAA,EAAqB;IACrC,OAAO,IAAIC,yBAAgB,CAAC,IAAI,EAAE,IAAI,CAACX,OAAO,CAACU,kBAAkB,CAAC,CAAC,CAAC;EACtE;EAEAE,kBAAkBA,CAAA,EAAqB;IACrC,OAAO,IAAIC,yBAAgB,CAAC,IAAI,EAAE,IAAI,CAACb,OAAO,CAACY,kBAAkB,CAAC,CAAC,CAAC;EACtE;EAEAE,kBAAkBA,CAChBC,OAAsC,EACf;IACvB,MAAMC,eAAe,GAAGD,OAAO,EAAEC,eAAe,IAAI,KAAK;IAEzD,OAAO,IAAIC,8BAAqB,CAC9B,IAAI,EACJ,IAAI,CAACjB,OAAO,CAACc,kBAAkB,CAACE,eAAe,CACjD,CAAC;EACH;EAEAE,uBAAuBA,CAAA,EAA+B;IACpD,OAAO,IAAIC,mCAA0B,CACnC,IAAI,EACJ,IAAI,CAACnB,OAAO,CAACkB,uBAAuB,CAAC,CACvC,CAAC;EACH;EAEAE,YAAYA,CACVC,aAAqB,EACrBC,MAAc,EACdnB,UAAkB,EACL;IACb,IAAIkB,aAAa,GAAG,CAAC,IAAIA,aAAa,IAAI,EAAE,EAAE;MAC5C,MAAM,IAAIE,yBAAiB,CACzB,oCAAoCF,aAAa,gCACnD,CAAC;IACH;IAEA,IAAIC,MAAM,IAAI,CAAC,EAAE;MACf,MAAM,IAAIC,yBAAiB,CACzB,kCAAkCD,MAAM,kDAC1C,CAAC;IACH;IAEA,IAAInB,UAAU,GAAG,IAAI,IAAIA,UAAU,GAAG,KAAK,EAAE;MAC3C,MAAM,IAAIoB,yBAAiB,CACzB,6BAA6BpB,UAAU,sCACzC,CAAC;IACH;IAEA,OAAO,IAAIqB,oBAAW,CACpB,IAAI,CAACxB,OAAO,CAACoB,YAAY,CAACC,aAAa,EAAEC,MAAM,EAAEnB,UAAU,CAC7D,CAAC;EACH;EAEAsB,kBAAkBA,CAChBC,IAAkB,EAClBC,IAAkB,EAClBC,WAAqC,EACvB;IACd,IAAIF,IAAI,CAACJ,MAAM,KAAKK,IAAI,CAACL,MAAM,EAAE;MAC/B,MAAM,IAAIO,0BAAkB,CAC1B,4BAA4BH,IAAI,CAACJ,MAAM,oBAAoBK,IAAI,CAACL,MAAM,sBACxE,CAAC;IACH;IAEA,MAAMQ,oBAAoB,GAAGF,WAAW,EAAEE,oBAAoB,IAAI,KAAK;IAEvE,OAAO,IAAIC,qBAAY,CACrB,IAAI,CAAC/B,OAAO,CAACyB,kBAAkB,CAACC,IAAI,EAAEC,IAAI,EAAEG,oBAAoB,CAClE,CAAC;EACH;EAEAE,cAAcA,CAAA,EAAiB;IAC7B,OAAO,IAAIC,qBAAY,CAAC,IAAI,EAAE,IAAI,CAACjC,OAAO,CAACgC,cAAc,CAAC,CAAC,CAAC;EAC9D;EAEA,MAAME,qBAAqBA,CAACC,UAAkB,EAAwB;IACpE;IACA,IAAIA,UAAU,CAACC,UAAU,CAAC,SAAS,CAAC,EAAE;MACpCD,UAAU,GAAGA,UAAU,CAACE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;IAChD;IAEA,OAAO,IAAIb,oBAAW,CACpB,MAAM,IAAI,CAACxB,OAAO,CAACkC,qBAAqB,CAACC,UAAU,CACrD,CAAC;EACH;EAEA,MAAMG,eAAeA,CAACC,WAAwB,EAAwB;IACpE,OAAO,IAAIf,oBAAW,CACpB,MAAM,IAAI,CAACxB,OAAO,CAACsC,eAAe,CAAC,IAAIE,UAAU,CAACD,WAAW,CAAC,CAChE,CAAC;EACH;AACF;AAACE,OAAA,CAAA5C,OAAA,GAAAC,gBAAA","ignoreList":[]}
|
package/lib/module/api.js
CHANGED
|
@@ -14,6 +14,7 @@ if (global.createAudioContext == null || global.createOfflineAudioContext == nul
|
|
|
14
14
|
}
|
|
15
15
|
export { default as AudioBuffer } from "./core/AudioBuffer.js";
|
|
16
16
|
export { default as AudioBufferSourceNode } from "./core/AudioBufferSourceNode.js";
|
|
17
|
+
export { default as AudioBufferQueueSourceNode } from "./core/AudioBufferQueueSourceNode.js";
|
|
17
18
|
export { default as AudioContext } from "./core/AudioContext.js";
|
|
18
19
|
export { default as OfflineAudioContext } from "./core/OfflineAudioContext.js";
|
|
19
20
|
export { default as AudioDestinationNode } from "./core/AudioDestinationNode.js";
|
package/lib/module/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeAudioAPIModule","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","Error","install","default","AudioBuffer","AudioBufferSourceNode","AudioContext","OfflineAudioContext","AudioDestinationNode","AudioNode","AnalyserNode","AudioParam","AudioScheduledSourceNode","BaseAudioContext","BiquadFilterNode","GainNode","OscillatorNode","StereoPannerNode","AudioRecorder","AudioManager","useSystemVolume","OscillatorType","BiquadFilterType","ChannelCountMode","ChannelInterpretation","ContextState","WindowType","PeriodicWaveConstraints","IndexSizeError","InvalidAccessError","InvalidStateError","RangeError","NotSupportedError"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,kBAAS;;AAS9C;;AAaA;;AAEA,IACEC,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACL,oBAAoB,EAAE;IACzB,MAAM,IAAIM,KAAK,CACb,iFACF,CAAC;EACH;EAEAN,oBAAoB,CAACO,OAAO,CAAC,CAAC;AAChC;AAEA,SAASC,OAAO,IAAIC,WAAW,QAAQ,uBAAoB;AAC3D,SAASD,OAAO,IAAIE,qBAAqB,QAAQ,iCAA8B;AAC/E,SAASF,OAAO,IAAIG,YAAY,QAAQ,wBAAqB;AAC7D,
|
|
1
|
+
{"version":3,"names":["NativeAudioAPIModule","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","Error","install","default","AudioBuffer","AudioBufferSourceNode","AudioBufferQueueSourceNode","AudioContext","OfflineAudioContext","AudioDestinationNode","AudioNode","AnalyserNode","AudioParam","AudioScheduledSourceNode","BaseAudioContext","BiquadFilterNode","GainNode","OscillatorNode","StereoPannerNode","AudioRecorder","AudioManager","useSystemVolume","OscillatorType","BiquadFilterType","ChannelCountMode","ChannelInterpretation","ContextState","WindowType","PeriodicWaveConstraints","IndexSizeError","InvalidAccessError","InvalidStateError","RangeError","NotSupportedError"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,kBAAS;;AAS9C;;AAaA;;AAEA,IACEC,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACL,oBAAoB,EAAE;IACzB,MAAM,IAAIM,KAAK,CACb,iFACF,CAAC;EACH;EAEAN,oBAAoB,CAACO,OAAO,CAAC,CAAC;AAChC;AAEA,SAASC,OAAO,IAAIC,WAAW,QAAQ,uBAAoB;AAC3D,SAASD,OAAO,IAAIE,qBAAqB,QAAQ,iCAA8B;AAC/E,SAASF,OAAO,IAAIG,0BAA0B,QAAQ,sCAAmC;AACzF,SAASH,OAAO,IAAII,YAAY,QAAQ,wBAAqB;AAC7D,SAASJ,OAAO,IAAIK,mBAAmB,QAAQ,+BAA4B;AAC3E,SAASL,OAAO,IAAIM,oBAAoB,QAAQ,gCAA6B;AAC7E,SAASN,OAAO,IAAIO,SAAS,QAAQ,qBAAkB;AACvD,SAASP,OAAO,IAAIQ,YAAY,QAAQ,wBAAqB;AAC7D,SAASR,OAAO,IAAIS,UAAU,QAAQ,sBAAmB;AACzD,SAAST,OAAO,IAAIU,wBAAwB,QAAQ,oCAAiC;AACrF,SAASV,OAAO,IAAIW,gBAAgB,QAAQ,4BAAyB;AACrE,SAASX,OAAO,IAAIY,gBAAgB,QAAQ,4BAAyB;AACrE,SAASZ,OAAO,IAAIa,QAAQ,QAAQ,oBAAiB;AACrD,SAASb,OAAO,IAAIc,cAAc,QAAQ,0BAAuB;AACjE,SAASd,OAAO,IAAIe,gBAAgB,QAAQ,4BAAyB;AACrE,SAASf,OAAO,IAAIgB,aAAa,QAAQ,yBAAsB;AAC/D,SAAShB,OAAO,IAAIiB,YAAY,QAAQ,mBAAU;AAClD,SAASjB,OAAO,IAAIkB,eAAe,QAAQ,2BAAwB;AAEnE,SACEC,cAAc,EACdC,gBAAgB,EAChBC,gBAAgB,EAChBC,qBAAqB,EACrBC,YAAY,EACZC,UAAU,EACVC,uBAAuB,QAClB,YAAS;AAEhB,SACEC,cAAc,EACdC,kBAAkB,EAClBC,iBAAiB,EACjBC,UAAU,EACVC,iBAAiB,QACZ,mBAAU","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import AudioScheduledSourceNode from "./AudioScheduledSourceNode.js";
|
|
4
|
+
import AudioParam from "./AudioParam.js";
|
|
5
|
+
import { InvalidStateError, RangeError } from "../errors/index.js";
|
|
6
|
+
export default class AudioBufferQueueSourceNode extends AudioScheduledSourceNode {
|
|
7
|
+
constructor(context, node) {
|
|
8
|
+
super(context, node);
|
|
9
|
+
this.detune = new AudioParam(node.detune, context);
|
|
10
|
+
this.playbackRate = new AudioParam(node.playbackRate, context);
|
|
11
|
+
}
|
|
12
|
+
enqueueBuffer(buffer, bufferId = 0, isLastBuffer = false) {
|
|
13
|
+
this.node.enqueueBuffer(buffer.buffer, bufferId, isLastBuffer);
|
|
14
|
+
}
|
|
15
|
+
start(when = 0, offset = 0) {
|
|
16
|
+
if (when < 0) {
|
|
17
|
+
throw new RangeError(`when must be a finite non-negative number: ${when}`);
|
|
18
|
+
}
|
|
19
|
+
if (offset < 0) {
|
|
20
|
+
throw new RangeError(`offset must be a finite non-negative number: ${offset}`);
|
|
21
|
+
}
|
|
22
|
+
if (this.hasBeenStarted) {
|
|
23
|
+
throw new InvalidStateError('Cannot call start more than once');
|
|
24
|
+
}
|
|
25
|
+
this.hasBeenStarted = true;
|
|
26
|
+
this.node.start(when, offset);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// eslint-disable-next-line accessor-pairs
|
|
30
|
+
set onPositionChanged(callback) {
|
|
31
|
+
const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
32
|
+
this.node.onPositionChanged = subscription.subscriptionId;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line accessor-pairs
|
|
36
|
+
set onPositionChangedInterval(value) {
|
|
37
|
+
this.node.onPositionChangedInterval = value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=AudioBufferQueueSourceNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AudioScheduledSourceNode","AudioParam","InvalidStateError","RangeError","AudioBufferQueueSourceNode","constructor","context","node","detune","playbackRate","enqueueBuffer","buffer","bufferId","isLastBuffer","start","when","offset","hasBeenStarted","onPositionChanged","callback","subscription","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value"],"sourceRoot":"../../../src","sources":["core/AudioBufferQueueSourceNode.ts"],"mappings":";;AACA,OAAOA,wBAAwB,MAAM,+BAA4B;AAGjE,OAAOC,UAAU,MAAM,iBAAc;AACrC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAGzD,eAAe,MAAMC,0BAA0B,SAASJ,wBAAwB,CAAC;EAI/EK,WAAWA,CAACC,OAAyB,EAAEC,IAAiC,EAAE;IACxE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIP,UAAU,CAACM,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACG,YAAY,GAAG,IAAIR,UAAU,CAACM,IAAI,CAACE,YAAY,EAAEH,OAAO,CAAC;EAChE;EAEOI,aAAaA,CAClBC,MAAmB,EACnBC,QAAgB,GAAG,CAAC,EACpBC,YAAqB,GAAG,KAAK,EACvB;IACL,IAAI,CAACN,IAAI,CAAiCG,aAAa,CACtDC,MAAM,CAACA,MAAM,EACbC,QAAQ,EACRC,YACF,CAAC;EACH;EAEOC,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAc,GAAG,CAAC,EAAQ;IACvD,IAAID,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIZ,UAAU,CAClB,8CAA8CY,IAAI,EACpD,CAAC;IACH;IAEA,IAAIC,MAAM,GAAG,CAAC,EAAE;MACd,MAAM,IAAIb,UAAU,CAClB,gDAAgDa,MAAM,EACxD,CAAC;IACH;IAEA,IAAI,IAAI,CAACC,cAAc,EAAE;MACvB,MAAM,IAAIf,iBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACe,cAAc,GAAG,IAAI;IACzB,IAAI,CAACV,IAAI,CAAiCO,KAAK,CAACC,IAAI,EAAEC,MAAM,CAAC;EAChE;;EAEA;EACA,IAAWE,iBAAiBA,CAC1BC,QAAqD,EACrD;IACA,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAACC,qBAAqB,CAC/D,iBAAiB,EACjBH,QACF,CAAC;IAEA,IAAI,CAACZ,IAAI,CAAiCW,iBAAiB,GAC1DE,YAAY,CAACG,cAAc;EAC/B;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAAClB,IAAI,CAAiCiB,yBAAyB,GAClEC,KAAK;EACT;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","callback","subscription","addAudioEventListener","subscriptionId"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;AACA,OAAOA,SAAS,MAAM,gBAAa;AACnC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAEzD,SAASC,iBAAiB,QAAQ,oBAAW;AAE7C,eAAe,MAAMC,wBAAwB,SAASJ,SAAS,CAAC;EACpDK,cAAc,GAAY,KAAK;
|
|
1
|
+
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","callback","subscription","addAudioEventListener","subscriptionId"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;AACA,OAAOA,SAAS,MAAM,gBAAa;AACnC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAEzD,SAASC,iBAAiB,QAAQ,oBAAW;AAE7C,eAAe,MAAMC,wBAAwB,SAASJ,SAAS,CAAC;EACpDK,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIH,iBAAiB,CAC1DI,MAAM,CAACJ,iBACT,CAAC;EAEMK,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAQ;IACnC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIP,UAAU,CAClB,8CAA8CO,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,IAAI,CAACJ,cAAc,EAAE;MACvB,MAAM,IAAIJ,iBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACI,cAAc,GAAG,IAAI;IACzB,IAAI,CAACK,IAAI,CAA+BF,KAAK,CAACC,IAAI,CAAC;EACtD;EAEOE,IAAIA,CAACF,IAAY,GAAG,CAAC,EAAQ;IAClC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIP,UAAU,CAClB,8CAA8CO,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACJ,cAAc,EAAE;MACxB,MAAM,IAAIJ,iBAAiB,CACzB,8CACF,CAAC;IACH;IAEC,IAAI,CAACS,IAAI,CAA+BC,IAAI,CAACF,IAAI,CAAC;EACrD;;EAEA;EACA,IAAWG,OAAOA,CAACC,QAA2C,EAAE;IAC9D,MAAMC,YAAY,GAAG,IAAI,CAACR,iBAAiB,CAACS,qBAAqB,CAC/D,OAAO,EACPF,QACF,CAAC;IAEA,IAAI,CAACH,IAAI,CAA+BE,OAAO,GAC9CE,YAAY,CAACE,cAAc;EAC/B;AACF","ignoreList":[]}
|
|
@@ -9,6 +9,7 @@ import AudioBufferSourceNode from "./AudioBufferSourceNode.js";
|
|
|
9
9
|
import AudioBuffer from "./AudioBuffer.js";
|
|
10
10
|
import PeriodicWave from "./PeriodicWave.js";
|
|
11
11
|
import AnalyserNode from "./AnalyserNode.js";
|
|
12
|
+
import AudioBufferQueueSourceNode from "./AudioBufferQueueSourceNode.js";
|
|
12
13
|
import { InvalidAccessError, NotSupportedError } from "../errors/index.js";
|
|
13
14
|
export default class BaseAudioContext {
|
|
14
15
|
constructor(context) {
|
|
@@ -38,6 +39,9 @@ export default class BaseAudioContext {
|
|
|
38
39
|
const pitchCorrection = options?.pitchCorrection ?? false;
|
|
39
40
|
return new AudioBufferSourceNode(this, this.context.createBufferSource(pitchCorrection));
|
|
40
41
|
}
|
|
42
|
+
createBufferQueueSource() {
|
|
43
|
+
return new AudioBufferQueueSourceNode(this, this.context.createBufferQueueSource());
|
|
44
|
+
}
|
|
41
45
|
createBuffer(numOfChannels, length, sampleRate) {
|
|
42
46
|
if (numOfChannels < 1 || numOfChannels >= 32) {
|
|
43
47
|
throw new NotSupportedError(`The number of channels provided (${numOfChannels}) is outside the range [1, 32]`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioDestinationNode","OscillatorNode","GainNode","StereoPannerNode","BiquadFilterNode","AudioBufferSourceNode","AudioBuffer","PeriodicWave","AnalyserNode","InvalidAccessError","NotSupportedError","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","createOscillator","createGain","createStereoPanner","createBiquadFilter","createBufferSource","options","pitchCorrection","createBuffer","numOfChannels","length","createPeriodicWave","real","imag","constraints","disableNormalization","createAnalyser","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","arrayBuffer","Uint8Array"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":";;AAMA,OAAOA,oBAAoB,MAAM,2BAAwB;AACzD,OAAOC,cAAc,MAAM,qBAAkB;AAC7C,OAAOC,QAAQ,MAAM,eAAY;AACjC,OAAOC,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,qBAAqB,MAAM,4BAAyB;AAC3D,OAAOC,WAAW,MAAM,kBAAe;AACvC,OAAOC,YAAY,MAAM,mBAAgB;AACzC,OAAOC,YAAY,MAAM,mBAAgB;AACzC,SAASC,kBAAkB,EAAEC,iBAAiB,QAAQ,oBAAW;AAEjE,eAAe,MAAMC,gBAAgB,CAAC;EAKpCC,WAAWA,CAACC,OAA0B,EAAE;IACtC,IAAI,CAACA,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAG,
|
|
1
|
+
{"version":3,"names":["AudioDestinationNode","OscillatorNode","GainNode","StereoPannerNode","BiquadFilterNode","AudioBufferSourceNode","AudioBuffer","PeriodicWave","AnalyserNode","AudioBufferQueueSourceNode","InvalidAccessError","NotSupportedError","BaseAudioContext","constructor","context","destination","sampleRate","currentTime","state","createOscillator","createGain","createStereoPanner","createBiquadFilter","createBufferSource","options","pitchCorrection","createBufferQueueSource","createBuffer","numOfChannels","length","createPeriodicWave","real","imag","constraints","disableNormalization","createAnalyser","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","arrayBuffer","Uint8Array"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ declare global {
|
|
|
8
8
|
}
|
|
9
9
|
export { default as AudioBuffer } from './core/AudioBuffer';
|
|
10
10
|
export { default as AudioBufferSourceNode } from './core/AudioBufferSourceNode';
|
|
11
|
+
export { default as AudioBufferQueueSourceNode } from './core/AudioBufferQueueSourceNode';
|
|
11
12
|
export { default as AudioContext } from './core/AudioContext';
|
|
12
13
|
export { default as OfflineAudioContext } from './core/OfflineAudioContext';
|
|
13
14
|
export { default as AudioDestinationNode } from './core/AudioDestinationNode';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kBAAkB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;IAC/D,IAAI,yBAAyB,EAAE,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,oBAAoB,CAAC;IAE1B,IAAI,mBAAmB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,cAAc,CAAC;IAE3E,IAAI,iBAAiB,EAAE,kBAAkB,CAAC;CAC3C;AAkBD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kBAAkB,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;IAC/D,IAAI,yBAAyB,EAAE,CAC7B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,oBAAoB,CAAC;IAE1B,IAAI,mBAAmB,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,cAAc,CAAC;IAE3E,IAAI,iBAAiB,EAAE,kBAAkB,CAAC;CAC3C;AAkBD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IAudioBufferQueueSourceNode } from '../interfaces';
|
|
2
|
+
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
3
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
4
|
+
import AudioBuffer from './AudioBuffer';
|
|
5
|
+
import AudioParam from './AudioParam';
|
|
6
|
+
import { OnPositionChangedEventType } from '../events/types';
|
|
7
|
+
export default class AudioBufferQueueSourceNode extends AudioScheduledSourceNode {
|
|
8
|
+
readonly playbackRate: AudioParam;
|
|
9
|
+
readonly detune: AudioParam;
|
|
10
|
+
constructor(context: BaseAudioContext, node: IAudioBufferQueueSourceNode);
|
|
11
|
+
enqueueBuffer(buffer: AudioBuffer, bufferId?: number, isLastBuffer?: boolean): void;
|
|
12
|
+
start(when?: number, offset?: number): void;
|
|
13
|
+
set onPositionChanged(callback: (event: OnPositionChangedEventType) => void);
|
|
14
|
+
set onPositionChangedInterval(value: number);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=AudioBufferQueueSourceNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioBufferQueueSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferQueueSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,wBAAwB;IAC9E,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,2BAA2B;IAOjE,aAAa,CAClB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,MAAU,EACpB,YAAY,GAAE,OAAe,GAC5B,IAAI;IAQA,KAAK,CAAC,IAAI,GAAE,MAAU,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAsBxD,IAAW,iBAAiB,CAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,EAStD;IAGD,IAAW,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAGjD;CACF"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import AudioNode from './AudioNode';
|
|
2
|
-
import {
|
|
2
|
+
import { OnEndedEventType } from '../events/types';
|
|
3
|
+
import { AudioEventEmitter } from '../events';
|
|
3
4
|
export default class AudioScheduledSourceNode extends AudioNode {
|
|
4
5
|
protected hasBeenStarted: boolean;
|
|
5
|
-
|
|
6
|
+
protected readonly audioEventEmitter: AudioEventEmitter;
|
|
6
7
|
start(when?: number): void;
|
|
7
8
|
stop(when?: number): void;
|
|
8
|
-
set onended(callback: (event:
|
|
9
|
+
set onended(callback: (event: OnEndedEventType) => void);
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=AudioScheduledSourceNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioScheduledSourceNode.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioScheduledSourceNode.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,oBAElC;IAEK,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAiBnC,IAAW,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,EAQ7D;CACF"}
|
|
@@ -9,6 +9,7 @@ import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
|
9
9
|
import AudioBuffer from './AudioBuffer';
|
|
10
10
|
import PeriodicWave from './PeriodicWave';
|
|
11
11
|
import AnalyserNode from './AnalyserNode';
|
|
12
|
+
import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
12
13
|
export default class BaseAudioContext {
|
|
13
14
|
readonly destination: AudioDestinationNode;
|
|
14
15
|
readonly sampleRate: number;
|
|
@@ -21,6 +22,7 @@ export default class BaseAudioContext {
|
|
|
21
22
|
createStereoPanner(): StereoPannerNode;
|
|
22
23
|
createBiquadFilter(): BiquadFilterNode;
|
|
23
24
|
createBufferSource(options?: AudioBufferSourceNodeOptions): AudioBufferSourceNode;
|
|
25
|
+
createBufferQueueSource(): AudioBufferQueueSourceNode;
|
|
24
26
|
createBuffer(numOfChannels: number, length: number, sampleRate: number): AudioBuffer;
|
|
25
27
|
createPeriodicWave(real: Float32Array, imag: Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;
|
|
26
28
|
createAnalyser(): AnalyserNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseAudioContext.d.ts","sourceRoot":"","sources":["../../../src/core/BaseAudioContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,EAC7B,MAAM,UAAU,CAAC;AAClB,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,0BAA0B,MAAM,8BAA8B,CAAC;AAGtE,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;gBAElC,OAAO,EAAE,iBAAiB;IAMtC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,gBAAgB,IAAI,cAAc;IAIlC,UAAU,IAAI,QAAQ;IAItB,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,CAChB,OAAO,CAAC,EAAE,4BAA4B,GACrC,qBAAqB;IASxB,uBAAuB,IAAI,0BAA0B;IAOrD,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW;IAwBd,kBAAkB,CAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,EAClB,WAAW,CAAC,EAAE,uBAAuB,GACpC,YAAY;IAcf,cAAc,IAAI,YAAY;IAIxB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAW/D,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;CAKtE"}
|
|
@@ -4,9 +4,14 @@ interface EventEmptyType {
|
|
|
4
4
|
export interface EventTypeWithValue {
|
|
5
5
|
value: number;
|
|
6
6
|
}
|
|
7
|
-
export interface
|
|
7
|
+
export interface OnEndedEventType {
|
|
8
8
|
value: number;
|
|
9
9
|
state: 'stopped' | 'ended';
|
|
10
|
+
bufferId: number | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface OnPositionChangedEventType {
|
|
13
|
+
value: number;
|
|
14
|
+
bufferId: number;
|
|
10
15
|
}
|
|
11
16
|
interface OnInterruptionEventType {
|
|
12
17
|
type: 'ended' | 'began';
|
|
@@ -38,8 +43,9 @@ export interface OnAudioReadyEventType {
|
|
|
38
43
|
when: number;
|
|
39
44
|
}
|
|
40
45
|
interface AudioAPIEvents {
|
|
41
|
-
ended:
|
|
46
|
+
ended: OnEndedEventType;
|
|
42
47
|
audioReady: OnAudioReadyEventType;
|
|
48
|
+
positionChanged: OnPositionChangedEventType;
|
|
43
49
|
audioError: EventEmptyType;
|
|
44
50
|
systemStateChanged: EventEmptyType;
|
|
45
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C,UAAU,cAAc;CAAG;AAE3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/events/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C,UAAU,cAAc;CAAG;AAE3B,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;IAC3B,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,qBAAqB,EAAE,cAAc,CAAC;IACtC,wBAAwB,EAAE,kBAAkB,CAAC;IAC7C,eAAe,EAAE,cAAc,CAAC;IAChC,mBAAmB,EAAE,cAAc,CAAC;IACpC,iBAAiB,EAAE,cAAc,CAAC;IAClC,kBAAkB,EAAE,cAAc,CAAC;IACnC,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,4BAA4B,EAAE,kBAAkB,CAAC;IACjD,YAAY,EAAE,kBAAkB,CAAC;IACjC,YAAY,EAAE,uBAAuB,CAAC;IACtC,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,qBAAqB,CAAC;IAClC,eAAe,EAAE,0BAA0B,CAAC;IAC5C,UAAU,EAAE,cAAc,CAAC;IAC3B,kBAAkB,EAAE,cAAc,CAAC;CACpC;AAED,KAAK,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC;AACjD,MAAM,MAAM,mBAAmB,CAAC,IAAI,SAAS,eAAe,IAAI,CAC9D,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,iBAAiB,GAAG,MAAM,cAAc,CAAC;AACrD,MAAM,MAAM,qBAAqB,CAAC,IAAI,SAAS,iBAAiB,IAAI,CAClE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,KACxB,IAAI,CAAC;AAEV,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;AAC/C,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,cAAc,IAAI,CAC5D,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KACrB,IAAI,CAAC"}
|
|
@@ -10,6 +10,7 @@ export interface IBaseAudioContext {
|
|
|
10
10
|
createStereoPanner(): IStereoPannerNode;
|
|
11
11
|
createBiquadFilter: () => IBiquadFilterNode;
|
|
12
12
|
createBufferSource: (pitchCorrection: boolean) => IAudioBufferSourceNode;
|
|
13
|
+
createBufferQueueSource: () => IAudioBufferQueueSourceNode;
|
|
13
14
|
createBuffer: (channels: number, length: number, sampleRate: number) => IAudioBuffer;
|
|
14
15
|
createPeriodicWave: (real: Float32Array, imag: Float32Array, disableNormalization: boolean) => IPeriodicWave;
|
|
15
16
|
createAnalyser: () => IAnalyserNode;
|
|
@@ -72,6 +73,14 @@ export interface IAudioBufferSourceNode extends IAudioScheduledSourceNode {
|
|
|
72
73
|
playbackRate: IAudioParam;
|
|
73
74
|
start: (when?: number, offset?: number, duration?: number) => void;
|
|
74
75
|
}
|
|
76
|
+
export interface IAudioBufferQueueSourceNode extends IAudioScheduledSourceNode {
|
|
77
|
+
detune: IAudioParam;
|
|
78
|
+
playbackRate: IAudioParam;
|
|
79
|
+
enqueueBuffer: (audioBuffer: IAudioBuffer, bufferId: number, isLastBuffer: boolean) => void;
|
|
80
|
+
start: (when?: number, offset?: number) => void;
|
|
81
|
+
onPositionChanged: string;
|
|
82
|
+
onPositionChangedInterval: number;
|
|
83
|
+
}
|
|
75
84
|
export interface IAudioBuffer {
|
|
76
85
|
readonly length: number;
|
|
77
86
|
readonly duration: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.6.1-rc.
|
|
3
|
+
"version": "0.6.1-rc.3",
|
|
4
4
|
"description": "react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification",
|
|
5
5
|
"bin": {
|
|
6
6
|
"setup-rn-audio-api-web": "./scripts/setup-rn-audio-api-web.js"
|
package/src/api.ts
CHANGED
|
@@ -39,6 +39,7 @@ if (
|
|
|
39
39
|
|
|
40
40
|
export { default as AudioBuffer } from './core/AudioBuffer';
|
|
41
41
|
export { default as AudioBufferSourceNode } from './core/AudioBufferSourceNode';
|
|
42
|
+
export { default as AudioBufferQueueSourceNode } from './core/AudioBufferQueueSourceNode';
|
|
42
43
|
export { default as AudioContext } from './core/AudioContext';
|
|
43
44
|
export { default as OfflineAudioContext } from './core/OfflineAudioContext';
|
|
44
45
|
export { default as AudioDestinationNode } from './core/AudioDestinationNode';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { IAudioBufferQueueSourceNode } from '../interfaces';
|
|
2
|
+
import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
3
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
4
|
+
import AudioBuffer from './AudioBuffer';
|
|
5
|
+
import AudioParam from './AudioParam';
|
|
6
|
+
import { InvalidStateError, RangeError } from '../errors';
|
|
7
|
+
import { OnPositionChangedEventType } from '../events/types';
|
|
8
|
+
|
|
9
|
+
export default class AudioBufferQueueSourceNode extends AudioScheduledSourceNode {
|
|
10
|
+
readonly playbackRate: AudioParam;
|
|
11
|
+
readonly detune: AudioParam;
|
|
12
|
+
|
|
13
|
+
constructor(context: BaseAudioContext, node: IAudioBufferQueueSourceNode) {
|
|
14
|
+
super(context, node);
|
|
15
|
+
|
|
16
|
+
this.detune = new AudioParam(node.detune, context);
|
|
17
|
+
this.playbackRate = new AudioParam(node.playbackRate, context);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public enqueueBuffer(
|
|
21
|
+
buffer: AudioBuffer,
|
|
22
|
+
bufferId: number = 0,
|
|
23
|
+
isLastBuffer: boolean = false
|
|
24
|
+
): void {
|
|
25
|
+
(this.node as IAudioBufferQueueSourceNode).enqueueBuffer(
|
|
26
|
+
buffer.buffer,
|
|
27
|
+
bufferId,
|
|
28
|
+
isLastBuffer
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public start(when: number = 0, offset: number = 0): void {
|
|
33
|
+
if (when < 0) {
|
|
34
|
+
throw new RangeError(
|
|
35
|
+
`when must be a finite non-negative number: ${when}`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (offset < 0) {
|
|
40
|
+
throw new RangeError(
|
|
41
|
+
`offset must be a finite non-negative number: ${offset}`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (this.hasBeenStarted) {
|
|
46
|
+
throw new InvalidStateError('Cannot call start more than once');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.hasBeenStarted = true;
|
|
50
|
+
(this.node as IAudioBufferQueueSourceNode).start(when, offset);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// eslint-disable-next-line accessor-pairs
|
|
54
|
+
public set onPositionChanged(
|
|
55
|
+
callback: (event: OnPositionChangedEventType) => void
|
|
56
|
+
) {
|
|
57
|
+
const subscription = this.audioEventEmitter.addAudioEventListener(
|
|
58
|
+
'positionChanged',
|
|
59
|
+
callback
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
(this.node as IAudioBufferQueueSourceNode).onPositionChanged =
|
|
63
|
+
subscription.subscriptionId;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// eslint-disable-next-line accessor-pairs
|
|
67
|
+
public set onPositionChangedInterval(value: number) {
|
|
68
|
+
(this.node as IAudioBufferQueueSourceNode).onPositionChangedInterval =
|
|
69
|
+
value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { IAudioScheduledSourceNode } from '../interfaces';
|
|
2
2
|
import AudioNode from './AudioNode';
|
|
3
3
|
import { InvalidStateError, RangeError } from '../errors';
|
|
4
|
-
import {
|
|
4
|
+
import { OnEndedEventType } from '../events/types';
|
|
5
5
|
import { AudioEventEmitter } from '../events';
|
|
6
6
|
|
|
7
7
|
export default class AudioScheduledSourceNode extends AudioNode {
|
|
8
8
|
protected hasBeenStarted: boolean = false;
|
|
9
|
-
|
|
9
|
+
protected readonly audioEventEmitter = new AudioEventEmitter(
|
|
10
10
|
global.AudioEventEmitter
|
|
11
11
|
);
|
|
12
12
|
|
|
@@ -42,7 +42,7 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// eslint-disable-next-line accessor-pairs
|
|
45
|
-
public set onended(callback: (event:
|
|
45
|
+
public set onended(callback: (event: OnEndedEventType) => void) {
|
|
46
46
|
const subscription = this.audioEventEmitter.addAudioEventListener(
|
|
47
47
|
'ended',
|
|
48
48
|
callback
|
|
@@ -13,6 +13,7 @@ import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
|
13
13
|
import AudioBuffer from './AudioBuffer';
|
|
14
14
|
import PeriodicWave from './PeriodicWave';
|
|
15
15
|
import AnalyserNode from './AnalyserNode';
|
|
16
|
+
import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
16
17
|
import { InvalidAccessError, NotSupportedError } from '../errors';
|
|
17
18
|
|
|
18
19
|
export default class BaseAudioContext {
|
|
@@ -61,6 +62,13 @@ export default class BaseAudioContext {
|
|
|
61
62
|
);
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
createBufferQueueSource(): AudioBufferQueueSourceNode {
|
|
66
|
+
return new AudioBufferQueueSourceNode(
|
|
67
|
+
this,
|
|
68
|
+
this.context.createBufferQueueSource()
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
64
72
|
createBuffer(
|
|
65
73
|
numOfChannels: number,
|
|
66
74
|
length: number,
|
package/src/events/types.ts
CHANGED
|
@@ -6,9 +6,15 @@ export interface EventTypeWithValue {
|
|
|
6
6
|
value: number;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export interface
|
|
9
|
+
export interface OnEndedEventType {
|
|
10
10
|
value: number;
|
|
11
11
|
state: 'stopped' | 'ended';
|
|
12
|
+
bufferId: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface OnPositionChangedEventType {
|
|
16
|
+
value: number;
|
|
17
|
+
bufferId: number;
|
|
12
18
|
}
|
|
13
19
|
|
|
14
20
|
interface OnInterruptionEventType {
|
|
@@ -45,8 +51,9 @@ export interface OnAudioReadyEventType {
|
|
|
45
51
|
}
|
|
46
52
|
|
|
47
53
|
interface AudioAPIEvents {
|
|
48
|
-
ended:
|
|
54
|
+
ended: OnEndedEventType;
|
|
49
55
|
audioReady: OnAudioReadyEventType;
|
|
56
|
+
positionChanged: OnPositionChangedEventType;
|
|
50
57
|
audioError: EventEmptyType; // to change
|
|
51
58
|
systemStateChanged: EventEmptyType; // to change
|
|
52
59
|
}
|
package/src/interfaces.ts
CHANGED
|
@@ -19,6 +19,7 @@ export interface IBaseAudioContext {
|
|
|
19
19
|
createStereoPanner(): IStereoPannerNode;
|
|
20
20
|
createBiquadFilter: () => IBiquadFilterNode;
|
|
21
21
|
createBufferSource: (pitchCorrection: boolean) => IAudioBufferSourceNode;
|
|
22
|
+
createBufferQueueSource: () => IAudioBufferQueueSourceNode;
|
|
22
23
|
createBuffer: (
|
|
23
24
|
channels: number,
|
|
24
25
|
length: number,
|
|
@@ -109,6 +110,23 @@ export interface IAudioBufferSourceNode extends IAudioScheduledSourceNode {
|
|
|
109
110
|
start: (when?: number, offset?: number, duration?: number) => void;
|
|
110
111
|
}
|
|
111
112
|
|
|
113
|
+
export interface IAudioBufferQueueSourceNode extends IAudioScheduledSourceNode {
|
|
114
|
+
detune: IAudioParam;
|
|
115
|
+
playbackRate: IAudioParam;
|
|
116
|
+
|
|
117
|
+
enqueueBuffer: (
|
|
118
|
+
audioBuffer: IAudioBuffer,
|
|
119
|
+
bufferId: number,
|
|
120
|
+
isLastBuffer: boolean
|
|
121
|
+
) => void;
|
|
122
|
+
start: (when?: number, offset?: number) => void;
|
|
123
|
+
|
|
124
|
+
// passing subscriptionId(uint_64 in cpp, string in js) to the cpp
|
|
125
|
+
onPositionChanged: string;
|
|
126
|
+
// set how often the onPositionChanged event is called
|
|
127
|
+
onPositionChangedInterval: number;
|
|
128
|
+
}
|
|
129
|
+
|
|
112
130
|
export interface IAudioBuffer {
|
|
113
131
|
readonly length: number;
|
|
114
132
|
readonly duration: number;
|