react-native-audio-api 0.12.0 → 0.12.2

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 (110) hide show
  1. package/README.md +8 -3
  2. package/RNAudioAPI.podspec +0 -2
  3. package/android/src/main/cpp/audioapi/CMakeLists.txt +8 -2
  4. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +7 -29
  5. package/android/src/main/cpp/audioapi/android/JniEventPayloadParser.cpp +83 -0
  6. package/android/src/main/cpp/audioapi/android/JniEventPayloadParser.h +14 -0
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +5 -4
  8. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -0
  9. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +37 -21
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +1 -1
  11. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +21 -0
  12. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +26 -4
  13. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +1 -0
  14. package/common/cpp/audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.cpp +2 -2
  15. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +3 -3
  16. package/common/cpp/audioapi/HostObjects/utils/AudioFileUtilsHostObject.cpp +60 -0
  17. package/common/cpp/audioapi/HostObjects/utils/AudioFileUtilsHostObject.h +24 -0
  18. package/common/cpp/audioapi/HostObjects/utils/NodeOptionsParser.h +2 -2
  19. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +0 -1
  20. package/common/cpp/audioapi/core/OfflineAudioContext.h +0 -1
  21. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +4 -10
  22. package/common/cpp/audioapi/core/effects/ConvolverNode.h +0 -4
  23. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +1 -1
  24. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +13 -11
  25. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +5 -9
  26. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +47 -139
  27. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +11 -8
  28. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +29 -114
  29. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +6 -8
  30. package/common/cpp/audioapi/core/sources/AudioFileSourceNode.cpp +9 -11
  31. package/common/cpp/audioapi/core/sources/AudioFileSourceNode.h +1 -1
  32. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
  33. package/common/cpp/audioapi/core/types/AudioFormat.h +3 -1
  34. package/common/cpp/audioapi/core/utils/AudioDecoder.cpp +120 -91
  35. package/common/cpp/audioapi/core/utils/AudioDecoder.h +24 -101
  36. package/common/cpp/audioapi/core/utils/AudioFileConcatenator.cpp +862 -0
  37. package/common/cpp/audioapi/core/utils/AudioFileConcatenator.h +164 -0
  38. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +2 -4
  39. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +7 -12
  40. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +2 -0
  41. package/common/cpp/audioapi/core/utils/buffer/BufferProcessingDirection.h +6 -0
  42. package/common/cpp/audioapi/core/utils/buffer/BufferProcessorBase.cpp +110 -0
  43. package/common/cpp/audioapi/core/utils/buffer/BufferProcessorBase.h +75 -0
  44. package/common/cpp/audioapi/core/utils/buffer/QueueBufferProcessor.cpp +129 -0
  45. package/common/cpp/audioapi/core/utils/buffer/QueueBufferProcessor.h +55 -0
  46. package/common/cpp/audioapi/core/utils/buffer/SingleBufferProcessor.cpp +95 -0
  47. package/common/cpp/audioapi/core/utils/buffer/SingleBufferProcessor.h +52 -0
  48. package/common/cpp/audioapi/core/utils/param/ParamControlQueue.cpp +12 -8
  49. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +65 -157
  50. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +52 -33
  51. package/common/cpp/audioapi/events/AudioEventPayload.h +87 -0
  52. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +12 -12
  53. package/common/cpp/audioapi/libs/decoding/IncrementalAudioDecoder.h +12 -10
  54. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +152 -78
  55. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +6 -6
  56. package/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.cpp +34 -20
  57. package/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.h +4 -4
  58. package/common/cpp/audioapi/utils/AudioArray.hpp +6 -1
  59. package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +1 -1
  60. package/common/cpp/audioapi/utils/TaskOffloader.hpp +3 -5
  61. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  62. package/ios/audioapi/ios/AudioAPIModule.mm +4 -25
  63. package/ios/audioapi/ios/core/IOSAudioPlayer.h +16 -2
  64. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +90 -24
  65. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
  66. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +64 -20
  67. package/ios/audioapi/ios/system/AudioSessionManager.mm +18 -7
  68. package/ios/audioapi/ios/system/SystemNotificationManager.mm +22 -22
  69. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +10 -13
  70. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +1 -1
  71. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -1
  72. package/lib/commonjs/api.js +8 -0
  73. package/lib/commonjs/api.js.map +1 -1
  74. package/lib/commonjs/api.web.js +6 -1
  75. package/lib/commonjs/api.web.js.map +1 -1
  76. package/lib/commonjs/core/AudioFileUtils.js +35 -0
  77. package/lib/commonjs/core/AudioFileUtils.js.map +1 -0
  78. package/lib/commonjs/mock/index.js +15 -1
  79. package/lib/commonjs/mock/index.js.map +1 -1
  80. package/lib/module/AudioAPIModule/AudioAPIModule.js +1 -1
  81. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -1
  82. package/lib/module/api.js +1 -0
  83. package/lib/module/api.js.map +1 -1
  84. package/lib/module/api.web.js +4 -1
  85. package/lib/module/api.web.js.map +1 -1
  86. package/lib/module/core/AudioFileUtils.js +31 -0
  87. package/lib/module/core/AudioFileUtils.js.map +1 -0
  88. package/lib/module/mock/index.js +14 -1
  89. package/lib/module/mock/index.js.map +1 -1
  90. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -1
  91. package/lib/typescript/api.d.ts +2 -0
  92. package/lib/typescript/api.d.ts.map +1 -1
  93. package/lib/typescript/api.web.d.ts +3 -1
  94. package/lib/typescript/api.web.d.ts.map +1 -1
  95. package/lib/typescript/core/AudioFileUtils.d.ts +2 -0
  96. package/lib/typescript/core/AudioFileUtils.d.ts.map +1 -0
  97. package/lib/typescript/interfaces.d.ts +3 -0
  98. package/lib/typescript/interfaces.d.ts.map +1 -1
  99. package/lib/typescript/mock/index.d.ts +3 -1
  100. package/lib/typescript/mock/index.d.ts.map +1 -1
  101. package/package.json +10 -4
  102. package/scripts/download-prebuilt-binaries.sh +34 -1
  103. package/scripts/validate-worklets-version.js +1 -1
  104. package/src/AudioAPIModule/AudioAPIModule.ts +1 -0
  105. package/src/AudioAPIModule/globals.d.ts +3 -0
  106. package/src/api.ts +2 -0
  107. package/src/api.web.ts +10 -2
  108. package/src/core/AudioFileUtils.ts +49 -0
  109. package/src/interfaces.ts +7 -0
  110. package/src/mock/index.ts +29 -0
