react-native-audio-api 0.6.2 → 0.6.3-rc.1
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/core/sources/AudioBufferBaseSourceNode.cpp +3 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +0 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +2 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +7 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +8 -2
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioScheduledSourceNode.js +7 -2
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +8 -2
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +7 -2
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +2 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioBufferBaseSourceNode.ts +14 -6
- package/src/core/AudioScheduledSourceNode.ts +11 -4
|
@@ -47,7 +47,8 @@ std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
|
|
50
|
-
if (
|
|
50
|
+
if (onPositionChangedCallbackId_ != 0 &&
|
|
51
|
+
onPositionChangedTime_ > onPositionChangedInterval_) {
|
|
51
52
|
std::unordered_map<std::string, EventValue> body = {
|
|
52
53
|
{"value", getCurrentPosition()}};
|
|
53
54
|
|
|
@@ -99,6 +100,7 @@ void AudioBufferBaseSourceNode::processWithPitchCorrection(
|
|
|
99
100
|
if (detune != 0.0f) {
|
|
100
101
|
stretch_->setTransposeSemitones(detune);
|
|
101
102
|
}
|
|
103
|
+
sendOnPositionChangedEvent();
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
} // namespace audioapi
|
|
@@ -34,7 +34,7 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
|
34
34
|
// internal helper
|
|
35
35
|
double vReadIndex_;
|
|
36
36
|
|
|
37
|
-
uint64_t onPositionChangedCallbackId_ = 0;
|
|
37
|
+
uint64_t onPositionChangedCallbackId_ = 0; // 0 means no callback
|
|
38
38
|
int onPositionChangedInterval_;
|
|
39
39
|
int onPositionChangedTime_ = 0;
|
|
40
40
|
|
|
@@ -141,7 +141,6 @@ void AudioBufferSourceNode::processNode(
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
handleStopScheduled();
|
|
144
|
-
sendOnPositionChangedEvent();
|
|
145
144
|
} else {
|
|
146
145
|
processingBus->zero();
|
|
147
146
|
}
|
|
@@ -177,6 +176,8 @@ void AudioBufferSourceNode::processWithoutPitchCorrection(
|
|
|
177
176
|
processWithInterpolation(
|
|
178
177
|
processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
179
178
|
}
|
|
179
|
+
|
|
180
|
+
sendOnPositionChangedEvent();
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
void AudioBufferSourceNode::processWithoutInterpolation(
|
|
@@ -73,7 +73,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
73
73
|
? std::numeric_limits<size_t>::max()
|
|
74
74
|
: dsp::timeToSampleFrame(stopTime_, sampleRate);
|
|
75
75
|
|
|
76
|
-
if (
|
|
76
|
+
if (isFinished()) {
|
|
77
77
|
startOffset = 0;
|
|
78
78
|
nonSilentFramesToProcess = 0;
|
|
79
79
|
return;
|
|
@@ -135,6 +135,12 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
if (isUnscheduled()) {
|
|
139
|
+
startOffset = 0;
|
|
140
|
+
nonSilentFramesToProcess = 0;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
138
144
|
// normal "mid-buffer" playback
|
|
139
145
|
startOffset = 0;
|
|
140
146
|
nonSilentFramesToProcess = framesToProcess;
|
|
@@ -24,7 +24,7 @@ AudioEventHandlerRegistry::~AudioEventHandlerRegistry() {
|
|
|
24
24
|
uint64_t AudioEventHandlerRegistry::registerHandler(
|
|
25
25
|
const std::string &eventName,
|
|
26
26
|
const std::shared_ptr<jsi::Function> &handler) {
|
|
27
|
-
static uint64_t LISTENER_ID =
|
|
27
|
+
static uint64_t LISTENER_ID = 1;
|
|
28
28
|
|
|
29
29
|
eventHandlers_[eventName][LISTENER_ID] = handler;
|
|
30
30
|
|
|
@@ -16,8 +16,14 @@ class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
|
|
|
16
16
|
|
|
17
17
|
// eslint-disable-next-line accessor-pairs
|
|
18
18
|
set onPositionChanged(callback) {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
if (!callback) {
|
|
20
|
+
this.positionChangedSubscription?.remove();
|
|
21
|
+
this.positionChangedSubscription = undefined;
|
|
22
|
+
this.node.onPositionChanged = '0';
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
26
|
+
this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
// eslint-disable-next-line accessor-pairs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","_AudioParam","e","__esModule","default","AudioBufferBaseSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","onPositionChanged","callback","
|
|
1
|
+
{"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","_AudioParam","e","__esModule","default","AudioBufferBaseSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","onPositionChanged","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAIvB,MAAMG,yBAAyB,SAASC,iCAAwB,CAAC;EAK9EC,WAAWA,CAACC,OAAyB,EAAEC,IAAgC,EAAE;IACvE,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;;EAEA;EACA,IAAWK,iBAAiBA,CAC1BC,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACb,IAAI,CAACC,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC3C,IAAI,CAACR,IAAI,CAAgCI,iBAAiB,GAAG,GAAG;MACjE;IACF;IACA,IAAI,CAACE,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACL,IAAI,CAAgCI,iBAAiB,GACzD,IAAI,CAACE,2BAA2B,CAACK,cAAc;EACnD;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACb,IAAI,CAAgCY,yBAAyB,GAAGC,KAAK;EAC7E;AACF;AAACC,OAAA,CAAAnB,OAAA,GAAAC,yBAAA","ignoreList":[]}
|
|
@@ -33,8 +33,13 @@ class AudioScheduledSourceNode extends _AudioNode.default {
|
|
|
33
33
|
|
|
34
34
|
// eslint-disable-next-line accessor-pairs
|
|
35
35
|
set onended(callback) {
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
if (!callback) {
|
|
37
|
+
this.onendedSubscription?.remove();
|
|
38
|
+
this.onendedSubscription = undefined;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
|
|
42
|
+
this.node.onended = this.onendedSubscription.subscriptionId;
|
|
38
43
|
}
|
|
39
44
|
}
|
|
40
45
|
exports.default = AudioScheduledSourceNode;
|
|
@@ -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","
|
|
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","onendedSubscription","remove","undefined","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;AAAsE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIC,yBAAiB,CAC1DC,MAAM,CAACD,iBACT,CAAC;EAIME,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,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACb,IAAI,CAACC,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC;IACF;IACA,IAAI,CAACF,mBAAmB,GAAG,IAAI,CAACX,iBAAiB,CAACc,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACH,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACE,mBAAmB,CAACI,cAAc;EAC3C;AACF;AAACC,OAAA,CAAApB,OAAA,GAAAC,wBAAA","ignoreList":[]}
|
|
@@ -11,8 +11,14 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
|
|
|
11
11
|
|
|
12
12
|
// eslint-disable-next-line accessor-pairs
|
|
13
13
|
set onPositionChanged(callback) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
if (!callback) {
|
|
15
|
+
this.positionChangedSubscription?.remove();
|
|
16
|
+
this.positionChangedSubscription = undefined;
|
|
17
|
+
this.node.onPositionChanged = '0';
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
21
|
+
this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
|
|
16
22
|
}
|
|
17
23
|
|
|
18
24
|
// eslint-disable-next-line accessor-pairs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioScheduledSourceNode","AudioParam","AudioBufferBaseSourceNode","constructor","context","node","detune","playbackRate","onPositionChanged","callback","
|
|
1
|
+
{"version":3,"names":["AudioScheduledSourceNode","AudioParam","AudioBufferBaseSourceNode","constructor","context","node","detune","playbackRate","onPositionChanged","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;AACA,OAAOA,wBAAwB,MAAM,+BAA4B;AAEjE,OAAOC,UAAU,MAAM,iBAAc;AAIrC,eAAe,MAAMC,yBAAyB,SAASF,wBAAwB,CAAC;EAK9EG,WAAWA,CAACC,OAAyB,EAAEC,IAAgC,EAAE;IACvE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIL,UAAU,CAACI,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACG,YAAY,GAAG,IAAIN,UAAU,CAACI,IAAI,CAACE,YAAY,EAAEH,OAAO,CAAC;EAChE;;EAEA;EACA,IAAWI,iBAAiBA,CAC1BC,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACb,IAAI,CAACC,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC3C,IAAI,CAACP,IAAI,CAAgCG,iBAAiB,GAAG,GAAG;MACjE;IACF;IACA,IAAI,CAACE,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACJ,IAAI,CAAgCG,iBAAiB,GACzD,IAAI,CAACE,2BAA2B,CAACK,cAAc;EACnD;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACZ,IAAI,CAAgCW,yBAAyB,GAAGC,KAAK;EAC7E;AACF","ignoreList":[]}
|
|
@@ -28,8 +28,13 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
28
28
|
|
|
29
29
|
// eslint-disable-next-line accessor-pairs
|
|
30
30
|
set onended(callback) {
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
if (!callback) {
|
|
32
|
+
this.onendedSubscription?.remove();
|
|
33
|
+
this.onendedSubscription = undefined;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
|
|
37
|
+
this.node.onended = this.onendedSubscription.subscriptionId;
|
|
33
38
|
}
|
|
34
39
|
}
|
|
35
40
|
//# sourceMappingURL=AudioScheduledSourceNode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","callback","
|
|
1
|
+
{"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;AACA,OAAOA,SAAS,MAAM,gBAAa;AACnC,SAASC,iBAAiB,EAAEC,UAAU,QAAQ,oBAAW;AAEzD,SAASC,iBAAiB,QAAgC,oBAAW;AAErE,eAAe,MAAMC,wBAAwB,SAASJ,SAAS,CAAC;EACpDK,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIH,iBAAiB,CAC1DI,MAAM,CAACJ,iBACT,CAAC;EAIMK,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,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACb,IAAI,CAACC,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC;IACF;IACA,IAAI,CAACF,mBAAmB,GAAG,IAAI,CAACR,iBAAiB,CAACW,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACH,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACE,mBAAmB,CAACI,cAAc;EAC3C;AACF","ignoreList":[]}
|
|
@@ -6,8 +6,9 @@ import { EventTypeWithValue } from '../events/types';
|
|
|
6
6
|
export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
|
|
7
7
|
readonly playbackRate: AudioParam;
|
|
8
8
|
readonly detune: AudioParam;
|
|
9
|
+
private positionChangedSubscription?;
|
|
9
10
|
constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode);
|
|
10
|
-
set onPositionChanged(callback: (event: EventTypeWithValue) => void);
|
|
11
|
+
set onPositionChanged(callback: ((event: EventTypeWithValue) => void) | null);
|
|
11
12
|
set onPositionChangedInterval(value: number);
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=AudioBufferBaseSourceNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioBufferBaseSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferBaseSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"AudioBufferBaseSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferBaseSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAClE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,wBAAwB;IAC7E,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAyB;gBAEjD,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,0BAA0B;IAQvE,IAAW,iBAAiB,CAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,IAAI,EAavD;IAGD,IAAW,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAEjD;CACF"}
|
|
@@ -4,8 +4,9 @@ import { AudioEventEmitter } from '../events';
|
|
|
4
4
|
export default class AudioScheduledSourceNode extends AudioNode {
|
|
5
5
|
protected hasBeenStarted: boolean;
|
|
6
6
|
protected readonly audioEventEmitter: AudioEventEmitter;
|
|
7
|
+
private onendedSubscription?;
|
|
7
8
|
start(when?: number): void;
|
|
8
9
|
stop(when?: number): void;
|
|
9
|
-
set onended(callback: (event: EventEmptyType) => void);
|
|
10
|
+
set onended(callback: ((event: EventEmptyType) => void) | null);
|
|
10
11
|
}
|
|
11
12
|
//# 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,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AudioScheduledSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioScheduledSourceNode.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAA0B,MAAM,WAAW,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC7D,SAAS,CAAC,cAAc,EAAE,OAAO,CAAS;IAC1C,SAAS,CAAC,QAAQ,CAAC,iBAAiB,oBAElC;IAEF,OAAO,CAAC,mBAAmB,CAAC,CAAyB;IAE9C,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAiBnC,IAAW,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,IAAI,EAapE;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-audio-api",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3-rc.1",
|
|
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"
|
|
@@ -3,10 +3,12 @@ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
|
|
|
3
3
|
import BaseAudioContext from './BaseAudioContext';
|
|
4
4
|
import AudioParam from './AudioParam';
|
|
5
5
|
import { EventTypeWithValue } from '../events/types';
|
|
6
|
+
import { AudioEventSubscription } from '../events';
|
|
6
7
|
|
|
7
8
|
export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
|
|
8
9
|
readonly playbackRate: AudioParam;
|
|
9
10
|
readonly detune: AudioParam;
|
|
11
|
+
private positionChangedSubscription?: AudioEventSubscription;
|
|
10
12
|
|
|
11
13
|
constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode) {
|
|
12
14
|
super(context, node);
|
|
@@ -16,14 +18,20 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
|
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
// eslint-disable-next-line accessor-pairs
|
|
19
|
-
public set onPositionChanged(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
public set onPositionChanged(
|
|
22
|
+
callback: ((event: EventTypeWithValue) => void) | null
|
|
23
|
+
) {
|
|
24
|
+
if (!callback) {
|
|
25
|
+
this.positionChangedSubscription?.remove();
|
|
26
|
+
this.positionChangedSubscription = undefined;
|
|
27
|
+
(this.node as IAudioBufferBaseSourceNode).onPositionChanged = '0';
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.positionChangedSubscription =
|
|
31
|
+
this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
|
|
24
32
|
|
|
25
33
|
(this.node as IAudioBufferBaseSourceNode).onPositionChanged =
|
|
26
|
-
|
|
34
|
+
this.positionChangedSubscription.subscriptionId;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
// eslint-disable-next-line accessor-pairs
|
|
@@ -2,7 +2,7 @@ import { IAudioScheduledSourceNode } from '../interfaces';
|
|
|
2
2
|
import AudioNode from './AudioNode';
|
|
3
3
|
import { InvalidStateError, RangeError } from '../errors';
|
|
4
4
|
import { EventEmptyType } from '../events/types';
|
|
5
|
-
import { AudioEventEmitter } from '../events';
|
|
5
|
+
import { AudioEventEmitter, AudioEventSubscription } from '../events';
|
|
6
6
|
|
|
7
7
|
export default class AudioScheduledSourceNode extends AudioNode {
|
|
8
8
|
protected hasBeenStarted: boolean = false;
|
|
@@ -10,6 +10,8 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
10
10
|
global.AudioEventEmitter
|
|
11
11
|
);
|
|
12
12
|
|
|
13
|
+
private onendedSubscription?: AudioEventSubscription;
|
|
14
|
+
|
|
13
15
|
public start(when: number = 0): void {
|
|
14
16
|
if (when < 0) {
|
|
15
17
|
throw new RangeError(
|
|
@@ -42,13 +44,18 @@ export default class AudioScheduledSourceNode extends AudioNode {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
// eslint-disable-next-line accessor-pairs
|
|
45
|
-
public set onended(callback: (event: EventEmptyType) => void) {
|
|
46
|
-
|
|
47
|
+
public set onended(callback: ((event: EventEmptyType) => void) | null) {
|
|
48
|
+
if (!callback) {
|
|
49
|
+
this.onendedSubscription?.remove();
|
|
50
|
+
this.onendedSubscription = undefined;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener(
|
|
47
54
|
'ended',
|
|
48
55
|
callback
|
|
49
56
|
);
|
|
50
57
|
|
|
51
58
|
(this.node as IAudioScheduledSourceNode).onended =
|
|
52
|
-
|
|
59
|
+
this.onendedSubscription.subscriptionId;
|
|
53
60
|
}
|
|
54
61
|
}
|