react-native-audio-api 0.6.5-rc.0 → 0.6.5-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.
Files changed (27) hide show
  1. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +4 -2
  2. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +1 -1
  3. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +8 -1
  4. package/common/cpp/audioapi/core/AudioParam.cpp +4 -5
  5. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +4 -2
  6. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +15 -1
  7. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +6 -4
  8. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +13 -2
  9. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -0
  10. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +78 -28
  11. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +3 -0
  12. package/ios/audioapi/ios/AudioAPIModule.mm +11 -12
  13. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +10 -6
  14. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  15. package/lib/commonjs/core/AudioScheduledSourceNode.js +6 -2
  16. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  17. package/lib/module/core/AudioBufferBaseSourceNode.js +10 -6
  18. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  19. package/lib/module/core/AudioScheduledSourceNode.js +6 -2
  20. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  21. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +6 -3
  22. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  23. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +2 -0
  24. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  25. package/package.json +1 -1
  26. package/src/core/AudioBufferBaseSourceNode.ts +20 -7
  27. package/src/core/AudioScheduledSourceNode.ts +9 -1
@@ -68,7 +68,9 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
68
68
  }
69
69
  }
70
70
 
71
- audioEventHandlerRegistry_->invokeHandlerWithEventBody(
72
- eventName->toStdString(), body);
71
+ if (audioEventHandlerRegistry_ != nullptr) {
72
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody(
73
+ eventName->toStdString(), body);
74
+ }
73
75
  }
74
76
  } // namespace audioapi
@@ -60,7 +60,7 @@ class AudioAPIModule(
60
60
  enabled: Boolean,
61
61
  promise: Promise?,
62
62
  ) {
63
- // noting to do here
63
+ promise?.resolve(true)
64
64
  }
65
65
 
66
66
  override fun setAudioSessionOptions(
@@ -18,7 +18,8 @@ class AudioBufferBaseSourceNodeHostObject
18
18
  : AudioScheduledSourceNodeHostObject(node) {
19
19
  addGetters(
20
20
  JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, detune),
21
- JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate));
21
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate),
22
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));
22
23
 
23
24
  addSetters(
24
25
  JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChanged),
@@ -49,6 +50,12 @@ class AudioBufferBaseSourceNodeHostObject
49
50
  sourceNode->setOnPositionChangedCallbackId(std::stoull(value.getString(runtime).utf8(runtime)));
50
51
  }
51
52
 
53
+ JSI_PROPERTY_GETTER(onPositionChangedInterval) {
54
+ auto sourceNode =
55
+ std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
56
+ return jsi::Value(sourceNode->getOnPositionChangedInterval());
57
+ }
58
+
52
59
  JSI_PROPERTY_SETTER(onPositionChangedInterval) {
53
60
  auto sourceNode =
54
61
  std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);
@@ -17,11 +17,10 @@ AudioParam::AudioParam(
17
17
  minValue_(minValue),
18
18
  maxValue_(maxValue),
19
19
  context_(context),
20
- audioBus_(
21
- std::make_shared<AudioBus>(
22
- RENDER_QUANTUM_SIZE,
23
- 1,
24
- context->getSampleRate())) {
20
+ audioBus_(std::make_shared<AudioBus>(
21
+ RENDER_QUANTUM_SIZE,
22
+ 1,
23
+ context->getSampleRate())) {
25
24
  startTime_ = 0;
26
25
  endTime_ = 0;
27
26
  startValue_ = value_;
@@ -36,8 +36,10 @@ void AudioRecorder::invokeOnAudioReadyCallback(
36
36
  body.insert({"numFrames", numFrames});
37
37
  body.insert({"when", when});
38
38
 
39
- audioEventHandlerRegistry_->invokeHandlerWithEventBody(
40
- "audioReady", onAudioReadyCallbackId_, body);
39
+ if (audioEventHandlerRegistry_ != nullptr) {
40
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody(
41
+ "audioReady", onAudioReadyCallbackId_, body);
42
+ }
41
43
  }
42
44
 
43
45
  void AudioRecorder::sendRemainingData() {
@@ -23,6 +23,15 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(BaseAudioContext *context)
23
23
  std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
24
24
  }
25
25
 
26
+ AudioBufferBaseSourceNode::~AudioBufferBaseSourceNode() {
27
+ if (onPositionChangedCallbackId_ != 0 &&
28
+ context_->audioEventHandlerRegistry_ != nullptr) {
29
+ context_->audioEventHandlerRegistry_->unregisterHandler(
30
+ "positionChanged", onPositionChangedCallbackId_);
31
+ onPositionChangedCallbackId_ = 0;
32
+ }
33
+ }
34
+
26
35
  std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {
27
36
  return detuneParam_;
28
37
  }
@@ -42,13 +51,18 @@ void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
42
51
  context_->getSampleRate() * static_cast<float>(interval) / 1000);
43
52
  }
44
53
 
54
+ int AudioBufferBaseSourceNode::getOnPositionChangedInterval() {
55
+ return onPositionChangedInterval_;
56
+ }
57
+
45
58
  std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
46
59
  return bufferLock_;
47
60
  }