@@ -11,6 +11,9 @@
11
11
  #include <audioapi/utils/CircularArray.hpp>
12
12
  #include <audioapi/utils/Result.hpp>
13
13
  #include <algorithm>
14
+ #include <cstdlib>
15
+ #include <cstring>
16
+ #include <memory>
14
17
  #include <utility>
15
18
 
16
19
  namespace audioapi {
@@ -32,17 +35,7 @@ IOSRecorderCallback::IOSRecorderCallback(
32
35
 
33
36
  IOSRecorderCallback::~IOSRecorderCallback()
34
37
  {
35
- @autoreleasepool {
36
- converter_ = nil;
37
- bufferFormat_ = nil;
38
- callbackFormat_ = nil;
39
- converterInputBuffer_ = nil;
40
- converterOutputBuffer_ = nil;
41
-
42
- for (size_t i = 0; i < channelCount_; ++i) {
43
- circularBuffer_[i]->zero();
44
- }
45
- }
38
+ cleanup();
46
39
  }
47
40
 
48
41
  /// @brief Prepares the IOSRecorderCallback for receiving audio data.
@@ -101,10 +94,14 @@ Result<NoneType, std::string> IOSRecorderCallback::prepare(
101
94
  }
102
95
 
103
96
  /// @brief Cleans up resources used by the IOSRecorderCallback.
104
- /// This method should be called from the JS thread only.
97
+ /// This method should be called from the JS GC thread only.
105
98
  void IOSRecorderCallback::cleanup()
106
99
  {
100
+ std::scoped_lock audioLock(destructionAudioGuard_);
107
101
  @autoreleasepool {
102
+ // join the worker
103
+ offloader_.reset();
104
+
108
105
  if (circularBuffer_[0]->getNumberOfAvailableFrames() > 0) {
109
106
  emitAudioData(true);
110
107
  }
@@ -115,43 +112,89 @@ void IOSRecorderCallback::cleanup()
115
112
  converterInputBuffer_ = nil;
116
113
  converterOutputBuffer_ = nil;
117
114
 
118
- for (size_t i = 0; i < channelCount_; ++i) {
115
+ for (int i = 0; i < channelCount_; ++i) {
119
116
  circularBuffer_[i]->zero();
120
117
  }
121
- offloader_.reset();
122
118
  }
123
119
  }
124
120
 
121
+ static inline void freeOwnedAudioBufferList(const AudioBufferList *bufferList)
122
+ {
123
+ if (bufferList == nullptr) {
124
+ return;
125
+ }
126
+ for (UInt32 i = 0; i < bufferList->mNumberBuffers; ++i) {
127
+ std::free(bufferList->mBuffers[i].mData);
128
+ }
129
+ std::free(const_cast<AudioBufferList *>(bufferList));
130
+ }
131
+
125
132
  /// @brief Receives audio data from the recorder, processes it, and stores it in the circular buffer.
126
133
  /// The data is converted using AVAudioConverter if the input format differs from the user desired callback format.
127
134
  /// This method runs on the audio thread.
128
135
  /// @param inputBuffer Pointer to the AudioBufferList containing the incoming audio data.
129
136
  /// @param numFrames Number of frames in the input buffer.
130
- void IOSRecorderCallback::receiveAudioData(const AudioBufferList *inputBuffer, int numFrames)
137
+ void IOSRecorderCallback::receiveAudioData(const AudioBufferList *audioBufferList, int numFrames)
131
138
  {
139
+ // if we wait here, we are in the middle of the destruction
140
+ std::scoped_lock lock(destructionAudioGuard_);
141
+ if (offloader_ == nullptr) {
142
+ return;
143
+ }
132
144
  if (!isInitialized_.load(std::memory_order_acquire)) {
133
145
  return;
134
146
  }
135
- offloader_->getSender()->send({inputBuffer, numFrames});
147
+
148
+ // CoreAudio owns `audioBufferList` only for the duration of this synchronous
149
+ // callback. Copy into an owned AudioBufferList before handing off to the
150
+ // worker thread; the consumer in taskOffloaderFunction frees it.
151
+ UInt32 bufferCount = audioBufferList->mNumberBuffers;
152
+ size_t headerSize = offsetof(AudioBufferList, mBuffers) + sizeof(AudioBuffer) * bufferCount;
153
+ AudioBufferList *owned = static_cast<AudioBufferList *>(std::malloc(headerSize));
154
+ if (owned == nullptr) {
155
+ return;
156
+ }
157
+ owned->mNumberBuffers = bufferCount;
158
+ for (UInt32 i = 0; i < bufferCount; ++i) {
159
+ UInt32 byteSize = audioBufferList->mBuffers[i].mDataByteSize;
160
+ owned->mBuffers[i].mNumberChannels = audioBufferList->mBuffers[i].mNumberChannels;
161
+ owned->mBuffers[i].mDataByteSize = byteSize;
162
+ void *channelData = std::malloc(byteSize);
163
+ if (channelData == nullptr) {
164
+ for (UInt32 j = 0; j < i; ++j) {
165
+ std::free(owned->mBuffers[j].mData);
166
+ }
167
+ std::free(owned);
168
+ return;
169
+ }
170
+ std::memcpy(channelData, audioBufferList->mBuffers[i].mData, byteSize);
171
+ owned->mBuffers[i].mData = channelData;
172
+ }
173
+ offloader_->getSender()->send({.audioBufferList = owned, .numFrames = numFrames});
136
174
  }
137
175
 
138
176
  void IOSRecorderCallback::taskOffloaderFunction(CallbackData data)
139
177
  {
140
178
  auto [inputBuffer, numFrames] = data;
141
- // dummy data to wake up thread after cleanup, skip processing it
142
- if (inputBuffer == nullptr)
179
+
180
+ // The TaskOffloader destructor sends a default-constructed CallbackData
181
+ // (audioBufferList == nullptr) to unblock the receiver; ignore it here.
182
+ if (inputBuffer == nullptr) {
143
183
  return;
184
+ }
185
+
144
186
  @autoreleasepool {
145
187
  NSError *error = nil;
146
188
 
147
189
  if (bufferFormat_.sampleRate == sampleRate_ && bufferFormat_.channelCount == channelCount_ &&
148
190
  !bufferFormat_.isInterleaved) {
149
191
  // Directly write to circular buffer
150
- for (size_t i = 0; i < channelCount_; ++i) {
192
+ for (int i = 0; i < channelCount_; ++i) {
151
193
  auto *data = static_cast<float *>(inputBuffer->mBuffers[i].mData);
152
194
  circularBuffer_[i]->push_back(data, numFrames);
153
195
  }
154
196
 
197
+ freeOwnedAudioBufferList(inputBuffer);
155
198
  inputBuffer = nullptr;
156
199
  if (circularBuffer_[0]->getNumberOfAvailableFrames() >= bufferLength_) {
157
200
  emitAudioData();
@@ -168,6 +211,7 @@ void IOSRecorderCallback::taskOffloaderFunction(CallbackData data)
168
211
  inputBuffer->mBuffers[i].mDataByteSize);
169
212
  }
170
213
 
214
+ freeOwnedAudioBufferList(inputBuffer);
171
215
  inputBuffer = nullptr;
172
216
  converterInputBuffer_.frameLength = numFrames;
173
217
 
@@ -195,7 +239,7 @@ void IOSRecorderCallback::taskOffloaderFunction(CallbackData data)
195
239
  return;
196
240
  }
197
241
 
198
- for (size_t i = 0; i < channelCount_; ++i) {
242
+ for (int i = 0; i < channelCount_; ++i) {
199
243
  auto *data = static_cast<float *>(converterOutputBuffer_.audioBufferList->mBuffers[i].mData);
200
244
  circularBuffer_[i]->push_back(data, outputFrameCount);
201
245
  }
@@ -13,6 +13,14 @@
13
13
 
14
14
  @end
15
15
 
16
+ // Bit positions from AVAudioSessionTypes.h. Using masks instead of enum case names avoids build breaks when
17
+ // earlier sdks shipped with Xcode do not see certain options
18
+ // todo: remove when most common eas xcode images will be shipped with needed xcode versions
19
+ // https://docs.expo.dev/build-reference/infrastructure/#ios-server-images
20
+ static const AVAudioSessionCategoryOptions
21
+ RNAudioSessionCategoryOptionBluetoothHighQualityRecordingMask = 1 << 19;
22
+ static const AVAudioSessionCategoryOptions RNAudioSessionCategoryOptionFarFieldInputMask = 1 << 18;
23
+
16
24
  @implementation AudioSessionManager
17
25
 
18
26
  static AudioSessionManager *_sharedInstance = nil;
@@ -451,7 +459,8 @@ static AudioSessionManager *_sharedInstance = nil;
451
459
  mode = AVAudioSessionModeDefault;
452
460
  } else if ([modeSTR isEqualToString:@"dualRoute"]) {
453
461
  if (@available(iOS 26.2, *)) {
454
- mode = AVAudioSessionModeDualRoute;
462
+ // under the hood, its only string, refer to lines at the top of the file for more info
463
+ mode = (AVAudioSessionMode) @"AVAudioSessionModeDualRoute";
455
464
  } else {
456
465
  mode = AVAudioSessionModeDefault;
457
466
  }
@@ -462,8 +471,9 @@ static AudioSessionManager *_sharedInstance = nil;
462
471
  } else if ([modeSTR isEqualToString:@"moviePlayback"]) {
463
472
  mode = AVAudioSessionModeMoviePlayback;
464
473
  } else if ([modeSTR isEqualToString:@"shortFormVideo"]) {
465
- if (@available(iOS 26, *)) {
466
- mode = AVAudioSessionModeShortFormVideo;
474
+ if (@available(iOS 26.0, *)) {
475
+ // under the hood, its only string, refer to lines at the top of the file for more info
476
+ mode = (AVAudioSessionMode) @"AVAudioSessionModeShortFormVideo";
467
477
  } else {
468
478
  mode = AVAudioSessionModeDefault;
469
479
  }
@@ -503,8 +513,9 @@ static AudioSessionManager *_sharedInstance = nil;
503
513
  }
504
514
 
505
515
  if ([option isEqualToString:@"bluetoothHighQualityRecording"]) {
506
- if (@available(iOS 26, *)) {
507
- options |= AVAudioSessionCategoryOptionBluetoothHighQualityRecording;
516
+ if (@available(iOS 26.0, *)) {
517
+ // not available in the european union
518
+ options |= RNAudioSessionCategoryOptionBluetoothHighQualityRecordingMask;
508
519
  }
509
520
  continue;
510
521
  }
@@ -521,9 +532,9 @@ static AudioSessionManager *_sharedInstance = nil;
521
532
 
522
533
  if ([option isEqualToString:@"farFieldInput"]) {
523
534
  if (@available(iOS 26.2, *)) {
524
- options |= AVAudioSessionCategoryOptionFarFieldInput;
525
- continue;
535
+ options |= RNAudioSessionCategoryOptionFarFieldInputMask;
526
536
  }
537
+ continue;
527
538
  }
528
539
 
529
540
  if ([option isEqualToString:@"interruptSpokenAudioAndMixWithOthers"]) {
@@ -100,10 +100,10 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
100
100
  }
101
101
 
102
102
  if ([keyPath isEqualToString:@"outputVolume"]) {
103
- NSDictionary *body = @{@"value" : [NSNumber numberWithFloat:[change[@"new"] floatValue]]};
104
103
  if (self.volumeChangesObserved) {
105
104
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::VOLUME_CHANGE
106
- eventBody:body];
105
+ payload:audioapi::DoubleValuePayload{
106
+ .value = [change[@"new"] floatValue]}];
107
107
  }
108
108
  }
109
109
  }
@@ -125,9 +125,9 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
125
125
  });
126
126
 
127
127
  if (self.audioInterruptionsObserved) {
128
- NSDictionary *body = @{@"type" : @"began", @"shouldResume" : @false};
129
128
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
130
- eventBody:body];
129
+ payload:audioapi::InterruptionPayload{
130
+ .type = "began", .shouldResume = false}];
131
131
  }
