react-native-audio-api 0.6.2 → 0.6.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.
@@ -12,7 +12,7 @@ import androidx.media.app.NotificationCompat.MediaStyle
12
12
  import com.facebook.react.bridge.ReactApplicationContext
13
13
  import com.facebook.react.bridge.ReadableMap
14
14
  import com.facebook.react.bridge.ReadableType
15
- import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper.Companion.instance
15
+ import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper.instance
16
16
  import com.swmansion.audioapi.R
17
17
  import java.io.IOException
18
18
  import java.lang.ref.WeakReference
@@ -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",
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"
@@ -91,18 +91,18 @@
91
91
  "@evilmartians/lefthook": "^1.5.0",
92
92
  "@expo/config-plugins": "^9.0.0",
93
93
  "@expo/config-types": "^53.0.4",
94
- "@react-native/babel-preset": "0.77.1",
95
- "@react-native/eslint-config": "^0.77.1",
96
- "@react-native/metro-config": "0.77.1",
97
- "@react-native/typescript-config": "0.77.1",
94
+ "@react-native/babel-preset": "0.80.0",
95
+ "@react-native/eslint-config": "0.80.0",
96
+ "@react-native/metro-config": "0.80.0",
97
+ "@react-native/typescript-config": "0.80.0",
98
98
  "@types/babel__core": "^7.20.0",
99
99
  "@types/babel__generator": "^7.6.4",
100
100
  "@types/babel__traverse": "^7.14.2",
101
101
  "@types/convert-source-map": "^2.0.0",
102
102
  "@types/jest": "^29.5.5",
103
103
  "@types/node": "^18.0.0",
104
- "@types/react": "^18.2.44",
105
- "@types/react-test-renderer": "^17.0.0-0",
104
+ "@types/react": "^19.1.0",
105
+ "@types/react-test-renderer": "^19.1.0",
106
106
  "babel-plugin-module-resolver": "^4.1.0",
107
107
  "commitlint": "^17.0.2",
108
108
  "del-cli": "^5.1.0",
@@ -122,8 +122,8 @@
122
122
  "eslint-plugin-tsdoc": "^0.2.17",
123
123
  "jest": "^29.7.0",
124
124
  "prettier": "^3.3.3",
125
- "react": "18.3.1",
126
- "react-native": "0.77.1",
125
+ "react": "19.1.0",
126
+ "react-native": "0.80.0",
127
127
  "react-native-builder-bob": "0.33.1",
128
128
  "turbo": "^1.10.7",
129
129
  "typescript": "~5.3.0"
@@ -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
  }