48
61
 
49
62
  void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
50
63
  if (onPositionChangedCallbackId_ != 0 &&
51
- onPositionChangedTime_ > onPositionChangedInterval_) {
64
+ onPositionChangedTime_ > onPositionChangedInterval_ &&
65
+ context_->audioEventHandlerRegistry_ != nullptr) {
52
66
  std::unordered_map<std::string, EventValue> body = {
53
67
  {"value", getCurrentPosition()}};
54
68
 
@@ -13,12 +13,14 @@ class AudioParam;
13
13
  class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
14
14
  public:
15
15
  explicit AudioBufferBaseSourceNode(BaseAudioContext *context);
16
+ virtual ~AudioBufferBaseSourceNode();
16
17
 
17
- [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
18
- [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
18
+ [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
19
+ [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
19
20
 
20
- void setOnPositionChangedCallbackId(uint64_t callbackId);
21
- void setOnPositionChangedInterval(int interval);
21
+ void setOnPositionChangedCallbackId(uint64_t callbackId);
22
+ void setOnPositionChangedInterval(int interval);
23
+ [[nodiscard]] int getOnPositionChangedInterval();
22
24
 
23
25
  protected:
24
26
  std::mutex bufferLock_;
@@ -16,6 +16,15 @@ AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
16
16
  numberOfInputs_ = 0;
17
17
  }
18
18
 
19
+ AudioScheduledSourceNode::~AudioScheduledSourceNode() {
20
+ if (onEndedCallbackId_ != 0 &&
21
+ context_->audioEventHandlerRegistry_ != nullptr) {
22
+ context_->audioEventHandlerRegistry_->unregisterHandler(
23
+ "ended", onEndedCallbackId_);
24
+ onEndedCallbackId_ = 0;
25
+ }
26
+ }
27
+
19
28
  void AudioScheduledSourceNode::start(double when) {
20
29
  playbackState_ = PlaybackState::SCHEDULED;
21
30
  startTime_ = when;
@@ -149,8 +158,10 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
149
158
  void AudioScheduledSourceNode::disable() {
150
159
  AudioNode::disable();
151
160
 
152
- context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
153
- "ended", onEndedCallbackId_, {});
161
+ if (context_->audioEventHandlerRegistry_ != nullptr) {
162
+ context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
163
+ "ended", onEndedCallbackId_, {});
164
+ }
154
165
  }
155
166
 
156
167
  void AudioScheduledSourceNode::handleStopScheduled() {
@@ -27,6 +27,7 @@ class AudioScheduledSourceNode : public AudioNode {
27
27
  // FINISHED: The node has finished playing.
28
28
  enum class PlaybackState { UNSCHEDULED, SCHEDULED, PLAYING, STOP_SCHEDULED, FINISHED };
29
29
  explicit AudioScheduledSourceNode(BaseAudioContext *context);
30
+ virtual ~AudioScheduledSourceNode();
30
31
 
31
32
  void start(double when);
32
33
  virtual void stop(double when);
@@ -24,57 +24,107 @@ 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 = 1;
27
+ uint64_t listenerId = listenerIdCounter_++;
28
28
 
29
- eventHandlers_[eventName][LISTENER_ID] = handler;
29
+ if (callInvoker_ == nullptr || runtime_ == nullptr) {
30
+ // If callInvoker or runtime is not valid, we cannot register the handler
31
+ return 0;
32
+ }
33
+
34
+ // Modify the eventHandlers_ map only on the main RN thread
35
+ callInvoker_->invokeAsync([this, eventName, listenerId, handler]() {
36
+ eventHandlers_[eventName][listenerId] = handler;
37
+ });
30
38
 
31
- return LISTENER_ID++;
39
+ return listenerId;
32
40
  }
33
41
 
34
42
  void AudioEventHandlerRegistry::unregisterHandler(
35
43
  const std::string &eventName,
36
44
  uint64_t listenerId) {
37
- auto it = eventHandlers_.find(eventName);
38
- if (it != eventHandlers_.end()) {
39
- it->second.erase(listenerId);
45
+ if (callInvoker_ == nullptr || runtime_ == nullptr) {
46
+ // If callInvoker or runtime is not valid, we cannot unregister the handler
47
+ return;
40
48
  }
49
+
50
+ callInvoker_->invokeAsync([this, eventName, listenerId]() {
51
+ auto it = eventHandlers_.find(eventName);
52
+
53
+ if (it == eventHandlers_.end()) {
54
+ return;
55
+ }
56
+
57
+ auto &handlersMap = it->second;
58
+ auto handlerIt = handlersMap.find(listenerId);
59
+
60
+ if (handlerIt != handlersMap.end()) {
61
+ handlersMap.erase(handlerIt);
62
+ }
63
+ });
41
64
  }
42
65
 
43
66
  void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
44
67
  const std::string &eventName,
45
68
  const std::unordered_map<std::string, EventValue> &body) {
46
- auto it = eventHandlers_.find(eventName);
47
- if (it != eventHandlers_.end()) {
48
- for (const auto &pair : it->second) {
69
+ // callInvoker_ and runtime_ must be valid to invoke handlers
70
+ // this might happen when react-native is reloaded or the app is closed
71
+ if (callInvoker_ == nullptr || runtime_ == nullptr) {
72
+ return;
73
+ }
74
+
75
+ // Do any logic regarding triggering the event on the main RN thread
76
+ callInvoker_->invokeAsync([this, eventName, body]() {
77
+ auto it = eventHandlers_.find(eventName);
78
+
79
+ if (it == eventHandlers_.end()) {
80
+ // If the event name is not registered, we can skip invoking handlers
81
+ return;
82
+ }
83
+
84
+ auto handlersMap = it->second;
85
+
86
+ for (const auto &pair : handlersMap) {
49
87
  auto handler = pair.second;
50
- if (handler) {
51
- callInvoker_->invokeAsync([this, handler, body]() {
52
- auto eventObject = createEventObject(body);
53
- handler->call(*runtime_, eventObject);
54
- });
88
+
89
+ if (!handler || !handler->isFunction(*runtime_)) {
90
+ // If the handler is not valid, we can skip it
91
+ continue;
55
92
  }
93
+
94
+ auto eventObject = createEventObject(body);
95
+ handler->call(*runtime_, eventObject);
56
96
  }
57
- }
97
+ });
58
98
  }
59
99
 
60
100
  void AudioEventHandlerRegistry::invokeHandlerWithEventBody(
61
101
  const std::string &eventName,
62
102
  uint64_t listenerId,
63
103
  const std::unordered_map<std::string, EventValue> &body) {
64
- auto it = eventHandlers_.find(eventName);
65
- if (it != eventHandlers_.end()) {
66
- auto handlersMap = it->second;
67
- auto handlerIt = handlersMap.find(listenerId);
68
- if (handlerIt != handlersMap.end()) {
69
- auto handler = handlerIt->second;
70
- if (handler) {
71
- callInvoker_->invokeAsync([this, handler, body]() {
72
- auto eventObject = createEventObject(body);
73
- handler->call(*runtime_, eventObject);
74
- });
75
- }
76
- }
104
+ // callInvoker_ and runtime_ must be valid to invoke handlers
105
+ // this might happen when react-native is reloaded or the app is closed
106
+ if (callInvoker_ == nullptr || runtime_ == nullptr) {
107
+ return;
77
108
  }
109
+
110
+ callInvoker_->invokeAsync([this, eventName, listenerId, body]() {
111
+ auto it = eventHandlers_.find(eventName);
112
+
113
+ if (it == eventHandlers_.end()) {
114
+ // If the event name is not registered, we can skip invoking handlers
115
+ return;
116
+ }
117
+
118
+ auto handlerIt = it->second.find(listenerId);
119
+
120
+ if (handlerIt == it->second.end()) {
121
+ // If the listener ID is not registered, we can skip invoking handlers
122
+ return;
123
+ }
124
+
125
+ auto eventObject = createEventObject(body);
126
+ handlerIt->second->call(*runtime_, eventObject);
127
+ });
78
128
  }
79
129
 
80
130
  jsi::Object AudioEventHandlerRegistry::createEventObject(
@@ -7,6 +7,7 @@
7
7
  #include <array>
8
8
  #include <string>
9
9
  #include <variant>
10
+ #include <atomic>
10
11
 
11
12
  namespace audioapi {
12
13
  using namespace facebook;
@@ -27,6 +28,8 @@ class AudioEventHandlerRegistry {
27
28
  void invokeHandlerWithEventBody(const std::string &eventName, uint64_t listenerId, const std::unordered_map<std::string, EventValue> &body);
28
29
 
29
30
  private:
31
+ std::atomic<uint64_t> listenerIdCounter_{1}; // Atomic counter for listener IDs
32
+
30
33
  std::shared_ptr<react::CallInvoker> callInvoker_;
31
34
  jsi::Runtime *runtime_;
32
35
  std::unordered_map<std::string, std::unordered_map<uint64_t, std::shared_ptr<jsi::Function>>> eventHandlers_;
@@ -85,9 +85,8 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
85
85
  return [self.audioSessionManager getDevicePreferredSampleRate];
86
86
  }
87
87
 
88
- RCT_EXPORT_METHOD(
89
- setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
90
- reject)
88
+ RCT_EXPORT_METHOD(setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
89
+ resolve reject : (RCTPromiseRejectBlock)reject)
91
90
  {
92
91
  if ([self.audioSessionManager setActive:enabled]) {
93
92
  resolve(@"true");
@@ -97,9 +96,8 @@ RCT_EXPORT_METHOD(
97
96
  resolve(@"false");
98
97
  }
99
98
 
100
- RCT_EXPORT_METHOD(
101
- setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
102
- options allowHaptics : (BOOL)allowHaptics)
99
+ RCT_EXPORT_METHOD(setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
100
+ options allowHaptics : (BOOL)allowHaptics)
103
101
  {
104
102
  [self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
105
103
  }
@@ -129,15 +127,14 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
129
127
  [self.notificationManager observeVolumeChanges:(BOOL)enabled];
130
128
  }
131
129
 
132
- RCT_EXPORT_METHOD(
133
- requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
134
- reject)
130
+ RCT_EXPORT_METHOD(requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
131
+ resolve reject : (nonnull RCTPromiseRejectBlock)reject)
135
132
  {
136
133
  [self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
137
134
  }
138
135
 
139
- RCT_EXPORT_METHOD(
140
- checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
136
+ RCT_EXPORT_METHOD(checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
137
+ resolve reject : (nonnull RCTPromiseRejectBlock)reject)
141
138
  {
142
139
  [self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
143
140
  }
@@ -177,7 +174,9 @@ RCT_EXPORT_METHOD(
177
174
  }
178
175
  }
179
176
 
180
- _eventHandler->invokeHandlerWithEventBody(name, body);
177
+ if (_eventHandler != nullptr) {
178
+ _eventHandler->invokeHandlerWithEventBody(name, body);
179
+ }
181
180
  }
182
181
 
183
182
  @end
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
8
7
  var _AudioParam = _interopRequireDefault(require("./AudioParam"));
8
+ var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
11
11
  constructor(context, node) {
@@ -13,20 +13,24 @@ class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
13
13
  this.detune = new _AudioParam.default(node.detune, context);
14
14
  this.playbackRate = new _AudioParam.default(node.playbackRate, context);
15
15
  }
16
-
17
- // eslint-disable-next-line accessor-pairs
16
+ get onPositionChanged() {
17
+ return this.positionChangedCallback;
18
+ }
18
19
  set onPositionChanged(callback) {
19
20
  if (!callback) {
21
+ this.node.onPositionChanged = '0';
20
22
  this.positionChangedSubscription?.remove();
21
23
  this.positionChangedSubscription = undefined;
22
- this.node.onPositionChanged = '0';
24
+ this.positionChangedCallback = undefined;
23
25
  return;
24
26
  }
27
+ this.positionChangedCallback = callback;
25
28
  this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
26
29
  this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
27
30
  }
28
-
29
- // eslint-disable-next-line accessor-pairs
31
+ get onPositionChangedInterval() {
32
+ return this.node.onPositionChangedInterval;
33
+ }
30
34
  set onPositionChangedInterval(value) {
31
35
  this.node.onPositionChangedInterval = value;
32
36
  }
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"names":["_AudioParam","_interopRequireDefault","require","_AudioScheduledSourceNode","e","__esModule","default","AudioBufferBaseSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","onPositionChanged","positionChangedCallback","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAKA,IAAAC,yBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAkE,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEnD,MAAMG,yBAAyB,SAASC,iCAAwB,CAAC;EAM9EC,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,IAAWK,iBAAiBA,CAAA,EAEd;IACZ,OAAO,IAAI,CAACC,uBAAuB;EACrC;EAEA,IAAWD,iBAAiBA,CAC1BE,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACN,IAAI,CAAgCI,iBAAiB,GAAG,GAAG;MACjE,IAAI,CAACG,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC5C,IAAI,CAACJ,uBAAuB,GAAGI,SAAS;MAExC;IACF;IAEA,IAAI,CAACJ,uBAAuB,GAAGC,QAAQ;IACvC,IAAI,CAACC,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACN,IAAI,CAAgCI,iBAAiB,GACzD,IAAI,CAACG,2BAA2B,CAACK,cAAc;EACnD;EAEA,IAAWC,yBAAyBA,CAAA,EAAW;IAC7C,OAAQ,IAAI,CAACb,IAAI,CAAgCa,yBAAyB;EAC5E;EAEA,IAAWA,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACd,IAAI,CAAgCa,yBAAyB,GAAGC,KAAK;EAC7E;AACF;AAACC,OAAA,CAAApB,OAAA,GAAAC,yBAAA","ignoreList":[]}
@@ -30,14 +30,18 @@ class AudioScheduledSourceNode extends _AudioNode.default {
30
30
  }
31
31
  this.node.stop(when);
32
32
  }
33
-
34
- // eslint-disable-next-line accessor-pairs
33
+ get onended() {
34
+ return this.onEndedCallback;
35
+ }
35
36
  set onended(callback) {
36
37
  if (!callback) {
38
+ this.node.onended = '0';
37
39
  this.onendedSubscription?.remove();
38
40
  this.onendedSubscription = undefined;
41
+ this.onEndedCallback = undefined;
39
42
  return;
40
43
  }
44
+ this.onEndedCallback = callback;
41
45
  this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
42
46
  this.node.onended = this.onendedSubscription.subscriptionId;
43
47
  }
@@ -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","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":[]}
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","onEndedCallback","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;EAKME,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,IAAWK,OAAOA,CAAA,EAAkD;IAClE,OAAO,IAAI,CAACC,eAAe;EAC7B;EAEA,IAAWD,OAAOA,CAACE,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAAG,GAAG;MACtD,IAAI,CAACG,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC,IAAI,CAACJ,eAAe,GAAGI,SAAS;MAChC;IACF;IAEA,IAAI,CAACJ,eAAe,GAAGC,QAAQ;IAC/B,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACZ,iBAAiB,CAACe,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACG,mBAAmB,CAACI,cAAc;EAC3C;AACF;AAACC,OAAA,CAAArB,OAAA,GAAAC,wBAAA","ignoreList":[]}
@@ -1,27 +1,31 @@
1
1
  "use strict";
2
2
 
3
- import AudioScheduledSourceNode from "./AudioScheduledSourceNode.js";
4
3
  import AudioParam from "./AudioParam.js";
4
+ import AudioScheduledSourceNode from "./AudioScheduledSourceNode.js";
5
5
  export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
6
6
  constructor(context, node) {
7
7
  super(context, node);
8
8
  this.detune = new AudioParam(node.detune, context);
9
9
  this.playbackRate = new AudioParam(node.playbackRate, context);
10
10
  }
11
-
12
- // eslint-disable-next-line accessor-pairs
11
+ get onPositionChanged() {
12
+ return this.positionChangedCallback;
13
+ }
13
14
  set onPositionChanged(callback) {
14
15
  if (!callback) {
16
+ this.node.onPositionChanged = '0';
15
17
  this.positionChangedSubscription?.remove();
16
18
  this.positionChangedSubscription = undefined;
17
- this.node.onPositionChanged = '0';
19
+ this.positionChangedCallback = undefined;
18
20
  return;
19
21
  }
22
+ this.positionChangedCallback = callback;
20
23
  this.positionChangedSubscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
21
24
  this.node.onPositionChanged = this.positionChangedSubscription.subscriptionId;
22
25
  }
23
-
24
- // eslint-disable-next-line accessor-pairs
26
+ get onPositionChangedInterval() {
27
+ return this.node.onPositionChangedInterval;
28
+ }
25
29
  set onPositionChangedInterval(value) {
26
30
  this.node.onPositionChangedInterval = value;
27
31
  }
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"names":["AudioParam","AudioScheduledSourceNode","AudioBufferBaseSourceNode","constructor","context","node","detune","playbackRate","onPositionChanged","positionChangedCallback","callback","positionChangedSubscription","remove","undefined","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value"],"sourceRoot":"../../../src","sources":["core/AudioBufferBaseSourceNode.ts"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AAKrC,OAAOC,wBAAwB,MAAM,+BAA4B;AAEjE,eAAe,MAAMC,yBAAyB,SAASD,wBAAwB,CAAC;EAM9EE,WAAWA,CAACC,OAAyB,EAAEC,IAAgC,EAAE;IACvE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIN,UAAU,CAACK,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACG,YAAY,GAAG,IAAIP,UAAU,CAACK,IAAI,CAACE,YAAY,EAAEH,OAAO,CAAC;EAChE;EAEA,IAAWI,iBAAiBA,CAAA,EAEd;IACZ,OAAO,IAAI,CAACC,uBAAuB;EACrC;EAEA,IAAWD,iBAAiBA,CAC1BE,QAAsD,EACtD;IACA,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACL,IAAI,CAAgCG,iBAAiB,GAAG,GAAG;MACjE,IAAI,CAACG,2BAA2B,EAAEC,MAAM,CAAC,CAAC;MAC1C,IAAI,CAACD,2BAA2B,GAAGE,SAAS;MAC5C,IAAI,CAACJ,uBAAuB,GAAGI,SAAS;MAExC;IACF;IAEA,IAAI,CAACJ,uBAAuB,GAAGC,QAAQ;IACvC,IAAI,CAACC,2BAA2B,GAC9B,IAAI,CAACG,iBAAiB,CAACC,qBAAqB,CAAC,iBAAiB,EAAEL,QAAQ,CAAC;IAE1E,IAAI,CAACL,IAAI,CAAgCG,iBAAiB,GACzD,IAAI,CAACG,2BAA2B,CAACK,cAAc;EACnD;EAEA,IAAWC,yBAAyBA,CAAA,EAAW;IAC7C,OAAQ,IAAI,CAACZ,IAAI,CAAgCY,yBAAyB;EAC5E;EAEA,IAAWA,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACb,IAAI,CAAgCY,yBAAyB,GAAGC,KAAK;EAC7E;AACF","ignoreList":[]}
@@ -25,14 +25,18 @@ export default class AudioScheduledSourceNode extends AudioNode {
25
25
  }
26
26
  this.node.stop(when);
27
27
  }
28
-
29
- // eslint-disable-next-line accessor-pairs
28
+ get onended() {
29
+ return this.onEndedCallback;
30
+ }
30
31
  set onended(callback) {
31
32
  if (!callback) {
33
+ this.node.onended = '0';
32
34
  this.onendedSubscription?.remove();
33
35
  this.onendedSubscription = undefined;
36
+ this.onEndedCallback = undefined;
34
37
  return;
35
38
  }
39
+ this.onEndedCallback = callback;
36
40
  this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
37
41
  this.node.onended = this.onendedSubscription.subscriptionId;
38
42
  }
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"names":["AudioNode","InvalidStateError","RangeError","AudioEventEmitter","AudioScheduledSourceNode","hasBeenStarted","audioEventEmitter","global","start","when","node","stop","onended","onEndedCallback","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;EAKMK,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,IAAWG,OAAOA,CAAA,EAAkD;IAClE,OAAO,IAAI,CAACC,eAAe;EAC7B;EAEA,IAAWD,OAAOA,CAACE,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAAG,GAAG;MACtD,IAAI,CAACG,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC,IAAI,CAACJ,eAAe,GAAGI,SAAS;MAChC;IACF;IAEA,IAAI,CAACJ,eAAe,GAAGC,QAAQ;IAC/B,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACT,iBAAiB,CAACY,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACG,mBAAmB,CAACI,cAAc;EAC3C;AACF","ignoreList":[]}
@@ -1,14 +1,17 @@
1
- import { IAudioBufferBaseSourceNode } from '../interfaces';
2
- import AudioScheduledSourceNode from './AudioScheduledSourceNode';
3
- import BaseAudioContext from './BaseAudioContext';
4
1
  import AudioParam from './AudioParam';
2
+ import BaseAudioContext from './BaseAudioContext';
5
3
  import { EventTypeWithValue } from '../events/types';
4
+ import { IAudioBufferBaseSourceNode } from '../interfaces';
5
+ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
6
6
  export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
7
7
  readonly playbackRate: AudioParam;
8
8
  readonly detune: AudioParam;
9
9
  private positionChangedSubscription?;
10
+ private positionChangedCallback?;
10
11
  constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode);
12
+ get onPositionChanged(): ((event: EventTypeWithValue) => void) | undefined;
11
13
  set onPositionChanged(callback: ((event: EventTypeWithValue) => void) | null);
14
+ get onPositionChangedInterval(): number;
12
15
  set onPositionChangedInterval(value: number);
13
16
  }
14
17
  //# 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;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"}
1
+ {"version":3,"file":"AudioBufferBaseSourceNode.d.ts","sourceRoot":"","sources":["../../../src/core/AudioBufferBaseSourceNode.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,wBAAwB,MAAM,4BAA4B,CAAC;AAElE,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;IAC7D,OAAO,CAAC,uBAAuB,CAAC,CAAsC;gBAE1D,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,0BAA0B;IAOvE,IAAW,iBAAiB,IACxB,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC,GACrC,SAAS,CAEZ;IAED,IAAW,iBAAiB,CAC1B,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,IAAI,EAiBvD;IAED,IAAW,yBAAyB,IAAI,MAAM,CAE7C;IAED,IAAW,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAEjD;CACF"}
@@ -5,8 +5,10 @@ export default class AudioScheduledSourceNode extends AudioNode {
5
5
  protected hasBeenStarted: boolean;
6
6
  protected readonly audioEventEmitter: AudioEventEmitter;
7
7
  private onendedSubscription?;
8
+ private onEndedCallback?;
8
9
  start(when?: number): void;
9
10
  stop(when?: number): void;
11
+ get onended(): ((event: EventEmptyType) => void) | undefined;
10
12
  set onended(callback: ((event: EventEmptyType) => void) | null);
11
13
  }
12
14
  //# 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,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"}
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;IACrD,OAAO,CAAC,eAAe,CAAC,CAAkC;IAEnD,KAAK,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAe7B,IAAI,CAAC,IAAI,GAAE,MAAU,GAAG,IAAI;IAgBnC,IAAW,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAElE;IAED,IAAW,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,IAAI,EAiBpE;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-audio-api",
3
- "version": "0.6.5-rc.0",
3
+ "version": "0.6.5-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"
@@ -1,14 +1,15 @@
1
- import { IAudioBufferBaseSourceNode } from '../interfaces';
2
- import AudioScheduledSourceNode from './AudioScheduledSourceNode';
3
- import BaseAudioContext from './BaseAudioContext';
4
1
  import AudioParam from './AudioParam';
5
- import { EventTypeWithValue } from '../events/types';
2
+ import BaseAudioContext from './BaseAudioContext';
6
3
  import { AudioEventSubscription } from '../events';
4
+ import { EventTypeWithValue } from '../events/types';
5
+ import { IAudioBufferBaseSourceNode } from '../interfaces';
6
+ import AudioScheduledSourceNode from './AudioScheduledSourceNode';
7
7
 
8
8
  export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {
9
9
  readonly playbackRate: AudioParam;
10
10
  readonly detune: AudioParam;
11
11
  private positionChangedSubscription?: AudioEventSubscription;
12
+ private positionChangedCallback?: (event: EventTypeWithValue) => void;
12
13
 
13
14
  constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode) {
14
15
  super(context, node);
@@ -17,16 +18,25 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
17
18
  this.playbackRate = new AudioParam(node.playbackRate, context);
18
19
  }
19
20
 
20
- // eslint-disable-next-line accessor-pairs
21
+ public get onPositionChanged():
22
+ | ((event: EventTypeWithValue) => void)
23
+ | undefined {
24
+ return this.positionChangedCallback;
25
+ }
26
+
21
27
  public set onPositionChanged(
22
28
  callback: ((event: EventTypeWithValue) => void) | null
23
29
  ) {
24
30
  if (!callback) {
31
+ (this.node as IAudioBufferBaseSourceNode).onPositionChanged = '0';
25
32
  this.positionChangedSubscription?.remove();
26
33
  this.positionChangedSubscription = undefined;
27
- (this.node as IAudioBufferBaseSourceNode).onPositionChanged = '0';
34
+ this.positionChangedCallback = undefined;
35
+
28
36
  return;
29
37
  }
38
+
39
+ this.positionChangedCallback = callback;
30
40
  this.positionChangedSubscription =
31
41
  this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
32
42
 
@@ -34,7 +44,10 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
34
44
  this.positionChangedSubscription.subscriptionId;
35
45
  }
36
46
 
37
- // eslint-disable-next-line accessor-pairs
47
+ public get onPositionChangedInterval(): number {
48
+ return (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval;
49
+ }
50
+
38
51
  public set onPositionChangedInterval(value: number) {
39
52
  (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval = value;
40
53
  }
@@ -11,6 +11,7 @@ export default class AudioScheduledSourceNode extends AudioNode {
11
11
  );
12
12
 
13
13
  private onendedSubscription?: AudioEventSubscription;
14
+ private onEndedCallback?: (event: EventEmptyType) => void;
14
15
 
15
16
  public start(when: number = 0): void {
16
17
  if (when < 0) {
@@ -43,13 +44,20 @@ export default class AudioScheduledSourceNode extends AudioNode {
43
44
  (this.node as IAudioScheduledSourceNode).stop(when);
44
45
  }
45
46
 
46
- // eslint-disable-next-line accessor-pairs
47
+ public get onended(): ((event: EventEmptyType) => void) | undefined {
48
+ return this.onEndedCallback;
49
+ }
50
+
47
51
  public set onended(callback: ((event: EventEmptyType) => void) | null) {
48
52
  if (!callback) {
53
+ (this.node as IAudioScheduledSourceNode).onended = '0';
49
54
  this.onendedSubscription?.remove();
50
55
  this.onendedSubscription = undefined;
56
+ this.onEndedCallback = undefined;
51
57
  return;
52
58
  }
59
+
60
+ this.onEndedCallback = callback;
53
61
  this.onendedSubscription = this.audioEventEmitter.addAudioEventListener(
54
62
  'ended',
55
63
  callback