132
132
 
133
133
  return;
@@ -136,9 +136,10 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
136
136
  bool shouldResume = interruptionOption == AVAudioSessionInterruptionOptionShouldResume;
137
137
 
138
138
  if (self.audioInterruptionsObserved) {
139
- NSDictionary *body = @{@"type" : @"ended", @"shouldResume" : @(shouldResume)};
140
- [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
141
- eventBody:body];
139
+ [self.audioAPIModule
140
+ invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
141
+ payload:audioapi::InterruptionPayload{
142
+ .type = "ended", .shouldResume = shouldResume}];
142
143
  } else {
143
144
  dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:shouldResume]; });
144
145
  }
@@ -158,9 +159,9 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
158
159
  });
159
160
 
160
161
  if (self.audioInterruptionsObserved) {
161
- NSDictionary *body = @{@"type" : @"began", @"shouldResume" : @false};
162
162
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
163
- eventBody:body];
163
+ payload:audioapi::InterruptionPayload{
164
+ .type = "began", .shouldResume = false}];
164
165
  }
165
166
  return;
166
167
  }
@@ -168,9 +169,10 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
168
169
  bool shouldResume = secondaryAudioType == AVAudioSessionSilenceSecondaryAudioHintTypeEnd;
169
170
 
170
171
  if (self.audioInterruptionsObserved) {
171
- NSDictionary *body = @{@"type" : @"ended", @"shouldResume" : @(shouldResume)};
172
- [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
173
- eventBody:body];
172
+ [self.audioAPIModule
173
+ invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
174
+ payload:audioapi::InterruptionPayload{
175
+ .type = "ended", .shouldResume = shouldResume}];
174
176
  } else {
175
177
  dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:shouldResume]; });
