react-native-audio-api 0.6.2-rc.6 → 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.
Files changed (95) hide show
  1. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +25 -0
  2. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +13 -0
  3. package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +60 -0
  4. package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +5 -67
  5. package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +26 -56
  6. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +9 -0
  7. package/common/cpp/audioapi/HostObjects/CustomProcessorNodeHostObject.h +54 -0
  8. package/common/cpp/audioapi/core/BaseAudioContext.cpp +9 -0
  9. package/common/cpp/audioapi/core/BaseAudioContext.h +2 -0
  10. package/common/cpp/audioapi/core/effects/CustomProcessorNode.cpp +173 -0
  11. package/common/cpp/audioapi/core/effects/CustomProcessorNode.h +186 -0
  12. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +106 -0
  13. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +54 -0
  14. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +11 -129
  15. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +8 -37
  16. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +5 -93
  17. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +4 -30
  18. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +8 -12
  19. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +2 -3
  20. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +0 -5
  21. package/common/cpp/audioapi/core/sources/OscillatorNode.h +0 -1
  22. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +3 -1
  23. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +1 -1
  24. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
  25. package/ios/audioapi/ios/system/AudioEngine.h +1 -0
  26. package/ios/audioapi/ios/system/AudioEngine.mm +14 -3
  27. package/ios/audioapi/ios/system/AudioSessionManager.h +1 -0
  28. package/ios/audioapi/ios/system/AudioSessionManager.mm +10 -0
  29. package/ios/audioapi/ios/system/NotificationManager.mm +2 -4
  30. package/lib/commonjs/api.js +7 -0
  31. package/lib/commonjs/api.js.map +1 -1
  32. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +35 -0
  33. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -0
  34. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -22
  35. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  36. package/lib/commonjs/core/AudioBufferSourceNode.js +4 -21
  37. package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
  38. package/lib/commonjs/core/AudioScheduledSourceNode.js +7 -2
  39. package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
  40. package/lib/commonjs/core/BaseAudioContext.js +4 -0
  41. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  42. package/lib/commonjs/core/CustomProcessorNode.js +23 -0
  43. package/lib/commonjs/core/CustomProcessorNode.js.map +1 -0
  44. package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -4
  45. package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
  46. package/lib/module/api.js +1 -0
  47. package/lib/module/api.js.map +1 -1
  48. package/lib/module/core/AudioBufferBaseSourceNode.js +29 -0
  49. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -0
  50. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -22
  51. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  52. package/lib/module/core/AudioBufferSourceNode.js +4 -21
  53. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  54. package/lib/module/core/AudioScheduledSourceNode.js +7 -2
  55. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  56. package/lib/module/core/BaseAudioContext.js +4 -0
  57. package/lib/module/core/BaseAudioContext.js.map +1 -1
  58. package/lib/module/core/CustomProcessorNode.js +17 -0
  59. package/lib/module/core/CustomProcessorNode.js.map +1 -0
  60. package/lib/module/web-core/AudioScheduledSourceNode.js +1 -4
  61. package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
  62. package/lib/typescript/api.d.ts +1 -0
  63. package/lib/typescript/api.d.ts.map +1 -1
  64. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +14 -0
  65. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -0
  66. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +3 -12
  67. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  68. package/lib/typescript/core/AudioBufferSourceNode.d.ts +2 -11
  69. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  70. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +3 -2
  71. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  72. package/lib/typescript/core/BaseAudioContext.d.ts +2 -0
  73. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  74. package/lib/typescript/core/CustomProcessorNode.d.ts +12 -0
  75. package/lib/typescript/core/CustomProcessorNode.d.ts.map +1 -0
  76. package/lib/typescript/events/types.d.ts +2 -7
  77. package/lib/typescript/events/types.d.ts.map +1 -1
  78. package/lib/typescript/interfaces.d.ts +16 -13
  79. package/lib/typescript/interfaces.d.ts.map +1 -1
  80. package/lib/typescript/types.d.ts +1 -0
  81. package/lib/typescript/types.d.ts.map +1 -1
  82. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +2 -1
  83. package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts.map +1 -1
  84. package/package.json +1 -1
  85. package/src/api.ts +1 -0
  86. package/src/core/AudioBufferBaseSourceNode.ts +41 -0
  87. package/src/core/AudioBufferQueueSourceNode.ts +3 -35
  88. package/src/core/AudioBufferSourceNode.ts +10 -33
  89. package/src/core/AudioScheduledSourceNode.ts +12 -5
  90. package/src/core/BaseAudioContext.ts +8 -0
  91. package/src/core/CustomProcessorNode.ts +28 -0
  92. package/src/events/types.ts +2 -8
  93. package/src/interfaces.ts +25 -23
  94. package/src/types.ts +2 -0
  95. package/src/web-core/AudioScheduledSourceNode.tsx +3 -6
