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.
- package/README.md +8 -3
- package/RNAudioAPI.podspec +0 -2
- package/android/src/main/cpp/audioapi/CMakeLists.txt +8 -2
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +7 -29
- package/android/src/main/cpp/audioapi/android/JniEventPayloadParser.cpp +83 -0
- package/android/src/main/cpp/audioapi/android/JniEventPayloadParser.h +14 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +5 -4
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +37 -21
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +1 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +21 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +26 -4
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +3 -3
- package/common/cpp/audioapi/HostObjects/utils/AudioFileUtilsHostObject.cpp +60 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioFileUtilsHostObject.h +24 -0
- package/common/cpp/audioapi/HostObjects/utils/NodeOptionsParser.h +2 -2
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +0 -1
- package/common/cpp/audioapi/core/OfflineAudioContext.h +0 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +4 -10
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +0 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +13 -11
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +5 -9
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +47 -139
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +11 -8
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +29 -114
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +6 -8
- package/common/cpp/audioapi/core/sources/AudioFileSourceNode.cpp +9 -11
- package/common/cpp/audioapi/core/sources/AudioFileSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +2 -2
- package/common/cpp/audioapi/core/types/AudioFormat.h +3 -1
- package/common/cpp/audioapi/core/utils/AudioDecoder.cpp +120 -91
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +24 -101
- package/common/cpp/audioapi/core/utils/AudioFileConcatenator.cpp +862 -0
- package/common/cpp/audioapi/core/utils/AudioFileConcatenator.h +164 -0
- package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +2 -4
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +7 -12
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +2 -0
- package/common/cpp/audioapi/core/utils/buffer/BufferProcessingDirection.h +6 -0
- package/common/cpp/audioapi/core/utils/buffer/BufferProcessorBase.cpp +110 -0
- package/common/cpp/audioapi/core/utils/buffer/BufferProcessorBase.h +75 -0
- package/common/cpp/audioapi/core/utils/buffer/QueueBufferProcessor.cpp +129 -0
- package/common/cpp/audioapi/core/utils/buffer/QueueBufferProcessor.h +55 -0
- package/common/cpp/audioapi/core/utils/buffer/SingleBufferProcessor.cpp +95 -0
- package/common/cpp/audioapi/core/utils/buffer/SingleBufferProcessor.h +52 -0
- package/common/cpp/audioapi/core/utils/param/ParamControlQueue.cpp +12 -8
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +65 -157
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +52 -33
- package/common/cpp/audioapi/events/AudioEventPayload.h +87 -0
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +12 -12
- package/common/cpp/audioapi/libs/decoding/IncrementalAudioDecoder.h +12 -10
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +152 -78
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +6 -6
- package/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.cpp +34 -20
- package/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.h +4 -4
- package/common/cpp/audioapi/utils/AudioArray.hpp +6 -1
- package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +1 -1
- package/common/cpp/audioapi/utils/TaskOffloader.hpp +3 -5
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +4 -25
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +16 -2
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +90 -24
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +64 -20
- package/ios/audioapi/ios/system/AudioSessionManager.mm +18 -7
- package/ios/audioapi/ios/system/SystemNotificationManager.mm +22 -22
- package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +10 -13
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +1 -1
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/commonjs/api.js +8 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +6 -1
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioFileUtils.js +35 -0
- package/lib/commonjs/core/AudioFileUtils.js.map +1 -0
- package/lib/commonjs/mock/index.js +15 -1
- package/lib/commonjs/mock/index.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.js +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/module/api.js +1 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +4 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioFileUtils.js +31 -0
- package/lib/module/core/AudioFileUtils.js.map +1 -0
- package/lib/module/mock/index.js +14 -1
- package/lib/module/mock/index.js.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/api.d.ts +2 -0
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +3 -1
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioFileUtils.d.ts +2 -0
- package/lib/typescript/core/AudioFileUtils.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +3 -0
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/mock/index.d.ts +3 -1
- package/lib/typescript/mock/index.d.ts.map +1 -1
- package/package.json +10 -4
- package/scripts/download-prebuilt-binaries.sh +34 -1
- package/scripts/validate-worklets-version.js +1 -1
- package/src/AudioAPIModule/AudioAPIModule.ts +1 -0
- package/src/AudioAPIModule/globals.d.ts +3 -0
- package/src/api.ts +2 -0
- package/src/api.web.ts +10 -2
- package/src/core/AudioFileUtils.ts +49 -0
- package/src/interfaces.ts +7 -0
- 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
|
-
|
|
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 (
|
|
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 *
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 |=
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAMA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAC,sBAAA,CAAAH,OAAA;AAA6C,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7C,MAAMG,cAAc,CAA4B;EAC9C,CAACC,eAAe,GAA2B,IAAI;EAC/C,CAACC,eAAe,GAAG,KAAK;EACxB,CAACC,eAAe,GAAG,SAAS;EAC5B,CAACC,kBAAkB,GAAG,KAAK;EAC3B,OAAwBC,oBAAoB,GAAG,OAAO;EAEtDC,WAAWA,CAAA,EAAG;IACZ;IACA;IACA;IACA,IAAI,CAAC,CAACC,cAAc,CAAC,CAAC;IAEtB,IAAI,IAAI,CAAC,CAACC,kBAAkB,CAAC,CAAC,EAAE;MAC9B;IACF;IAEA,IAAI,CAACC,2BAAoB,EAAE;MACzB,MAAM,IAAIC,qBAAa,CACrB,iFACF,CAAC;IACH;IAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;EAChC;EAEA,CAACJ,cAAcK,CAAA,EAAY;IACzB,IAAI;MACF,MAAMC,eAAe,GAAGpB,OAAO,CAAC,uBAAuB,CAAC;MACxD,MAAMqB,mBAAmB,GAAGrB,OAAO,CAAC,oCAAoC,CAAC;MACzE,IAAI,CAAC,CAACU,eAAe,GAAGW,mBAAmB,CAACC,OAAO;MACnD,IAAI,CAAC,CAACX,kBAAkB,GAAG,IAAI;MAE/B,IAAI,CAAC,CAACF,eAAe,GAAG,IAAAc,YAAS,EAC/B,IAAI,CAAC,CAACb,eAAe,EACrBH,cAAc,CAACK,oBACjB,CAAC;MAED,IAAI,IAAI,CAAC,CAACH,eAAe,EAAE;QACzB,IAAI,CAAC,CAACD,eAAe,GAAGY,eAAe;MACzC;MAEA,OAAO,IAAI,CAAC,CAACX,eAAe;IAC9B,CAAC,CAAC,MAAM;MACN,IAAI,CAAC,CAACA,eAAe,GAAG,KAAK;MAC7B,OAAO,KAAK;IACd;EACF;EAEA,CAACM,kBAAkBS,CAAA,EAAY;IAC7B,OACEC,MAAM,CAACC,kBAAkB,IAAI,IAAI,IACjCD,MAAM,CAACE,yBAAyB,IAAI,IAAI,IACxCF,MAAM,CAACG,mBAAmB,IAAI,IAAI,IAClCH,MAAM,CAACI,iBAAiB,IAAI,IAAI,IAChCJ,MAAM,CAACK,kBAAkB,IAAI,IAAI,IACjCL,MAAM,CAACM,oBAAoB,IAAI,IAAI,IACnCN,MAAM,CAACO,iBAAiB,IAAI,IAAI;EAEpC;EAEA,IAAIC,cAAcA,CAAA,EAA2B;IAC3C,OAAO,IAAI,CAAC,
|
|
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":[]}
|
package/lib/commonjs/api.js
CHANGED
|
@@ -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"));
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -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":"
|
|
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":[]}
|
package/lib/commonjs/api.web.js
CHANGED
|
@@ -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","
|
|
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
|