176
178
  }
@@ -212,10 +214,10 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
212
214
  break;
213
215
  }
214
216
 
215
- NSDictionary *body = @{@"reason" : reasonStr};
216
-
217
- [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::ROUTE_CHANGE
218
- eventBody:body];
217
+ [self.audioAPIModule
218
+ invokeHandlerWithEventName:audioapi::AudioEvent::ROUTE_CHANGE
219
+ payload:audioapi::StringPayload{
220
+ .name = "reason", .reason = [reasonStr UTF8String]}];
219
221
  }
220
222
 
221
223
  - (void)handleMediaServicesReset:(NSNotification *)notification
@@ -284,21 +286,19 @@ static NSString *NotificationManagerContext = @"SystemNotificationManagerContext
284
286
  [sessionManager markInactive];
285
287
  [audioEngine onInterruptionBegin];
286
288
  });
287
- NSDictionary *body = @{@"type" : @"began", @"shouldResume" : @false};
288
-
289
289
  if (self.audioInterruptionsObserved) {
290
290
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
291
- eventBody:body];
291
+ payload:audioapi::InterruptionPayload{
292
+ .type = "began", .shouldResume = false}];
292
293
  }
293
294
 
294
295
  return;
295
296
  }
296
297
 
297
- NSDictionary *body = @{@"type" : @"ended", @"shouldResume" : @true};
298
-
299
298
  if (self.audioInterruptionsObserved) {
300
299
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION
301
- eventBody:body];
300
+ payload:audioapi::InterruptionPayload{
301
+ .type = "ended", .shouldResume = true}];
302
302
  } else {
303
303
  dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:true]; });