@@ -13,26 +13,15 @@ namespace audioapi {
13
13
  AudioBufferSourceNode::AudioBufferSourceNode(
14
14
  BaseAudioContext *context,
15
15
  bool pitchCorrection)
16
- : AudioScheduledSourceNode(context),
16
+ : AudioBufferBaseSourceNode(context),
17
17
  loop_(false),
18
+ loopSkip_(false),
18
19
  loopStart_(0),
19
20
  loopEnd_(0),
20
- pitchCorrection_(pitchCorrection),
21
- vReadIndex_(0.0) {
21
+ pitchCorrection_(pitchCorrection) {
22
22
  buffer_ = std::shared_ptr<AudioBuffer>(nullptr);
23
23
  alignedBus_ = std::shared_ptr<AudioBus>(nullptr);
24
24
 
25
- detuneParam_ = std::make_shared<AudioParam>(
26
- 0.0, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
27
- playbackRateParam_ = std::make_shared<AudioParam>(
28
- 1.0, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
29
-
30
- playbackRateBus_ = std::make_shared<AudioBus>(
31
- RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
32
-
33
- stretch_ =
34
- std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();
35
-
36
25
  isInitialized_ = true;
37
26
  }
38
27
 
@@ -59,15 +48,6 @@ double AudioBufferSourceNode::getLoopEnd() const {
59
48
  return loopEnd_;
60
49
  }
61
50
 
62
- std::shared_ptr<AudioParam> AudioBufferSourceNode::getDetuneParam() const {
63
- return detuneParam_;
64
- }
65
-
66
- std::shared_ptr<AudioParam> AudioBufferSourceNode::getPlaybackRateParam()
67
- const {
68
- return playbackRateParam_;
69
- }
70
-
71
51
  std::shared_ptr<AudioBuffer> AudioBufferSourceNode::getBuffer() const {
72
52
  return buffer_;
73
53
  }
@@ -144,34 +124,6 @@ void AudioBufferSourceNode::disable() {
144
124
  alignedBus_.reset();
145
125
  }
146
126
 
147
- std::mutex &AudioBufferSourceNode::getBufferLock() {
148
- return bufferLock_;
149
- }
150
-
151
- void AudioBufferSourceNode::sendOnPositionChangedEvent() {
152
- if (onPositionChangedTime_ > onPositionChangedInterval_) {
153
- std::unordered_map<std::string, EventValue> body = {
154
- {"value", getStopTime()}};
155
-
156
- context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
157
- "positionChanged", onPositionChangedCallbackId_, body);
158
-
159
- onPositionChangedTime_ = 0;
160
- }
161
-
162
- onPositionChangedTime_ += RENDER_QUANTUM_SIZE;
163
- }
164
-
165
- void AudioBufferSourceNode::setOnPositionChangedInterval(int interval) {
166
- onPositionChangedInterval_ = static_cast<int>(
167
- context_->getSampleRate() * static_cast<float>(interval) / 1000);
168
- }
169
-
170
- void AudioBufferSourceNode::setOnPositionChangedCallbackId(
171
- uint64_t callbackId) {
172
- onPositionChangedCallbackId_ = callbackId;
173
- }
174
-
175
127
  void AudioBufferSourceNode::processNode(
176
128
  const std::shared_ptr<AudioBus> &processingBus,
177
129
  int framesToProcess) {
@@ -189,13 +141,12 @@ void AudioBufferSourceNode::processNode(
189
141
  }
190
142
 
191
143
  handleStopScheduled();
192
- sendOnPositionChangedEvent();
193
144
  } else {
194
145
  processingBus->zero();
195
146
  }
196
147
  }
197
148
 
198
- double AudioBufferSourceNode::getStopTime() const {
149
+ double AudioBufferSourceNode::getCurrentPosition() const {
199
150
  return dsp::sampleFrameToTime(
200
151
  static_cast<int>(vReadIndex_), buffer_->getSampleRate());
201
152
  }
@@ -225,47 +176,8 @@ void AudioBufferSourceNode::processWithoutPitchCorrection(
225
176
  processWithInterpolation(
226
177
  processingBus, startOffset, offsetLength, computedPlaybackRate);
227
178
  }
228
- }
229
-
230
- void AudioBufferSourceNode::processWithPitchCorrection(
231
- const std::shared_ptr<AudioBus> &processingBus,
232
- int framesToProcess) {
233
- size_t startOffset = 0;
234
- size_t offsetLength = 0;
235
-
236
- auto time = context_->getCurrentTime();
237
- auto playbackRate = std::clamp(
238
- playbackRateParam_->processKRateParam(framesToProcess, time), 0.0f, 3.0f);
239
- auto detune = std::clamp(
240
- detuneParam_->processKRateParam(framesToProcess, time) / 100.0f,
241
- -12.0f,
242
- 12.0f);
243
-
244
- playbackRateBus_->zero();
245
179
 
246
- auto framesNeededToStretch =
247
- static_cast<int>(playbackRate * static_cast<float>(framesToProcess));
248
-
249
- updatePlaybackInfo(
250
- playbackRateBus_, framesNeededToStretch, startOffset, offsetLength);
251
-
252
- if (playbackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
253
- processingBus->zero();
254
- return;
255
- }
256
-
257
- processWithoutInterpolation(
258
- playbackRateBus_, startOffset, offsetLength, playbackRate);
259
-
260
- stretch_->process(
261
- playbackRateBus_.get()[0],
262
- framesNeededToStretch,
263
- processingBus.get()[0],
264
- framesToProcess);
265
-
266
- if (detune != 0.0f) {
267
- stretch_->setTransposeSemitones(detune);
268
- }
180
+ sendOnPositionChangedEvent();
269
181
  }
270
182
 
271
183
  void AudioBufferSourceNode::processWithoutInterpolation(
@@ -1,7 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/core/sources/AudioBuffer.h>
4
- #include <audioapi/core/sources/AudioScheduledSourceNode.h>
4
+ #include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
5
5
  #include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
6
6
 
7
7
  #include <memory>
@@ -14,7 +14,7 @@ namespace audioapi {
14
14
  class AudioBus;
15
15
  class AudioParam;
16
16
 
17
- class AudioBufferSourceNode : public AudioScheduledSourceNode {
17
+ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
18
18
  public:
19
19
  explicit AudioBufferSourceNode(BaseAudioContext *context, bool pitchCorrection);
20
20
  ~AudioBufferSourceNode() override;
@@ -23,8 +23,6 @@ class AudioBufferSourceNode : public AudioScheduledSourceNode {
23
23
  [[nodiscard]] bool getLoopSkip() const;
24
24
  [[nodiscard]] double getLoopStart() const;
25
25
  [[nodiscard]] double getLoopEnd() const;
26
- [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
27
- [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
28
26
  [[nodiscard]] std::shared_ptr<AudioBuffer> getBuffer() const;
29
27
 
30
28
  void setLoop(bool loop);
@@ -36,14 +34,9 @@ class AudioBufferSourceNode : public AudioScheduledSourceNode {
36
34
  void start(double when, double offset, double duration = -1);
37
35
  void disable() override;
38
36
 
39
- void setOnPositionChangedCallbackId(uint64_t callbackId);
40
- void setOnPositionChangedInterval(int interval);
41
- void sendOnPositionChangedEvent();
42
-
43
37
  protected:
44
- std::mutex &getBufferLock();
45
38
  void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
46
- double getStopTime() const override;
39
+ double getCurrentPosition() const override;
47
40
 
48
41
  private:
49
42
  // Looping related properties
@@ -51,41 +44,22 @@ class AudioBufferSourceNode : public AudioScheduledSourceNode {
51
44
  bool loopSkip_;
52
45
  double loopStart_;
53
46
  double loopEnd_;
54
- std::mutex bufferLock_;
55
47
 
56
48
  // pitch correction
57
49
  bool pitchCorrection_;
58
- std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
59
-
60
- // k-rate params
61
- std::shared_ptr<AudioParam> detuneParam_;
62
- std::shared_ptr<AudioParam> playbackRateParam_;
63
-
64
- std::shared_ptr<AudioBus> playbackRateBus_;
65
-
66
- // internal helper
67
- double vReadIndex_;
68
50
 
69
51
  // User provided buffer
70
52
  std::shared_ptr<AudioBuffer> buffer_;
71
53
  std::shared_ptr<AudioBus> alignedBus_;
72
54
 
73
- // positionChanged event props: callbackId, update interval in frames, time since last update in frames
74
- uint64_t onPositionChangedCallbackId_ = 0;
75
- int onPositionChangedInterval_;
76
- int onPositionChangedTime_ = 0;
77
-
78
55
  void processWithoutPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
79
56
  int framesToProcess);
80
57
 
81
- void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
82
- int framesToProcess);
83
-
84
58
  void processWithoutInterpolation(
85
59
  const std::shared_ptr<AudioBus>& processingBus,
86
60
  size_t startOffset,
87
61
  size_t offsetLength,
88
- float playbackRate);
62
+ float playbackRate) override;
89
63
 
90
64
  void processWithInterpolation(
91
65
  const std::shared_ptr<AudioBus>& processingBus,
@@ -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;
@@ -143,18 +149,8 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
143
149
  void AudioScheduledSourceNode::disable() {
144
150
  AudioNode::disable();
145
151
 
146
- std::string state = "stopped";
147
-
148
- // if it has not been stopped, it is ended
149
- if (stopTime_ < 0) {
150
- state = "ended";
151
- }
152
-
153
- std::unordered_map<std::string, EventValue> body = {
154
- {"value", getStopTime()}, {"state", state}};
155
-
156
152
  context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
157
- "ended", onEndedCallbackId_, body);
153
+ "ended", onEndedCallbackId_, {});
158
154
  }
159
155
 
160
156
  void AudioScheduledSourceNode::handleStopScheduled() {
@@ -39,7 +39,6 @@ class AudioScheduledSourceNode : public AudioNode {
39
39
 
40
40
  void setOnEndedCallbackId(uint64_t callbackId);
41
41
 
42
- virtual double getStopTime() const = 0;
43
42
  void disable() override;
44
43
 
45
44
  protected:
@@ -48,6 +47,8 @@ class AudioScheduledSourceNode : public AudioNode {
48
47
 
49
48
  PlaybackState playbackState_;
50
49
 
50
+ uint64_t onEndedCallbackId_ = 0;
51
+
51
52
  void updatePlaybackInfo(
52
53
  const std::shared_ptr<AudioBus>& processingBus,
53
54
  int framesToProcess,
@@ -55,8 +56,6 @@ class AudioScheduledSourceNode : public AudioNode {
55
56
  size_t &nonSilentFramesToProcess);
56
57
 
57
58
  void handleStopScheduled();
58
-
59
- uint64_t onEndedCallbackId_ = 0;
60
59
  };
61
60
 
62
61
  } // namespace audioapi
@@ -91,9 +91,4 @@ void OscillatorNode::processNode(
91
91
  handleStopScheduled();
92
92
  }
93
93
 
94
- double OscillatorNode::getStopTime() const {
95
- return dsp::sampleFrameToTime(
96
- static_cast<int>(phase_), context_->getSampleRate());
97
- }
98
-
99
94
  } // namespace audioapi
@@ -25,7 +25,6 @@ class OscillatorNode : public AudioScheduledSourceNode {
25
25
 
26
26
  protected:
27
27
  void processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
28
- double getStopTime() const override;
29
28
 
30
29
  private:
31
30
  std::shared_ptr<AudioParam> frequencyParam_;
@@ -4,7 +4,9 @@
4
4
 
5
5
  namespace audioapi {
6
6
 
7
- AudioNodeDestructor::AudioNodeDestructor() : isExiting_(false) {
7
+ AudioNodeDestructor::AudioNodeDestructor() {
8
+ isExiting_ = false;
9
+ nodesForDeconstruction_.reserve(10);
8
10
  thread_ = std::thread(&AudioNodeDestructor::process, this);
9
11
  }
10
12
 
@@ -98,7 +98,7 @@ void AudioNodeManager::settlePendingConnections() {
98
98
 
99
99
  void AudioNodeManager::cleanupNode(const std::shared_ptr<AudioNode> &node) {
100
100
  nodeDeconstructor_.addNodeForDeconstruction(node);
101
- node.get()->cleanup();
101
+ node->cleanup();
102
102
  }
103
103
 
104
104
  void AudioNodeManager::prepareNodesForDestruction() {
@@ -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
 
@@ -19,6 +19,7 @@
19
19
  + (instancetype)sharedInstance;
20
20
  - (void)cleanup;
21
21
  - (bool)rebuildAudioEngine;
22
+ - (bool)restartAudioEngine;
22
23
  - (void)startEngine;
23
24
  - (void)stopEngine;
24
25
  - (void)pauseEngine:(NSString *)sourceNodeId;
@@ -59,14 +59,25 @@ static AudioEngine *_sharedInstance = nil;
59
59
  [self.audioEngine connect:sourceNode to:self.audioEngine.mainMixerNode format:format];
60
60
  }
61
61
 
62
- [self.audioEngine attachNode:self.inputNode];
63
- [self.audioEngine connect:self.audioEngine.inputNode to:self.inputNode format:nil];
62
+ if (self.inputNode) {
63
+ [self.audioEngine attachNode:self.inputNode];
64
+ [self.audioEngine connect:self.audioEngine.inputNode to:self.inputNode format:nil];
65
+ }
64
66
 
65
- [self startEngine];
67
+ [self startIfNecessary];
66
68
 
67
69
  return true;
68
70
  }
69
71
 
72
+ - (bool)restartAudioEngine
73
+ {
74
+ if ([self.audioEngine isRunning]) {
75
+ [self.audioEngine stop];
76
+ }
77
+ self.audioEngine = [[AVAudioEngine alloc] init];
78
+ return [self rebuildAudioEngine];
79
+ }
80
+
70
81
  - (void)startEngine
71
82
  {
72
83
  NSLog(@"[AudioEngine] startEngine");
@@ -18,6 +18,7 @@
18
18
  - (instancetype)init;
19
19
  - (void)cleanup;
20
20
  - (bool)configureAudioSession;
21
+ - (bool)reconfigureAudioSession;
21
22
 
22
23
  - (NSNumber *)getDevicePreferredSampleRate;
23
24
  - (void)setAudioSessionOptions:(NSString *)category
@@ -195,6 +195,16 @@
195
195
  return true;
196
196
  }
197
197
 
198
+ - (bool)reconfigureAudioSession
199
+ {
200
+ self.hasDirtySettings = true;
201
+ if (self.isActive) {
202
+ self.isActive = false;
203
+ return [self setActive:true];
204
+ }
205
+ return true;
206
+ }
207
+
198
208
  - (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
199
209
  {
200
210
  if (@available(iOS 17, *)) {
@@ -164,10 +164,8 @@ static NSString *VolumeObservationContext = @"VolumeObservationContext";
164
164
  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;
165
165
  AudioSessionManager *audioSessionManager = self.audioAPIModule.audioSessionManager;
166
166
 
167
- [self cleanup];
168
- [audioSessionManager configureAudioSession];
169
- [self configureNotifications];
170
- [audioEngine rebuildAudioEngine];
167
+ [audioSessionManager reconfigureAudioSession];
168
+ [audioEngine restartAudioEngine];
171
169
  }
172
170
 
173
171
  - (void)handleEngineConfigurationChange:(NSNotification *)notification
@@ -105,6 +105,12 @@ Object.defineProperty(exports, "ContextState", {
105
105
  return _types.ContextState;
106
106
  }
107
107
  });
108
+ Object.defineProperty(exports, "CustomProcessorNode", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _CustomProcessorNode.default;
112
+ }
113
+ });
108
114
  Object.defineProperty(exports, "GainNode", {
109
115
  enumerable: true,
110
116
  get: function () {
@@ -196,6 +202,7 @@ var _AudioParam = _interopRequireDefault(require("./core/AudioParam"));
196
202
  var _AudioScheduledSourceNode = _interopRequireDefault(require("./core/AudioScheduledSourceNode"));
197
203
  var _BaseAudioContext = _interopRequireDefault(require("./core/BaseAudioContext"));
198
204
  var _BiquadFilterNode = _interopRequireDefault(require("./core/BiquadFilterNode"));
205
+ var _CustomProcessorNode = _interopRequireDefault(require("./core/CustomProcessorNode"));
199
206
  var _GainNode = _interopRequireDefault(require("./core/GainNode"));
200
207
  var _OscillatorNode = _interopRequireDefault(require("./core/OscillatorNode"));
201
208
  var _StereoPannerNode = _interopRequireDefault(require("./core/StereoPannerNode"));
@@ -1 +1 @@
1
- {"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AA0CA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,2BAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,aAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,oBAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,qBAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,UAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,aAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,WAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,yBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,iBAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,iBAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,SAAA,GAAAZ,sBAAA,CAAAF,OAAA;AACA,IAAAe,eAAA,GAAAb,sBAAA,CAAAF,OAAA;AACA,IAAAgB,iBAAA,GAAAd,sBAAA,CAAAF,OAAA;AACA,IAAAiB,cAAA,GAAAf,sBAAA,CAAAF,OAAA;AACA,IAAAkB,OAAA,GAAAhB,sBAAA,CAAAF,OAAA;AACA,IAAAmB,eAAA,GAAAjB,sBAAA,CAAAF,OAAA;AAEA,IAAAoB,MAAA,GAAApB,OAAA;AAUA,IAAAqB,OAAA,GAAArB,OAAA;AAMkB,SAAAE,uBAAAoB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AApElB;;AAgBA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
1
+ {"version":3,"names":["_specs","require","_AudioBuffer","_interopRequireDefault","_AudioBufferSourceNode","_AudioBufferQueueSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_CustomProcessorNode","_GainNode","_OscillatorNode","_StereoPannerNode","_AudioRecorder","_system","_useSytemVolume","_types","_errors","e","__esModule","default","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","AudioEventEmitter","NativeAudioAPIModule","Error","install"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AA0CA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,2BAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,aAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,oBAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,qBAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,UAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,aAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,WAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,yBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,iBAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,iBAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,oBAAA,GAAAZ,sBAAA,CAAAF,OAAA;AACA,IAAAe,SAAA,GAAAb,sBAAA,CAAAF,OAAA;AACA,IAAAgB,eAAA,GAAAd,sBAAA,CAAAF,OAAA;AACA,IAAAiB,iBAAA,GAAAf,sBAAA,CAAAF,OAAA;AACA,IAAAkB,cAAA,GAAAhB,sBAAA,CAAAF,OAAA;AACA,IAAAmB,OAAA,GAAAjB,sBAAA,CAAAF,OAAA;AACA,IAAAoB,eAAA,GAAAlB,sBAAA,CAAAF,OAAA;AAEA,IAAAqB,MAAA,GAAArB,OAAA;AAUA,IAAAsB,OAAA,GAAAtB,OAAA;AAMkB,SAAAE,uBAAAqB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AArElB;;AAgBA;;AAEA,IACEG,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,EAChC;EACA,IAAI,CAACC,2BAAoB,EAAE;IACzB,MAAM,IAAIC,KAAK,CACb,iFACF,CAAC;EACH;EAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;AAChC","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
8
+ var _AudioParam = _interopRequireDefault(require("./AudioParam"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ class AudioBufferBaseSourceNode extends _AudioScheduledSourceNode.default {
11
+ constructor(context, node) {
12
+ super(context, node);
13
+ this.detune = new _AudioParam.default(node.detune, context);
14
+ this.playbackRate = new _AudioParam.default(node.playbackRate, context);
15
+ }
16
+
17
+ // eslint-disable-next-line accessor-pairs
18
+ set onPositionChanged(callback) {
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;
27
+ }
28
+
29
+ // eslint-disable-next-line accessor-pairs
30
+ set onPositionChangedInterval(value) {
31
+ this.node.onPositionChangedInterval = value;
32
+ }
33
+ }
34
+ exports.default = AudioBufferBaseSourceNode;
35
+ //# sourceMappingURL=AudioBufferBaseSourceNode.js.map
@@ -0,0 +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":[]}
@@ -4,18 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
8
- var _AudioParam = _interopRequireDefault(require("./AudioParam"));
7
+ var _AudioBufferBaseSourceNode = _interopRequireDefault(require("./AudioBufferBaseSourceNode"));
9
8
  var _errors = require("../errors");
10
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- class AudioBufferQueueSourceNode extends _AudioScheduledSourceNode.default {
12
- constructor(context, node) {
13
- super(context, node);
14
- this.detune = new _AudioParam.default(node.detune, context);
15
- this.playbackRate = new _AudioParam.default(node.playbackRate, context);
16
- }
17
- enqueueBuffer(buffer, bufferId = 0, isLastBuffer = false) {
18
- this.node.enqueueBuffer(buffer.buffer, bufferId, isLastBuffer);
10
+ class AudioBufferQueueSourceNode extends _AudioBufferBaseSourceNode.default {
11
+ enqueueBuffer(buffer, isLastBuffer = false) {
12
+ this.node.enqueueBuffer(buffer.buffer, isLastBuffer);
19
13
  }
20
14
  start(when = 0, offset) {
21
15
  if (when < 0) {
@@ -26,7 +20,7 @@ class AudioBufferQueueSourceNode extends _AudioScheduledSourceNode.default {
26
20
  throw new _errors.RangeError(`offset must be a finite non-negative number: ${offset}`);
27
21
  }
28
22
  }
29
- this.node.start(when, offset);
23
+ this.node.start(when);
30
24
  }
31
25
  stop(when = 0) {
32
26
  if (when < 0) {
@@ -37,17 +31,6 @@ class AudioBufferQueueSourceNode extends _AudioScheduledSourceNode.default {
37
31
  pause() {
38
32
  this.node.pause();
39
33
  }
40
-
41
- // eslint-disable-next-line accessor-pairs
42
- set onPositionChanged(callback) {
43
- const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
44
- this.node.onPositionChanged = subscription.subscriptionId;
45
- }
46
-
47
- // eslint-disable-next-line accessor-pairs
48
- set onPositionChangedInterval(value) {
49
- this.node.onPositionChangedInterval = value;
50
- }
51
34
  }
52
35
  exports.default = AudioBufferQueueSourceNode;
53
36
  //# sourceMappingURL=AudioBufferQueueSourceNode.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","_AudioParam","_errors","e","__esModule","default","AudioBufferQueueSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","enqueueBuffer","buffer","bufferId","isLastBuffer","start","when","offset","RangeError","stop","pause","onPositionChanged","callback","subscription","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","value","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferQueueSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,yBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,WAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAAuC,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGxB,MAAMG,0BAA0B,SAASC,iCAAwB,CAAC;EAI/EC,WAAWA,CAACC,OAAyB,EAAEC,IAAiC,EAAE;IACxE,KAAK,CAACD,OAAO,EAAEC,IAAI,CAAC;IAEpB,IAAI,CAACC,MAAM,GAAG,IAAIC,mBAAU,CAACF,IAAI,CAACC,MAAM,EAAEF,OAAO,CAAC;IAClD,IAAI,CAACI,YAAY,GAAG,IAAID,mBAAU,CAACF,IAAI,CAACG,YAAY,EAAEJ,OAAO,CAAC;EAChE;EAEOK,aAAaA,CAClBC,MAAmB,EACnBC,QAAgB,GAAG,CAAC,EACpBC,YAAqB,GAAG,KAAK,EACvB;IACL,IAAI,CAACP,IAAI,CAAiCI,aAAa,CACtDC,MAAM,CAACA,MAAM,EACbC,QAAQ,EACRC,YACF,CAAC;EACH;EAEgBC,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAe,EAAQ;IAC7D,IAAID,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIE,kBAAU,CAClB,8CAA8CF,IAAI,EACpD,CAAC;IACH;IAEA,IAAIC,MAAM,EAAE;MACV,IAAIA,MAAM,GAAG,CAAC,EAAE;QACd,MAAM,IAAIC,kBAAU,CAClB,gDAAgDD,MAAM,EACxD,CAAC;MACH;IACF;IAEC,IAAI,CAACV,IAAI,CAAiCQ,KAAK,CAACC,IAAI,EAAEC,MAAM,CAAC;EAChE;EAEgBE,IAAIA,CAACH,IAAY,GAAG,CAAC,EAAQ;IAC3C,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIE,kBAAU,CAClB,8CAA8CF,IAAI,EACpD,CAAC;IACH;IAEC,IAAI,CAACT,IAAI,CAAiCY,IAAI,CAACH,IAAI,CAAC;EACvD;EAEOI,KAAKA,CAAA,EAAS;IAClB,IAAI,CAACb,IAAI,CAAiCa,KAAK,CAAC,CAAC;EACpD;;EAEA;EACA,IAAWC,iBAAiBA,CAACC,QAA6C,EAAE;IAC1E,MAAMC,YAAY,GAAG,IAAI,CAACC,iBAAiB,CAACC,qBAAqB,CAC/D,iBAAiB,EACjBH,QACF,CAAC;IAEA,IAAI,CAACf,IAAI,CAAiCc,iBAAiB,GAC1DE,YAAY,CAACG,cAAc;EAC/B;;EAEA;EACA,IAAWC,yBAAyBA,CAACC,KAAa,EAAE;IACjD,IAAI,CAACrB,IAAI,CAAiCoB,yBAAyB,GAClEC,KAAK;EACT;AACF;AAACC,OAAA,CAAA3B,OAAA,GAAAC,0BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_AudioBufferBaseSourceNode","_interopRequireDefault","require","_errors","e","__esModule","default","AudioBufferQueueSourceNode","AudioBufferBaseSourceNode","enqueueBuffer","buffer","isLastBuffer","node","start","when","offset","RangeError","stop","pause","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferQueueSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAAuC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExB,MAAMG,0BAA0B,SAASC,kCAAyB,CAAC;EACzEC,aAAaA,CAClBC,MAAmB,EACnBC,YAAqB,GAAG,KAAK,EACvB;IACL,IAAI,CAACC,IAAI,CAAiCH,aAAa,CACtDC,MAAM,CAACA,MAAM,EACbC,YACF,CAAC;EACH;EAEgBE,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAe,EAAQ;IAC7D,IAAID,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIE,kBAAU,CAClB,8CAA8CF,IAAI,EACpD,CAAC;IACH;IAEA,IAAIC,MAAM,EAAE;MACV,IAAIA,MAAM,GAAG,CAAC,EAAE;QACd,MAAM,IAAIC,kBAAU,CAClB,gDAAgDD,MAAM,EACxD,CAAC;MACH;IACF;IAEC,IAAI,CAACH,IAAI,CAAiCC,KAAK,CAACC,IAAI,CAAC;EACxD;EAEgBG,IAAIA,CAACH,IAAY,GAAG,CAAC,EAAQ;IAC3C,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIE,kBAAU,CAClB,8CAA8CF,IAAI,EACpD,CAAC;IACH;IAEC,IAAI,CAACF,IAAI,CAAiCK,IAAI,CAACH,IAAI,CAAC;EACvD;EAEOI,KAAKA,CAAA,EAAS;IAClB,IAAI,CAACN,IAAI,CAAiCM,KAAK,CAAC,CAAC;EACpD;AACF;AAACC,OAAA,CAAAb,OAAA,GAAAC,0BAAA","ignoreList":[]}
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _AudioScheduledSourceNode = _interopRequireDefault(require("./AudioScheduledSourceNode"));
7
+ var _AudioBufferBaseSourceNode = _interopRequireDefault(require("./AudioBufferBaseSourceNode"));
8
8
  var _AudioBuffer = _interopRequireDefault(require("./AudioBuffer"));
9
- var _AudioParam = _interopRequireDefault(require("./AudioParam"));
10
9
  var _errors = require("../errors");
11
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
- class AudioBufferSourceNode extends _AudioScheduledSourceNode.default {
13
- constructor(context, node) {
14
- super(context, node);
15
- this.detune = new _AudioParam.default(node.detune, context);
16
- this.playbackRate = new _AudioParam.default(node.playbackRate, context);
17
- }
11
+ class AudioBufferSourceNode extends _AudioBufferBaseSourceNode.default {
18
12
  get buffer() {
19
13
  const buffer = this.node.buffer;
20
14
  if (!buffer) {
@@ -24,10 +18,10 @@ class AudioBufferSourceNode extends _AudioScheduledSourceNode.default {
24
18
  }
25
19
  set buffer(buffer) {
26
20
  if (!buffer) {
27
- this.node.buffer = null;
21
+ this.node.setBuffer(this.node, null);
28
22
  return;
29
23
  }
30
- this.node.buffer = buffer.buffer;
24
+ this.node.setBuffer(this.node, buffer.buffer);
31
25
  }
32
26
  get loopSkip() {
33
27
  return this.node.loopSkip;
@@ -69,17 +63,6 @@ class AudioBufferSourceNode extends _AudioScheduledSourceNode.default {
69
63
  this.hasBeenStarted = true;
70
64
  this.node.start(when, offset, duration);
71
65
  }
72
-
73
- // eslint-disable-next-line accessor-pairs
74
- set onPositionChanged(callback) {
75
- const subscription = this.audioEventEmitter.addAudioEventListener('positionChanged', callback);
76
- this.node.onPositionChanged = subscription.subscriptionId;
77
- }
78
-
79
- // eslint-disable-next-line accessor-pairs
80
- set onPositionChangedInterval(value) {
81
- this.node.onPositionChangedInterval = value;
82
- }
83
66
  }
84
67
  exports.default = AudioBufferSourceNode;
85
68
  //# sourceMappingURL=AudioBufferSourceNode.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_AudioScheduledSourceNode","_interopRequireDefault","require","_AudioBuffer","_AudioParam","_errors","e","__esModule","default","AudioBufferSourceNode","AudioScheduledSourceNode","constructor","context","node","detune","AudioParam","playbackRate","buffer","AudioBuffer","loopSkip","value","loop","loopStart","loopEnd","start","when","offset","duration","RangeError","hasBeenStarted","InvalidStateError","onPositionChanged","callback","subscription","audioEventEmitter","addAudioEventListener","subscriptionId","onPositionChangedInterval","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferSourceNode.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_AudioBufferBaseSourceNode","_interopRequireDefault","require","_AudioBuffer","_errors","e","__esModule","default","AudioBufferSourceNode","AudioBufferBaseSourceNode","buffer","node","AudioBuffer","setBuffer","loopSkip","value","loop","loopStart","loopEnd","start","when","offset","duration","RangeError","hasBeenStarted","InvalidStateError","exports"],"sourceRoot":"../../../src","sources":["core/AudioBufferSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,0BAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAA0D,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3C,MAAMG,qBAAqB,SAASC,kCAAyB,CAAC;EAC3E,IAAWC,MAAMA,CAAA,EAAuB;IACtC,MAAMA,MAAM,GAAI,IAAI,CAACC,IAAI,CAA4BD,MAAM;IAC3D,IAAI,CAACA,MAAM,EAAE;MACX,OAAO,IAAI;IACb;IACA,OAAO,IAAIE,oBAAW,CAACF,MAAM,CAAC;EAChC;EAEA,IAAWA,MAAMA,CAACA,MAA0B,EAAE;IAC5C,IAAI,CAACA,MAAM,EAAE;MACV,IAAI,CAACC,IAAI,CAA4BE,SAAS,CAC7C,IAAI,CAACF,IAAI,EACT,IACF,CAAC;MACD;IACF;IAEC,IAAI,CAACA,IAAI,CAA4BE,SAAS,CAC7C,IAAI,CAACF,IAAI,EACTD,MAAM,CAACA,MACT,CAAC;EACH;EAEA,IAAWI,QAAQA,CAAA,EAAY;IAC7B,OAAQ,IAAI,CAACH,IAAI,CAA4BG,QAAQ;EACvD;EAEA,IAAWA,QAAQA,CAACC,KAAc,EAAE;IACjC,IAAI,CAACJ,IAAI,CAA4BG,QAAQ,GAAGC,KAAK;EACxD;EAEA,IAAWC,IAAIA,CAAA,EAAY;IACzB,OAAQ,IAAI,CAACL,IAAI,CAA4BK,IAAI;EACnD;EAEA,IAAWA,IAAIA,CAACD,KAAc,EAAE;IAC7B,IAAI,CAACJ,IAAI,CAA4BK,IAAI,GAAGD,KAAK;EACpD;EAEA,IAAWE,SAASA,CAAA,EAAW;IAC7B,OAAQ,IAAI,CAACN,IAAI,CAA4BM,SAAS;EACxD;EAEA,IAAWA,SAASA,CAACF,KAAa,EAAE;IACjC,IAAI,CAACJ,IAAI,CAA4BM,SAAS,GAAGF,KAAK;EACzD;EAEA,IAAWG,OAAOA,CAAA,EAAW;IAC3B,OAAQ,IAAI,CAACP,IAAI,CAA4BO,OAAO;EACtD;EAEA,IAAWA,OAAOA,CAACH,KAAa,EAAE;IAC/B,IAAI,CAACJ,IAAI,CAA4BO,OAAO,GAAGH,KAAK;EACvD;EAEOI,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAEC,MAAc,GAAG,CAAC,EAAEC,QAAiB,EAAQ;IAC1E,IAAIF,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIG,kBAAU,CAClB,8CAA8CH,IAAI,EACpD,CAAC;IACH;IAEA,IAAIC,MAAM,GAAG,CAAC,EAAE;MACd,MAAM,IAAIE,kBAAU,CAClB,gDAAgDF,MAAM,EACxD,CAAC;IACH;IAEA,IAAIC,QAAQ,IAAIA,QAAQ,GAAG,CAAC,EAAE;MAC5B,MAAM,IAAIC,kBAAU,CAClB,kDAAkDD,QAAQ,EAC5D,CAAC;IACH;IAEA,IAAI,IAAI,CAACE,cAAc,EAAE;MACvB,MAAM,IAAIC,yBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACD,cAAc,GAAG,IAAI;IACzB,IAAI,CAACb,IAAI,CAA4BQ,KAAK,CAACC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,CAAC;EACrE;AACF;AAACI,OAAA,CAAAnB,OAAA,GAAAC,qBAAA","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;