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.
@@ -47,7 +47,8 @@ std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
47
47
  }
48
48
 
49
49
  void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
50
- if (onPositionChangedTime_ > onPositionChangedInterval_) {
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
 
@@ -70,7 +70,6 @@ void AudioBufferQueueSourceNode::processNode(
70
70
  processWithPitchCorrection(processingBus, framesToProcess);
71
71
 
72
72
  handleStopScheduled();
73
- sendOnPositionChangedEvent();
74
73
  } else {
75
74
  processingBus->zero();
76
75
  }
@@ -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 (isUnscheduled() || isFinished()) {
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 = 0;
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
- const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
20
- this.node.onPositionChanged = subscription.subscriptionId;
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","subscription","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;AAGvB,MAAMG,yBAAyB,SAASC,iCAAwB,CAAC;EAI9EC,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,CAACC,QAA6C,EAAE;IAC1E,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAACC,qBAAqB,CAC/D,iBAAiB,EACjBH,QACF,CAAC;IAEA,IAAI,CAACL,IAAI,CAAgCI,iBAAiB,GACzDE,YAAY,CAACG,cAAc;EAC/B;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACX,IAAI,CAAgCU,yBAAyB,GAAGC,KAAK;EAC7E;AACF;AAACC,OAAA,CAAAjB,OAAA,GAAAC,yBAAA","ignoreList":[]}
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
- const subscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
37
- this.node.onended = subscription.subscriptionId;
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","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,QAAyC,EAAE;IAC5D,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":[]}
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
- const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
15
- this.node.onPositionChanged = subscription.subscriptionId;
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","subscription","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;AACA,OAAOA,wBAAwB,MAAM,+BAA4B;AAEjE,OAAOC,UAAU,MAAM,iBAAc;AAGrC,eAAe,MAAMC,yBAAyB,SAASF,wBAAwB,CAAC;EAI9EG,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,CAACC,QAA6C,EAAE;IAC1E,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAACC,qBAAqB,CAC/D,iBAAiB,EACjBH,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAAgCG,iBAAiB,GACzDE,YAAY,CAACG,cAAc;EAC/B;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACV,IAAI,CAAgCS,yBAAyB,GAAGC,KAAK;EAC7E;AACF","ignoreList":[]}
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
- const subscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
32
- this.node.onended = subscription.subscriptionId;
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","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,QAAyC,EAAE;IAC5D,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":[]}
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;AAErD,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,wBAAwB;IAC7E,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,0BAA0B;IAQvE,IAAW,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,EAQzE;IAGD,IAAW,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAEjD;CACF"}
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,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,cAAc,KAAK,IAAI,EAQ3D;CACF"}
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.2",
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(callback: (event: EventTypeWithValue) => void) {
20
- const subscription = this.audioEventEmitter.addAudioEventListener(
21
- 'positionChanged',
22
- callback
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
- subscription.subscriptionId;
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
- const subscription = this.audioEventEmitter.addAudioEventListener(
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
- subscription.subscriptionId;
59
+ this.onendedSubscription.subscriptionId;
53
60
  }
54
61
  }