304
304
  }
@@ -338,21 +338,21 @@
338
338
  - (MPRemoteCommandHandlerStatus)onPlay:(MPRemoteCommandEvent *)event
339
339
  {
340
340
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PLAY
341
- eventBody:@{}];
341
+ payload:audioapi::EmptyPayload{}];
342
342
  return MPRemoteCommandHandlerStatusSuccess;
343
343
  }
344
344
 
345
345
  - (MPRemoteCommandHandlerStatus)onPause:(MPRemoteCommandEvent *)event
346
346
  {
347
347
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PAUSE
348
- eventBody:@{}];
348
+ payload:audioapi::EmptyPayload{}];
349
349
  return MPRemoteCommandHandlerStatusSuccess;
350
350
  }
351
351
 
352
352
  - (MPRemoteCommandHandlerStatus)onStop:(MPRemoteCommandEvent *)event
353
353
  {
354
354
  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_STOP
355
- eventBody:@{}];
355
+ payload:audioapi::EmptyPayload{}];
356
356
  return MPRemoteCommandHandlerStatusSuccess;
357
357
  }
358
358
 
@@ -360,7 +360,7 @@
360
360
  {
361
361
  [self.audioAPIModule
362
362
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_NEXT_TRACK
363
- eventBody:@{}];
363
+ payload:audioapi::EmptyPayload{}];
364
364
  return MPRemoteCommandHandlerStatusSuccess;
365
365
  }
366
366
 
@@ -368,7 +368,7 @@
368
368
  {
369
369
  [self.audioAPIModule
370
370
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PREVIOUS_TRACK
371
- eventBody:@{}];
371
+ payload:audioapi::EmptyPayload{}];
372
372
  return MPRemoteCommandHandlerStatusSuccess;
373
373
  }
374
374
 
@@ -376,7 +376,7 @@
376
376
  {
377
377
  [self.audioAPIModule
378
378
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_FORWARD
379
- eventBody:@{}];
379
+ payload:audioapi::EmptyPayload{}];
380
380
  return MPRemoteCommandHandlerStatusSuccess;
381
381
  }
382
382
 
@@ -384,35 +384,32 @@
384
384
  {
385
385
  [self.audioAPIModule
386
386
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_BACKWARD
387
- eventBody:@{}];
387
+ payload:audioapi::EmptyPayload{}];
388
388
  return MPRemoteCommandHandlerStatusSuccess;
389
389
  }
390
390
 
391
391
  - (MPRemoteCommandHandlerStatus)onSkipForward:(MPSkipIntervalCommandEvent *)event
392
392
  {
393
- NSDictionary *body = @{@"value" : @(event.interval)};
394
393
  [self.audioAPIModule
395
394
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SKIP_FORWARD
396
- eventBody:body];
395
+ payload:audioapi::DoubleValuePayload{.value = event.interval}];
397
396
  return MPRemoteCommandHandlerStatusSuccess;
398
397
  }
399
398
 
400
399
  - (MPRemoteCommandHandlerStatus)onSkipBackward:(MPSkipIntervalCommandEvent *)event
401
400
  {
402
- NSDictionary *body = @{@"value" : @(event.interval)};
403
401
  [self.audioAPIModule
404
402
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SKIP_BACKWARD
405
- eventBody:body];
403
+ payload:audioapi::DoubleValuePayload{.value = event.interval}];
406
404
  return MPRemoteCommandHandlerStatusSuccess;
407
405
  }
408
406
 
409
407
  - (MPRemoteCommandHandlerStatus)onChangePlaybackPosition:
410
408
  (MPChangePlaybackPositionCommandEvent *)event
411
409
  {
412
- NSDictionary *body = @{@"value" : @(event.positionTime)};
413
410
  [self.audioAPIModule
414
411
  invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_TO
415
- eventBody:body];
412
+ payload:audioapi::DoubleValuePayload{.value = event.positionTime}];
416
413
  return MPRemoteCommandHandlerStatusSuccess;
417
414
  }
418
415
 
@@ -44,7 +44,7 @@ class AudioAPIModule {
44
44
  }
45
45
  }
46
46
  #verifyInstallation() {
47
- return global.createAudioContext != null && global.createOfflineAudioContext != null && global.createAudioRecorder != null && global.createAudioBuffer != null && global.createAudioDecoder != null && global.createAudioStretcher != null && global.AudioEventEmitter != null;
47
+ return global.createAudioContext != null && global.createOfflineAudioContext != null && global.createAudioRecorder != null && global.createAudioBuffer != null && global.createAudioDecoder != null && global.createAudioFileUtils != null && global.createAudioStretcher != null && global.AudioEventEmitter != null;
48
48
  }
49
49
  get workletsModule() {
50
50
  return this.#workletsModule_;
@@ -1 +1 @@
1
- {"version":3,"names":["_specs","require","_errors","_gte","_interopRequireDefault","e","__esModule","default","AudioAPIModule","workletsModule_","canUseWorklets_","workletsVersion","workletsAvailable_","MIN_WORKLETS_VERSION","constructor","verifyWorklets","verifyInstallation","NativeAudioAPIModule","AudioApiError","install","#verifyWorklets","workletsPackage","workletsPackageJson","version","semverGte","#verifyInstallation","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioBuffer","createAudioDecoder","createAudioStretcher","AudioEventEmitter","workletsModule","canUseWorklets","areWorkletsAvailable","isWorkletsVersionSupported","supportedWorkletsVersion","createAudioRuntime","createWorkletRuntime","_default","exports"],"sourceRoot":"../../../src","sources":["AudioAPIModule/AudioAPIModule.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_specs","require","_errors","_gte","_interopRequireDefault","e","__esModule","default","AudioAPIModule","workletsModule_","canUseWorklets_","workletsVersion","workletsAvailable_","MIN_WORKLETS_VERSION","constructor","verifyWorklets","verifyInstallation","NativeAudioAPIModule","AudioApiError","install","#verifyWorklets","workletsPackage","workletsPackageJson","version","semverGte","#verifyInstallation","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioBuffer","createAudioDecoder","createAudioFileUtils","createAudioStretcher","AudioEventEmitter","workletsModule","canUseWorklets","areWorkletsAvailable","isWorkletsVersionSupported","supportedWorkletsVersion","createAudioRuntime","createWorkletRuntime","_default","exports"],"sourceRoot":"../../../src","sources":["AudioAPIModule/AudioAPIModule.ts"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,7 @@ var _exportNames = {
11
11
  AudioContext: true,
12
12
  decodeAudioData: true,
13
13
  decodePCMInBase64: true,
14
+ concatAudioFiles: true,
14
15
  AudioDestinationNode: true,
15
16
  AudioNode: true,
16
17
  AudioParam: true,
@@ -252,6 +253,12 @@ Object.defineProperty(exports, "changePlaybackSpeed", {
252
253
  return _AudioStretcher.default;
253
254
  }
254
255
  });
256
+ Object.defineProperty(exports, "concatAudioFiles", {
257
+ enumerable: true,
258
+ get: function () {
259
+ return _AudioFileUtils.concatAudioFiles;
260
+ }
261
+ });
255
262
  Object.defineProperty(exports, "decodeAudioData", {
256
263
  enumerable: true,
257
264
  get: function () {
@@ -271,6 +278,7 @@ var _AudioBufferQueueSourceNode = _interopRequireDefault(require("./core/AudioBu
271
278
  var _AudioBufferSourceNode = _interopRequireDefault(require("./core/AudioBufferSourceNode"));
272
279
  var _AudioContext = _interopRequireDefault(require("./core/AudioContext"));
273
280
  var _AudioDecoder = require("./core/AudioDecoder");
281
+ var _AudioFileUtils = require("./core/AudioFileUtils");
274
282
  var _AudioDestinationNode = _interopRequireDefault(require("./core/AudioDestinationNode"));
275
283
  var _AudioNode = _interopRequireDefault(require("./core/AudioNode"));
276
284
  var _AudioParam = _interopRequireDefault(require("./core/AudioParam"));
@@ -1 +1 @@
1
- {"version":3,"names":["require","_AnalyserNode","_interopRequireDefault","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioContext","_AudioDecoder","_AudioDestinationNode","_AudioNode","_AudioParam","_AudioRecorder","_AudioScheduledSourceNode","_AudioStretcher","_BaseAudioContext","_BiquadFilterNode","_ConstantSourceNode","_ConvolverNode","_DelayNode","_GainNode","_OfflineAudioContext","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WaveShaperNode","_WorkletNode","_WorkletProcessingNode","_WorkletSourceNode","_errors","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types","_types2","_filePresets","_notification","_system","e","__esModule","default"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["require","_AnalyserNode","_interopRequireDefault","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioContext","_AudioDecoder","_AudioFileUtils","_AudioDestinationNode","_AudioNode","_AudioParam","_AudioRecorder","_AudioScheduledSourceNode","_AudioStretcher","_BaseAudioContext","_BiquadFilterNode","_ConstantSourceNode","_ConvolverNode","_DelayNode","_GainNode","_OfflineAudioContext","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WaveShaperNode","_WorkletNode","_WorkletProcessingNode","_WorkletSourceNode","_errors","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types","_types2","_filePresets","_notification","_system","e","__esModule","default"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  var _exportNames = {
7
+ concatAudioFiles: true,
7
8
  AudioBuffer: true,
8
9
  AudioBufferSourceNode: true,
9
10
  AudioContext: true,
@@ -194,6 +195,7 @@ Object.defineProperty(exports, "WaveShaperNode", {
194
195
  return _WaveShaperNode.default;
195
196
  }
196
197
  });
198
+ exports.concatAudioFiles = concatAudioFiles;
197
199
  var _AudioBuffer = _interopRequireDefault(require("./web-core/AudioBuffer"));
198
200
  var _AudioBufferSourceNode = _interopRequireDefault(require("./web-core/AudioBufferSourceNode"));
199
201
  var _AudioContext = _interopRequireDefault(require("./web-core/AudioContext"));
@@ -225,7 +227,6 @@ Object.keys(_custom).forEach(function (key) {
225
227
  }
226
228
  });
227
229
  });
228
- var _webSystem = require("./web-system");
229
230
  var _types = require("./system/notification/types");
230
231
  Object.keys(_types).forEach(function (key) {
231
232
  if (key === "default" || key === "__esModule") return;
@@ -238,6 +239,10 @@ Object.keys(_types).forEach(function (key) {
238
239
  }
239
240
  });
240
241
  });
242
+ var _webSystem = require("./web-system");
241
243
  var _errors = require("./errors");
242
244
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
245
+ function concatAudioFiles(_inputPaths, _outputPath) {
246
+ return Promise.reject(new Error('concatAudioFiles is not supported on web.'));
247
+ }
243
248
  //# sourceMappingURL=api.web.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_AudioBuffer","_interopRequireDefault","require","_AudioBufferSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_DelayNode","_GainNode","_OscillatorNode","_StereoPannerNode","_ConstantSourceNode","_ConvolverNode","_PeriodicWave","_WaveShaperNode","_custom","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_webSystem","_types","_errors","e","__esModule","default"],"sourceRoot":"../../src","sources":["api.web.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,aAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,oBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,qBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,UAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,aAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,WAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,yBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,iBAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,iBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,UAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,SAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,eAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,iBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,mBAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,cAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,aAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,eAAA,GAAAnB,sBAAA,CAAAC,OAAA;AAEA,IAAAmB,OAAA,GAAAnB,OAAA;AAAAoB,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,OAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,OAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAiBA,IAAAS,UAAA,GAAAhC,OAAA;AAMA,IAAAiC,MAAA,GAAAjC,OAAA;AAAAoB,MAAA,CAAAC,IAAA,CAAAY,MAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,MAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,MAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AAEA,IAAAW,OAAA,GAAAlC,OAAA;AAMkB,SAAAD,uBAAAoC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
1
+ {"version":3,"names":["_AudioBuffer","_interopRequireDefault","require","_AudioBufferSourceNode","_AudioContext","_OfflineAudioContext","_AudioDestinationNode","_AudioNode","_AnalyserNode","_AudioParam","_AudioScheduledSourceNode","_BaseAudioContext","_BiquadFilterNode","_DelayNode","_GainNode","_OscillatorNode","_StereoPannerNode","_ConstantSourceNode","_ConvolverNode","_PeriodicWave","_WaveShaperNode","_custom","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types","_webSystem","_errors","e","__esModule","default","concatAudioFiles","_inputPaths","_outputPath","Promise","reject","Error"],"sourceRoot":"../../src","sources":["api.web.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,aAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,oBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,qBAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,UAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,aAAA,GAAAP,sBAAA,CAAAC,OAAA;AACA,IAAAO,WAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,yBAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,iBAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,iBAAA,GAAAX,sBAAA,CAAAC,OAAA;AACA,IAAAW,UAAA,GAAAZ,sBAAA,CAAAC,OAAA;AACA,IAAAY,SAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,eAAA,GAAAd,sBAAA,CAAAC,OAAA;AACA,IAAAc,iBAAA,GAAAf,sBAAA,CAAAC,OAAA;AACA,IAAAe,mBAAA,GAAAhB,sBAAA,CAAAC,OAAA;AACA,IAAAgB,cAAA,GAAAjB,sBAAA,CAAAC,OAAA;AACA,IAAAiB,aAAA,GAAAlB,sBAAA,CAAAC,OAAA;AACA,IAAAkB,eAAA,GAAAnB,sBAAA,CAAAC,OAAA;AAEA,IAAAmB,OAAA,GAAAnB,OAAA;AAAAoB,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,OAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,OAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAwBA,IAAAS,MAAA,GAAAhC,OAAA;AAAAoB,MAAA,CAAAC,IAAA,CAAAW,MAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,MAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,MAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AAGA,IAAAU,UAAA,GAAAjC,OAAA;AAMA,IAAAkC,OAAA,GAAAlC,OAAA;AAMkB,SAAAD,uBAAAoC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AArCX,SAASG,gBAAgBA,CAC9BC,WAAqB,EACrBC,WAAmB,EACF;EACjB,OAAOC,OAAO,CAACC,MAAM,CAAC,IAAIC,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/E","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.concatAudioFiles = concatAudioFiles;
7
+ var _errors = require("../errors");
8
+ class AudioFileUtils {
9
+ static instance = null;
10
+ constructor() {
11
+ this.fileUtils = global.createAudioFileUtils();
12
+ }
13
+ static getInstance() {
14
+ if (!AudioFileUtils.instance) {
15
+ AudioFileUtils.instance = new AudioFileUtils();
16
+ }
17
+ return AudioFileUtils.instance;
18
+ }
19
+ async concatAudioFilesInstance(inputPaths, outputPath) {
20
+ if (!Array.isArray(inputPaths) || inputPaths.length === 0) {
21
+ throw new _errors.AudioApiError('concatAudioFiles requires at least one input path.');
22
+ }
23
+ if (inputPaths.some(inputPath => typeof inputPath !== 'string')) {
24
+ throw new TypeError('concatAudioFiles input paths must be strings.');
25
+ }
26
+ if (typeof outputPath !== 'string' || outputPath.length === 0) {
27
+ throw new _errors.AudioApiError('concatAudioFiles requires an output path.');
28
+ }
29
+ return this.fileUtils.concatAudioFiles(inputPaths, outputPath);
30
+ }
31
+ }
32
+ async function concatAudioFiles(inputPaths, outputPath) {
33
+ return AudioFileUtils.getInstance().concatAudioFilesInstance(inputPaths, outputPath);
34
+ }
35
+ //# sourceMappingURL=AudioFileUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_errors","require","AudioFileUtils","instance","constructor","fileUtils","global","createAudioFileUtils","getInstance","concatAudioFilesInstance","inputPaths","outputPath","Array","isArray","length","AudioApiError","some","inputPath","TypeError","concatAudioFiles"],"sourceRoot":"../../../src","sources":["core/AudioFileUtils.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGA,MAAMC,cAAc,CAAC;EACnB,OAAeC,QAAQ,GAA0B,IAAI;EAG7CC,WAAWA,CAAA,EAAG;IACpB,IAAI,CAACC,SAAS,GAAGC,MAAM,CAACC,oBAAoB,CAAC,CAAC;EAChD;EAEA,OAAcC,WAAWA,CAAA,EAAmB;IAC1C,IAAI,CAACN,cAAc,CAACC,QAAQ,EAAE;MAC5BD,cAAc,CAACC,QAAQ,GAAG,IAAID,cAAc,CAAC,CAAC;IAChD;IACA,OAAOA,cAAc,CAACC,QAAQ;EAChC;EAEA,MAAaM,wBAAwBA,CACnCC,UAAoB,EACpBC,UAAkB,EACD;IACjB,IAAI,CAACC,KAAK,CAACC,OAAO,CAACH,UAAU,CAAC,IAAIA,UAAU,CAACI,MAAM,KAAK,CAAC,EAAE;MACzD,MAAM,IAAIC,qBAAa,CACrB,oDACF,CAAC;IACH;IAEA,IAAIL,UAAU,CAACM,IAAI,CAAEC,SAAS,IAAK,OAAOA,SAAS,KAAK,QAAQ,CAAC,EAAE;MACjE,MAAM,IAAIC,SAAS,CAAC,+CAA+C,CAAC;IACtE;IAEA,IAAI,OAAOP,UAAU,KAAK,QAAQ,IAAIA,UAAU,CAACG,MAAM,KAAK,CAAC,EAAE;MAC7D,MAAM,IAAIC,qBAAa,CAAC,2CAA2C,CAAC;IACtE;IAEA,OAAO,IAAI,CAACV,SAAS,CAACc,gBAAgB,CAACT,UAAU,EAAEC,UAAU,CAAC;EAChE;AACF;AAEO,eAAeQ,gBAAgBA,CACpCT,UAAoB,EACpBC,UAAkB,EACD;EACjB,OAAOT,cAAc,CAACM,WAAW,CAAC,CAAC,CAACC,wBAAwB,CAC1DC,UAAU,EACVC,UACF,CAAC;AACH","ignoreList":[]}
@@ -201,7 +201,7 @@ Object.defineProperty(exports, "WaveShaperOptions", {
201
201
  return _types.WaveShaperOptions;
202
202
  }
203
203
  });
204
- exports.useSystemVolume = exports.setMockSystemVolume = exports.default = exports.decodePCMInBase64 = exports.decodeAudioData = exports.changePlaybackSpeed = exports.WorkletSourceNode = exports.WorkletProcessingNode = exports.WorkletNode = void 0;
204
+ exports.useSystemVolume = exports.setMockSystemVolume = exports.default = exports.decodePCMInBase64 = exports.decodeAudioData = exports.concatAudioFiles = exports.changePlaybackSpeed = exports.WorkletSourceNode = exports.WorkletProcessingNode = exports.WorkletNode = void 0;
205
205
  var _types = require("../types");
206
206
  /* eslint-disable no-useless-constructor */
207
207
 
@@ -756,6 +756,19 @@ const changePlaybackSpeed = (buffer, _speed) => {
756
756
  return Promise.resolve(buffer);
757
757
  };
758
758
  exports.changePlaybackSpeed = changePlaybackSpeed;
759
+ const concatAudioFiles = (inputPaths, outputPath) => {
760
+ if (!Array.isArray(inputPaths) || inputPaths.length === 0) {
761
+ return Promise.reject(new AudioApiErrorMock('concatAudioFiles requires at least one input path.'));
762
+ }
763
+ if (inputPaths.some(inputPath => typeof inputPath !== 'string')) {
764
+ return Promise.reject(new TypeError('concatAudioFiles input paths must be strings.'));
765
+ }
766
+ if (typeof outputPath !== 'string' || outputPath.length === 0) {
767
+ return Promise.reject(new AudioApiErrorMock('concatAudioFiles requires an output path.'));
768
+ }
769
+ return Promise.resolve(outputPath);
770
+ };
771
+ exports.concatAudioFiles = concatAudioFiles;
759
772
  class AudioManagerMock {
760
773
  static getDevicePreferredSampleRate() {
761
774
  return 44100;
@@ -925,6 +938,7 @@ var _default = exports.default = {
925
938
  decodeAudioData,
926
939
  decodePCMInBase64,
927
940
  changePlaybackSpeed,
941
+ concatAudioFiles,
928
942
  useSystemVolume,
929
943
  setMockSystemVolume,
930
944
  // System classes