react-native-audio-api 0.6.5-rc.1 → 0.7.0-nightly-fba4835-20250717
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 +4 -1
- package/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp +56 -47
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +38 -8
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.h +9 -3
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +4 -0
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +2 -2
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +2 -2
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +2 -2
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +46 -0
- package/android/src/main/res/drawable/skip_backward_15.xml +16 -0
- package/android/src/main/res/drawable/skip_forward_15.xml +16 -0
- package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +9 -0
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +3 -5
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +11 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +24 -23
- package/common/cpp/audioapi/core/AudioContext.cpp +6 -4
- package/common/cpp/audioapi/core/AudioContext.h +1 -1
- package/common/cpp/audioapi/core/AudioParam.cpp +18 -4
- package/common/cpp/audioapi/core/AudioParam.h +3 -0
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +3 -3
- package/common/cpp/audioapi/core/BaseAudioContext.h +4 -3
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +2 -1
- package/common/cpp/audioapi/core/OfflineAudioContext.h +1 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +1 -0
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -0
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +11 -0
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +4 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +11 -0
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +2 -1
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +38 -1
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +1 -0
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +1 -2
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +47 -17
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +6 -5
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +25 -0
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +1 -0
- package/common/cpp/audioapi/libs/audio-stretch/stretch.c +610 -0
- package/common/cpp/audioapi/libs/audio-stretch/stretch.h +49 -0
- package/common/cpp/audioapi/utils/AudioArray.h +1 -0
- package/common/cpp/audioapi/utils/CircularAudioArray.h +1 -0
- package/common/cpp/test/CMakeLists.txt +63 -0
- package/common/cpp/test/GainTest.cpp +78 -0
- package/common/cpp/test/MockAudioEventHandlerRegistry.h +22 -0
- package/common/cpp/test/OscillatorTest.cpp +22 -0
- package/common/cpp/test/RunTests.sh +26 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +17 -8
- package/ios/audioapi/ios/core/AudioDecoder.mm +37 -31
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -1
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +5 -2
- package/ios/audioapi/ios/system/AudioSessionManager.h +4 -0
- package/ios/audioapi/ios/system/AudioSessionManager.mm +26 -0
- package/ios/audioapi/ios/system/LockScreenManager.mm +2 -0
- package/lib/commonjs/core/AudioBufferSourceNode.js +2 -2
- package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +7 -6
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/plugin/withAudioAPI.js +1 -1
- package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +3 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +2 -2
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +4 -4
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +7 -6
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/plugin/withAudioAPI.js +1 -1
- package/lib/module/plugin/withAudioAPI.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +3 -0
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +2 -2
- package/lib/typescript/core/BaseAudioContext.d.ts +4 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +3 -3
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +2 -1
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +11 -0
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioBufferSourceNode.ts +2 -8
- package/src/core/AudioScheduledSourceNode.ts +4 -4
- package/src/core/BaseAudioContext.ts +12 -9
- package/src/interfaces.ts +6 -6
- package/src/plugin/withAudioAPI.ts +1 -1
- package/src/specs/NativeAudioAPIModule.ts +4 -1
- package/src/system/AudioManager.ts +10 -1
- package/src/system/types.ts +14 -0
- package/android/src/main/res/drawable/skip_backward_10.xml +0 -9
- package/android/src/main/res/drawable/skip_forward_10.xml +0 -9
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.14)
|
|
2
|
+
project(rnaudioapi_test)
|
|
3
|
+
|
|
4
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
5
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
6
|
+
set(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)
|
|
7
|
+
set(REACT_NATIVE_DIR "${ROOT}/node_modules/react-native")
|
|
8
|
+
set(JSI_DIR "${REACT_NATIVE_DIR}/ReactCommon/jsi")
|
|
9
|
+
|
|
10
|
+
include(FetchContent)
|
|
11
|
+
FetchContent_Declare(
|
|
12
|
+
googletest
|
|
13
|
+
URL https://github.com/google/googletest/archive/3983f67e32fb3e9294487b9d4f9586efa6e5d088.zip
|
|
14
|
+
)
|
|
15
|
+
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
|
16
|
+
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
17
|
+
FetchContent_MakeAvailable(googletest)
|
|
18
|
+
|
|
19
|
+
enable_testing()
|
|
20
|
+
|
|
21
|
+
file(GLOB_RECURSE RNAUDIOAPI_SRC
|
|
22
|
+
CONFIGURE_DEPENDS
|
|
23
|
+
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/*.cpp"
|
|
24
|
+
"${ROOT}/node_modules/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioDecoder.cpp"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
list(REMOVE_ITEM RNAUDIOAPI_SRC "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp")
|
|
28
|
+
|
|
29
|
+
file(GLOB_RECURSE RNAUDIOAPI_LIBS
|
|
30
|
+
CONFIGURE_DEPENDS
|
|
31
|
+
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.c"
|
|
32
|
+
"${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.h"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
add_library(rnaudioapi STATIC ${RNAUDIOAPI_SRC})
|
|
36
|
+
add_library(rnaudioapi_libs STATIC ${RNAUDIOAPI_LIBS})
|
|
37
|
+
|
|
38
|
+
target_include_directories(rnaudioapi PUBLIC
|
|
39
|
+
${ROOT}/packages/react-native-audio-api/common/cpp
|
|
40
|
+
${JSI_DIR}
|
|
41
|
+
"${REACT_NATIVE_DIR}/ReactCommon"
|
|
42
|
+
"${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
target_include_directories(rnaudioapi_libs PUBLIC
|
|
46
|
+
${ROOT}/packages/react-native-audio-api/common/cpp
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
add_executable(
|
|
50
|
+
tests
|
|
51
|
+
OscillatorTest.cpp
|
|
52
|
+
GainTest.cpp
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
target_link_libraries(tests
|
|
56
|
+
rnaudioapi
|
|
57
|
+
rnaudioapi_libs
|
|
58
|
+
GTest::gtest_main
|
|
59
|
+
GTest::gmock
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
include(GoogleTest)
|
|
63
|
+
gtest_discover_tests(tests)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
2
|
+
#include <audioapi/core/effects/GainNode.h>
|
|
3
|
+
#include <audioapi/utils/AudioArray.h>
|
|
4
|
+
#include <audioapi/utils/AudioBus.h>
|
|
5
|
+
#include <gtest/gtest.h>
|
|
6
|
+
#include "MockAudioEventHandlerRegistry.h"
|
|
7
|
+
|
|
8
|
+
class GainTest : public ::testing::Test {
|
|
9
|
+
protected:
|
|
10
|
+
std::shared_ptr<audioapi::IAudioEventHandlerRegistry> eventRegistry;
|
|
11
|
+
std::unique_ptr<audioapi::OfflineAudioContext> context;
|
|
12
|
+
static constexpr int sampleRate = 44100;
|
|
13
|
+
|
|
14
|
+
void SetUp() override {
|
|
15
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
16
|
+
context = std::make_unique<audioapi::OfflineAudioContext>(
|
|
17
|
+
2, 5 * sampleRate, sampleRate, eventRegistry);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
class TestableGainNode : public audioapi::GainNode {
|
|
22
|
+
public:
|
|
23
|
+
explicit TestableGainNode(audioapi::BaseAudioContext *context)
|
|
24
|
+
: audioapi::GainNode(context) {}
|
|
25
|
+
|
|
26
|
+
void setGainParam(float value) {
|
|
27
|
+
getGainParam()->setValue(value);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void processNode(
|
|
31
|
+
const std::shared_ptr<audioapi::AudioBus> &processingBus,
|
|
32
|
+
int framesToProcess) override {
|
|
33
|
+
audioapi::GainNode::processNode(processingBus, framesToProcess);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
TEST_F(GainTest, GainCanBeCreated) {
|
|
38
|
+
auto gain = context->createGain();
|
|
39
|
+
ASSERT_NE(gain, nullptr);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
TEST_F(GainTest, GainModulatesVolumeCorrectly) {
|
|
43
|
+
static constexpr float GAIN_VALUE = 0.5f;
|
|
44
|
+
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
45
|
+
auto gainNode = std::make_shared<TestableGainNode>(context.get());
|
|
46
|
+
gainNode->setGainParam(GAIN_VALUE);
|
|
47
|
+
|
|
48
|
+
auto bus =
|
|
49
|
+
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
50
|
+
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
51
|
+
bus->getChannel(0)->getData()[i] = i + 1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
gainNode->processNode(bus, FRAMES_TO_PROCESS);
|
|
55
|
+
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
56
|
+
EXPECT_FLOAT_EQ((*bus->getChannel(0))[i], (i + 1) * GAIN_VALUE);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
TEST_F(GainTest, GainModulatesVolumeCorrectlyMultiChannel) {
|
|
61
|
+
static constexpr float GAIN_VALUE = 0.5f;
|
|
62
|
+
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
63
|
+
auto gainNode = std::make_shared<TestableGainNode>(context.get());
|
|
64
|
+
gainNode->setGainParam(GAIN_VALUE);
|
|
65
|
+
|
|
66
|
+
auto bus =
|
|
67
|
+
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
68
|
+
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
69
|
+
bus->getChannel(0)->getData()[i] = i + 1;
|
|
70
|
+
bus->getChannel(1)->getData()[i] = -i - 1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
gainNode->processNode(bus, FRAMES_TO_PROCESS);
|
|
74
|
+
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
75
|
+
EXPECT_FLOAT_EQ((*bus->getChannel(0))[i], (i + 1) * GAIN_VALUE);
|
|
76
|
+
EXPECT_FLOAT_EQ((*bus->getChannel(1))[i], (-i - 1) * GAIN_VALUE);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <gmock/gmock.h>
|
|
4
|
+
#include <audioapi/events/IAudioEventHandlerRegistry.h>
|
|
5
|
+
#include <unordered_map>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <memory>
|
|
8
|
+
|
|
9
|
+
using EventMap = std::unordered_map<std::string, audioapi::EventValue>;
|
|
10
|
+
|
|
11
|
+
class MockAudioEventHandlerRegistry : public audioapi::IAudioEventHandlerRegistry {
|
|
12
|
+
public:
|
|
13
|
+
MOCK_METHOD(uint64_t, registerHandler,
|
|
14
|
+
(const std::string &eventName, const std::shared_ptr<facebook::jsi::Function> &handler), (override));
|
|
15
|
+
MOCK_METHOD(void, unregisterHandler,
|
|
16
|
+
(const std::string &eventName, uint64_t listenerId), (override));
|
|
17
|
+
|
|
18
|
+
MOCK_METHOD(void, invokeHandlerWithEventBody,
|
|
19
|
+
(const std::string &eventName, const EventMap &body), (override));
|
|
20
|
+
MOCK_METHOD(void, invokeHandlerWithEventBody,
|
|
21
|
+
(const std::string &eventName, uint64_t listenerId, const EventMap &body), (override));
|
|
22
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
2
|
+
#include <audioapi/core/sources/OscillatorNode.h>
|
|
3
|
+
#include <gtest/gtest.h>
|
|
4
|
+
#include "MockAudioEventHandlerRegistry.h"
|
|
5
|
+
|
|
6
|
+
class OscillatorTest : public ::testing::Test {
|
|
7
|
+
protected:
|
|
8
|
+
std::shared_ptr<audioapi::IAudioEventHandlerRegistry> eventRegistry;
|
|
9
|
+
std::unique_ptr<audioapi::OfflineAudioContext> context;
|
|
10
|
+
static constexpr int sampleRate = 44100;
|
|
11
|
+
|
|
12
|
+
void SetUp() override {
|
|
13
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
14
|
+
context = std::make_unique<audioapi::OfflineAudioContext>(
|
|
15
|
+
2, 5 * sampleRate, sampleRate, eventRegistry);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
TEST_F(OscillatorTest, OscillatorCanBeCreated) {
|
|
20
|
+
auto osc = context->createOscillator();
|
|
21
|
+
ASSERT_NE(osc, nullptr);
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
cleanup() {
|
|
6
|
+
echo "Cleaning up..."
|
|
7
|
+
rm -rf build/
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
trap cleanup EXIT
|
|
11
|
+
# Step 1: Move to the script's directory
|
|
12
|
+
cd packages/react-native-audio-api/common/cpp/test
|
|
13
|
+
# Step 2: Configure CMake project
|
|
14
|
+
# mkdir build
|
|
15
|
+
cmake -S . -B build
|
|
16
|
+
|
|
17
|
+
# Step 3: Build the project
|
|
18
|
+
cmake --build build
|
|
19
|
+
|
|
20
|
+
# Step 4: Run the test binary
|
|
21
|
+
cd build
|
|
22
|
+
./tests
|
|
23
|
+
cd ..
|
|
24
|
+
|
|
25
|
+
# Step 5: Clean up build directory
|
|
26
|
+
rm -rf build/
|
|
@@ -85,8 +85,9 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
|
|
|
85
85
|
return [self.audioSessionManager getDevicePreferredSampleRate];
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
RCT_EXPORT_METHOD(
|
|
89
|
-
|
|
88
|
+
RCT_EXPORT_METHOD(
|
|
89
|
+
setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
|
|
90
|
+
reject)
|
|
90
91
|
{
|
|
91
92
|
if ([self.audioSessionManager setActive:enabled]) {
|
|
92
93
|
resolve(@"true");
|
|
@@ -96,8 +97,9 @@ RCT_EXPORT_METHOD(setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseR
|
|
|
96
97
|
resolve(@"false");
|
|
97
98
|
}
|
|
98
99
|
|
|
99
|
-
RCT_EXPORT_METHOD(
|
|
100
|
-
|
|
100
|
+
RCT_EXPORT_METHOD(
|
|
101
|
+
setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
|
|
102
|
+
options allowHaptics : (BOOL)allowHaptics)
|
|
101
103
|
{
|
|
102
104
|
[self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
|
|
103
105
|
}
|
|
@@ -127,18 +129,25 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
|
|
|
127
129
|
[self.notificationManager observeVolumeChanges:(BOOL)enabled];
|
|
128
130
|
}
|
|
129
131
|
|
|
130
|
-
RCT_EXPORT_METHOD(
|
|
131
|
-
|
|
132
|
+
RCT_EXPORT_METHOD(
|
|
133
|
+
requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
|
|
134
|
+
reject)
|
|
132
135
|
{
|
|
133
136
|
[self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
|
|
134
137
|
}
|
|
135
138
|
|
|
136
|
-
RCT_EXPORT_METHOD(
|
|
137
|
-
|
|
139
|
+
RCT_EXPORT_METHOD(
|
|
140
|
+
checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
138
141
|
{
|
|
139
142
|
[self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
|
|
140
143
|
}
|
|
141
144
|
|
|
145
|
+
RCT_EXPORT_METHOD(getDevicesInfo : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
|
|
146
|
+
reject)
|
|
147
|
+
{
|
|
148
|
+
[self.audioSessionManager getDevicesInfo:resolve reject:reject];
|
|
149
|
+
}
|
|
150
|
+
|
|
142
151
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
143
152
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
144
153
|
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
#include <audioapi/core/utils/AudioDecoder.h>
|
|
5
5
|
#include <audioapi/dsp/VectorMath.h>
|
|
6
|
+
#include <audioapi/libs/audio-stretch/stretch.h>
|
|
6
7
|
#include <audioapi/libs/base64/base64.h>
|
|
7
8
|
#include <audioapi/utils/AudioArray.h>
|
|
8
9
|
#include <audioapi/utils/AudioBus.h>
|
|
@@ -12,7 +13,7 @@ namespace audioapi {
|
|
|
12
13
|
std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &path) const
|
|
13
14
|
{
|
|
14
15
|
ma_decoder decoder;
|
|
15
|
-
ma_decoder_config config = ma_decoder_config_init(
|
|
16
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_s16, numChannels_, static_cast<int>(sampleRate_));
|
|
16
17
|
ma_result result = ma_decoder_init_file(path.c_str(), &config, &decoder);
|
|
17
18
|
if (result != MA_SUCCESS) {
|
|
18
19
|
NSLog(@"Failed to initialize decoder for file: %s", path.c_str());
|
|
@@ -25,29 +26,27 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &pa
|
|
|
25
26
|
ma_uint64 totalFrameCount;
|
|
26
27
|
ma_decoder_get_length_in_pcm_frames(&decoder, &totalFrameCount);
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
auto *buffer = new float[totalFrameCount * 2];
|
|
29
|
+
std::vector<int16_t> buffer(totalFrameCount * numChannels_);
|
|
30
30
|
|
|
31
31
|
ma_uint64 framesDecoded;
|
|
32
|
-
ma_decoder_read_pcm_frames(&decoder, buffer, totalFrameCount, &framesDecoded);
|
|
32
|
+
ma_decoder_read_pcm_frames(&decoder, buffer.data(), totalFrameCount, &framesDecoded);
|
|
33
33
|
if (framesDecoded == 0) {
|
|
34
34
|
NSLog(@"Failed to decode");
|
|
35
35
|
|
|
36
|
-
delete[] buffer;
|
|
37
36
|
ma_decoder_uninit(&decoder);
|
|
38
|
-
|
|
39
37
|
return nullptr;
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
auto outputFrames = buffer.size() / numChannels_;
|
|
41
|
+
auto audioBus = std::make_shared<AudioBus>(outputFrames, numChannels_, sampleRate_);
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
for (int i = 0; i < numChannels_; ++i) {
|
|
44
|
+
auto channelData = audioBus->getChannel(i)->getData();
|
|
45
|
+
for (int j = 0; j < outputFrames; ++j) {
|
|
46
|
+
channelData[j] = int16ToFloat(buffer[j * numChannels_ + i]);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
delete[] buffer;
|
|
51
50
|
ma_decoder_uninit(&decoder);
|
|
52
51
|
|
|
53
52
|
return audioBus;
|
|
@@ -56,7 +55,7 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithFilePath(const std::string &pa
|
|
|
56
55
|
std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size) const
|
|
57
56
|
{
|
|
58
57
|
ma_decoder decoder;
|
|
59
|
-
ma_decoder_config config = ma_decoder_config_init(
|
|
58
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_s16, numChannels_, static_cast<int>(sampleRate_));
|
|
60
59
|
ma_result result = ma_decoder_init_memory(data, size, &config, &decoder);
|
|
61
60
|
if (result != MA_SUCCESS) {
|
|
62
61
|
NSLog(@"Failed to initialize decoder for memory block");
|
|
@@ -69,50 +68,57 @@ std::shared_ptr<AudioBus> AudioDecoder::decodeWithMemoryBlock(const void *data,
|
|
|
69
68
|
ma_uint64 totalFrameCount;
|
|
70
69
|
ma_decoder_get_length_in_pcm_frames(&decoder, &totalFrameCount);
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
auto *buffer = new float[totalFrameCount * 2];
|
|
71
|
+
std::vector<int16_t> buffer(totalFrameCount * numChannels_);
|
|
74
72
|
|
|
75
73
|
ma_uint64 framesDecoded;
|
|
76
|
-
ma_decoder_read_pcm_frames(&decoder, buffer, totalFrameCount, &framesDecoded);
|
|
74
|
+
ma_decoder_read_pcm_frames(&decoder, buffer.data(), totalFrameCount, &framesDecoded);
|
|
75
|
+
|
|
77
76
|
if (framesDecoded == 0) {
|
|
78
77
|
NSLog(@"Failed to decode");
|
|
79
78
|
|
|
80
|
-
delete[] buffer;
|
|
81
79
|
ma_decoder_uninit(&decoder);
|
|
82
|
-
|
|
83
80
|
return nullptr;
|
|
84
81
|
}
|
|
85
82
|
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
auto outputFrames = buffer.size() / numChannels_;
|
|
84
|
+
auto audioBus = std::make_shared<AudioBus>(outputFrames, numChannels_, sampleRate_);
|
|
88
85
|
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
for (int i = 0; i < numChannels_; ++i) {
|
|
87
|
+
auto channelData = audioBus->getChannel(i)->getData();
|
|
88
|
+
for (int j = 0; j < outputFrames; ++j) {
|
|
89
|
+
channelData[j] = int16ToFloat(buffer[j * numChannels_ + i]);
|
|
91
90
|
}
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
delete[] buffer;
|
|
95
93
|
ma_decoder_uninit(&decoder);
|
|
96
94
|
|
|
97
95
|
return audioBus;
|
|
98
96
|
}
|
|
99
97
|
|
|
100
|
-
std::shared_ptr<AudioBus> AudioDecoder::decodeWithPCMInBase64(const std::string &data) const
|
|
98
|
+
std::shared_ptr<AudioBus> AudioDecoder::decodeWithPCMInBase64(const std::string &data, float playbackSpeed) const
|
|
101
99
|
{
|
|
102
100
|
auto decodedData = base64_decode(data, false);
|
|
103
101
|
|
|
104
102
|
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
105
|
-
size_t
|
|
106
|
-
|
|
107
|
-
auto audioBus = std::make_shared<AudioBus>(frameCount, 1, sampleRate_);
|
|
108
|
-
auto channelData = audioBus->getChannel(0)->getData();
|
|
103
|
+
size_t framesDecoded = decodedData.size() / 2;
|
|
109
104
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
std::vector<int16_t> buffer(framesDecoded);
|
|
106
|
+
for (size_t i = 0; i < framesDecoded; ++i) {
|
|
107
|
+
buffer[i] = static_cast<int16_t>((uint8Data[i * 2 + 1] << 8) | uint8Data[i * 2]);
|
|
113
108
|
}
|
|
114
109
|
|
|
115
|
-
|
|
110
|
+
changePlaybackSpeedIfNeeded(buffer, framesDecoded, 1, playbackSpeed);
|
|
111
|
+
auto outputFrames = buffer.size();
|
|
112
|
+
|
|
113
|
+
auto audioBus = std::make_shared<AudioBus>(outputFrames, numChannels_, sampleRate_);
|
|
114
|
+
auto leftChannelData = audioBus->getChannel(0)->getData();
|
|
115
|
+
auto rightChannelData = audioBus->getChannel(1)->getData();
|
|
116
|
+
|
|
117
|
+
for (size_t i = 0; i < outputFrames; ++i) {
|
|
118
|
+
auto sample = int16ToFloat(buffer[i]);
|
|
119
|
+
leftChannelData[i] = sample;
|
|
120
|
+
rightChannelData[i] = sample;
|
|
121
|
+
}
|
|
116
122
|
|
|
117
123
|
return audioBus;
|
|
118
124
|
}
|
|
@@ -8,8 +8,11 @@
|
|
|
8
8
|
|
|
9
9
|
namespace audioapi {
|
|
10
10
|
|
|
11
|
-
IOSAudioPlayer::IOSAudioPlayer(
|
|
12
|
-
|
|
11
|
+
IOSAudioPlayer::IOSAudioPlayer(
|
|
12
|
+
const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
|
|
13
|
+
float sampleRate,
|
|
14
|
+
int channelCount)
|
|
15
|
+
: renderAudio_(renderAudio), channelCount_(channelCount), audioBus_(0), isRunning_(false)
|
|
13
16
|
{
|
|
14
17
|
RenderAudioBlock renderAudioBlock = ^(AudioBufferList *outputData, int numFrames) {
|
|
15
18
|
int processedFrames = 0;
|
|
@@ -26,7 +26,11 @@
|
|
|
26
26
|
options:(NSArray *)options
|
|
27
27
|
allowHaptics:(BOOL)allowHaptics;
|
|
28
28
|
- (bool)setActive:(bool)active;
|
|
29
|
+
|
|
29
30
|
- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
|
|
30
31
|
- (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
|
|
31
32
|
|
|
33
|
+
- (void)getDevicesInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;
|
|
34
|
+
- (NSArray<NSDictionary *> *)parseDeviceList:(NSArray<AVAudioSessionPortDescription *> *)devices;
|
|
35
|
+
|
|
32
36
|
@end
|
|
@@ -292,4 +292,30 @@
|
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
|
|
295
|
+
- (void)getDevicesInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
|
|
296
|
+
{
|
|
297
|
+
NSMutableDictionary *devicesInfo = [[NSMutableDictionary alloc] init];
|
|
298
|
+
|
|
299
|
+
[devicesInfo setValue:[self parseDeviceList:[self.audioSession availableInputs]] forKey:@"availableInputs"];
|
|
300
|
+
[devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] inputs]] forKey:@"currentInputs"];
|
|
301
|
+
[devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]] forKey:@"availableOutputs"];
|
|
302
|
+
[devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]] forKey:@"currentOutputs"];
|
|
303
|
+
|
|
304
|
+
resolve(devicesInfo);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
- (NSArray<NSDictionary *> *)parseDeviceList:(NSArray<AVAudioSessionPortDescription *> *)devices
|
|
308
|
+
{
|
|
309
|
+
NSMutableArray<NSDictionary *> *deviceList = [[NSMutableArray alloc] init];
|
|
310
|
+
|
|
311
|
+
for (AVAudioSessionPortDescription *device in devices) {
|
|
312
|
+
[deviceList addObject:@{
|
|
313
|
+
@"name" : device.portName,
|
|
314
|
+
@"category" : device.portType,
|
|
315
|
+
}];
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return deviceList;
|
|
319
|
+
}
|
|
320
|
+
|
|
295
321
|
@end
|
|
@@ -189,8 +189,10 @@
|
|
|
189
189
|
} else if ([name isEqual:@"remotePreviousTrack"]) {
|
|
190
190
|
[self enableCommand:remoteCenter.previousTrackCommand withSelector:@selector(onPreviousTrack:) enabled:enabled];
|
|
191
191
|
} else if ([name isEqual:@"remoteSkipForward"]) {
|
|
192
|
+
remoteCenter.skipForwardCommand.preferredIntervals = @[ @15 ];
|
|
192
193
|
[self enableCommand:remoteCenter.skipForwardCommand withSelector:@selector(onSkipForward:) enabled:enabled];
|
|
193
194
|
} else if ([name isEqual:@"remoteSkipBackward"]) {
|
|
195
|
+
remoteCenter.skipBackwardCommand.preferredIntervals = @[ @15 ];
|
|
194
196
|
[self enableCommand:remoteCenter.skipBackwardCommand withSelector:@selector(onSkipBackward:) enabled:enabled];
|
|
195
197
|
} else if ([name isEqual:@"remoteSeekForward"]) {
|
|
196
198
|
[self enableCommand:remoteCenter.seekForwardCommand withSelector:@selector(onSeekForward:) enabled:enabled];
|
|
@@ -18,10 +18,10 @@ class AudioBufferSourceNode extends _AudioBufferBaseSourceNode.default {
|
|
|
18
18
|
}
|
|
19
19
|
set buffer(buffer) {
|
|
20
20
|
if (!buffer) {
|
|
21
|
-
this.node.setBuffer(
|
|
21
|
+
this.node.setBuffer(null);
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
this.node.setBuffer(
|
|
24
|
+
this.node.setBuffer(buffer.buffer);
|
|
25
25
|
}
|
|
26
26
|
get loopSkip() {
|
|
27
27
|
return this.node.loopSkip;
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CAAC,IAAI,CAAC;MACrD;IACF;IAEC,IAAI,CAACF,IAAI,CAA4BE,SAAS,CAACH,MAAM,CAACA,MAAM,CAAC;EAChE;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":[]}
|
|
@@ -30,12 +30,12 @@ class AudioScheduledSourceNode extends _AudioNode.default {
|
|
|
30
30
|
}
|
|
31
31
|
this.node.stop(when);
|
|
32
32
|
}
|
|
33
|
-
get
|
|
33
|
+
get onEnded() {
|
|
34
34
|
return this.onEndedCallback;
|
|
35
35
|
}
|
|
36
|
-
set
|
|
36
|
+
set onEnded(callback) {
|
|
37
37
|
if (!callback) {
|
|
38
|
-
this.node.
|
|
38
|
+
this.node.onEnded = '0';
|
|
39
39
|
this.onendedSubscription?.remove();
|
|
40
40
|
this.onendedSubscription = undefined;
|
|
41
41
|
this.onEndedCallback = undefined;
|
|
@@ -43,7 +43,7 @@ class AudioScheduledSourceNode extends _AudioNode.default {
|
|
|
43
43
|
}
|
|
44
44
|
this.onEndedCallback = callback;
|
|
45
45
|
this.onendedSubscription = this.audioEventEmitter.addAudioEventListener('ended', callback);
|
|
46
|
-
this.node.
|
|
46
|
+
this.node.onEnded = this.onendedSubscription.subscriptionId;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
exports.default = AudioScheduledSourceNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","
|
|
1
|
+
{"version":3,"names":["_AudioNode","_interopRequireDefault","require","_errors","_events","e","__esModule","default","AudioScheduledSourceNode","AudioNode","hasBeenStarted","audioEventEmitter","AudioEventEmitter","global","start","when","RangeError","InvalidStateError","node","stop","onEnded","onEndedCallback","callback","onendedSubscription","remove","undefined","addAudioEventListener","subscriptionId","exports"],"sourceRoot":"../../../src","sources":["core/AudioScheduledSourceNode.ts"],"mappings":";;;;;;AACA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AAAsE,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,wBAAwB,SAASC,kBAAS,CAAC;EACpDC,cAAc,GAAY,KAAK;EACtBC,iBAAiB,GAAG,IAAIC,yBAAiB,CAC1DC,MAAM,CAACD,iBACT,CAAC;EAKME,KAAKA,CAACC,IAAY,GAAG,CAAC,EAAQ;IACnC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,IAAI,CAACL,cAAc,EAAE;MACvB,MAAM,IAAIO,yBAAiB,CAAC,kCAAkC,CAAC;IACjE;IAEA,IAAI,CAACP,cAAc,GAAG,IAAI;IACzB,IAAI,CAACQ,IAAI,CAA+BJ,KAAK,CAACC,IAAI,CAAC;EACtD;EAEOI,IAAIA,CAACJ,IAAY,GAAG,CAAC,EAAQ;IAClC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZ,MAAM,IAAIC,kBAAU,CAClB,8CAA8CD,IAAI,EACpD,CAAC;IACH;IAEA,IAAI,CAAC,IAAI,CAACL,cAAc,EAAE;MACxB,MAAM,IAAIO,yBAAiB,CACzB,8CACF,CAAC;IACH;IAEC,IAAI,CAACC,IAAI,CAA+BC,IAAI,CAACJ,IAAI,CAAC;EACrD;EAEA,IAAWK,OAAOA,CAAA,EAAkD;IAClE,OAAO,IAAI,CAACC,eAAe;EAC7B;EAEA,IAAWD,OAAOA,CAACE,QAAkD,EAAE;IACrE,IAAI,CAACA,QAAQ,EAAE;MACZ,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAAG,GAAG;MACtD,IAAI,CAACG,mBAAmB,EAAEC,MAAM,CAAC,CAAC;MAClC,IAAI,CAACD,mBAAmB,GAAGE,SAAS;MACpC,IAAI,CAACJ,eAAe,GAAGI,SAAS;MAChC;IACF;IAEA,IAAI,CAACJ,eAAe,GAAGC,QAAQ;IAC/B,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACZ,iBAAiB,CAACe,qBAAqB,CACrE,OAAO,EACPJ,QACF,CAAC;IAEA,IAAI,CAACJ,IAAI,CAA+BE,OAAO,GAC9C,IAAI,CAACG,mBAAmB,CAACI,cAAc;EAC3C;AACF;AAACC,OAAA,CAAArB,OAAA,GAAAC,wBAAA","ignoreList":[]}
|
|
@@ -73,6 +73,8 @@ class BaseAudioContext {
|
|
|
73
73
|
createAnalyser() {
|
|
74
74
|
return new _AnalyserNode.default(this, this.context.createAnalyser());
|
|
75
75
|
}
|
|
76
|
+
|
|
77
|
+
/** Decodes audio data from a local file path. */
|
|
76
78
|
async decodeAudioDataSource(sourcePath) {
|
|
77
79
|
// Remove the file:// prefix if it exists
|
|
78
80
|
if (sourcePath.startsWith('file://')) {
|
|
@@ -80,15 +82,14 @@ class BaseAudioContext {
|
|
|
80
82
|
}
|
|
81
83
|
return new _AudioBuffer.default(await this.context.decodeAudioDataSource(sourcePath));
|
|
82
84
|
}
|
|
83
|
-
async decodeAudioData(data) {
|
|
84
|
-
// pcm data in base64
|
|
85
|
-
if (typeof data === 'string') {
|
|
86
|
-
return new _AudioBuffer.default(await this.context.decodePCMAudioDataInBase64(data));
|
|
87
|
-
}
|
|
88
85
|
|
|
89
|
-
|
|
86
|
+
/** Decodes audio data from an ArrayBuffer. */
|
|
87
|
+
async decodeAudioData(data) {
|
|
90
88
|
return new _AudioBuffer.default(await this.context.decodeAudioData(new Uint8Array(data)));
|
|
91
89
|
}
|
|
90
|
+
async decodePCMInBase64Data(base64, playbackRate = 1.0) {
|
|
91
|
+
return new _AudioBuffer.default(await this.context.decodePCMAudioDataInBase64(base64, playbackRate));
|
|
92
|
+
}
|
|
92
93
|
}
|
|
93
94
|
exports.default = BaseAudioContext;
|
|
94
95
|
//# sourceMappingURL=BaseAudioContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_CustomProcessorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_AudioBufferQueueSourceNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createCustomProcessor","identifier","CustomProcessorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","data","
|
|
1
|
+
{"version":3,"names":["_AudioDestinationNode","_interopRequireDefault","require","_OscillatorNode","_CustomProcessorNode","_GainNode","_StereoPannerNode","_BiquadFilterNode","_AudioBufferSourceNode","_AudioBuffer","_PeriodicWave","_AnalyserNode","_AudioBufferQueueSourceNode","_errors","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","createOscillator","OscillatorNode","createCustomProcessor","identifier","CustomProcessorNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","NotSupportedError","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","decodeAudioDataSource","sourcePath","startsWith","replace","decodeAudioData","data","Uint8Array","decodePCMInBase64Data","base64","playbackRate","decodePCMAudioDataInBase64","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@ const pkg = require('react-native-audio-api/package.json');
|
|
|
9
9
|
const withDefaultOptions = options => {
|
|
10
10
|
return {
|
|
11
11
|
iosBackgroundMode: true,
|
|
12
|
-
androidPermissions: ['android.permission.FOREGROUND_SERVICE', 'android.permission.
|
|
12
|
+
androidPermissions: ['android.permission.FOREGROUND_SERVICE', 'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK'],
|
|
13
13
|
androidForegroundService: true,
|
|
14
14
|
androidFSTypes: ['mediaPlayback'],
|
|
15
15
|
...options
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_configPlugins","require","pkg","withDefaultOptions","options","iosBackgroundMode","androidPermissions","androidForegroundService","androidFSTypes","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","AndroidConfig","Permissions","withPermissions","withForegroundService","withAndroidManifest","mod","manifest","mainApplication","Manifest","getMainApplicationOrThrow","SFTypes","join","serviceElement","$","intentFilter","service","push","withAudioAPI","optionsIn","_default","exports","default","createRunOncePlugin","name","version"],"sourceRoot":"../../../src","sources":["plugin/withAudioAPI.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAOA,MAAMC,GAAG,GAAGD,OAAO,CAAC,qCAAqC,CAAC;AAS1D,MAAME,kBAAkB,GAAIC,OAAyB,IAAc;EACjE,OAAO;IACLC,iBAAiB,EAAE,IAAI;IACvBC,kBAAkB,EAAE,CAClB,uCAAuC,EACvC,
|
|
1
|
+
{"version":3,"names":["_configPlugins","require","pkg","withDefaultOptions","options","iosBackgroundMode","androidPermissions","androidForegroundService","androidFSTypes","withBackgroundAudio","config","withInfoPlist","iosConfig","modResults","UIBackgroundModes","Array","from","Set","withAndroidPermissions","AndroidConfig","Permissions","withPermissions","withForegroundService","withAndroidManifest","mod","manifest","mainApplication","Manifest","getMainApplicationOrThrow","SFTypes","join","serviceElement","$","intentFilter","service","push","withAudioAPI","optionsIn","_default","exports","default","createRunOncePlugin","name","version"],"sourceRoot":"../../../src","sources":["plugin/withAudioAPI.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAOA,MAAMC,GAAG,GAAGD,OAAO,CAAC,qCAAqC,CAAC;AAS1D,MAAME,kBAAkB,GAAIC,OAAyB,IAAc;EACjE,OAAO;IACLC,iBAAiB,EAAE,IAAI;IACvBC,kBAAkB,EAAE,CAClB,uCAAuC,EACvC,sDAAsD,CACvD;IACDC,wBAAwB,EAAE,IAAI;IAC9BC,cAAc,EAAE,CAAC,eAAe,CAAC;IACjC,GAAGJ;EACL,CAAC;AACH,CAAC;AAED,MAAMK,mBAAiC,GAAIC,MAAM,IAAK;EACpD,OAAO,IAAAC,4BAAa,EAACD,MAAM,EAAGE,SAAS,IAAK;IAC1CA,SAAS,CAACC,UAAU,CAACC,iBAAiB,GAAG,CACvC,GAAGC,KAAK,CAACC,IAAI,CACX,IAAIC,GAAG,CAAC,CAAC,IAAIL,SAAS,CAACC,UAAU,CAACC,iBAAiB,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CACtE,CAAC,CACF;IAED,OAAOF,SAAS;EAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAMM,sBAA6C,GAAGA,CACpDR,MAAM,EACN;EAAEJ;AAA4B,CAAC,KAC5B;EACH,OAAOa,4BAAa,CAACC,WAAW,CAACC,eAAe,CAACX,MAAM,EAAEJ,kBAAkB,CAAC;AAC9E,CAAC;AAED,MAAMgB,qBAA4C,GAAGA,CACnDZ,MAAM,EACN;EAAEF;AAAwB,CAAC,KACxB;EACH,OAAO,IAAAe,kCAAmB,EAACb,MAAM,EAAGc,GAAG,IAAK;IAC1C,MAAMC,QAAQ,GAAGD,GAAG,CAACX,UAAU;IAC/B,MAAMa,eAAe,GACnBP,4BAAa,CAACQ,QAAQ,CAACC,yBAAyB,CAACH,QAAQ,CAAC;IAE5D,MAAMI,OAAO,GAAGrB,cAAc,CAACsB,IAAI,CAAC,GAAG,CAAC;IAExC,MAAMC,cAAc,GAAG;MACrBC,CAAC,EAAE;QACD,cAAc,EACZ,4EAA4E;QAC9E,sBAAsB,EAAE,MAAM;QAC9B,+BAA+B,EAAEH;MACnC,CAAC;MACDI,YAAY,EAAE;IAChB,CAAC;IAED,IAAI,CAACP,eAAe,CAACQ,OAAO,EAAE;MAC5BR,eAAe,CAACQ,OAAO,GAAG,EAAE;IAC9B;IAEAR,eAAe,CAACQ,OAAO,CAACC,IAAI,CAACJ,cAAc,CAAC;IAE5C,OAAOP,GAAG;EACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAMY,YAAmC,GAAGA,CAAC1B,MAAM,EAAE2B,SAAS,KAAK;EACjE,MAAMjC,OAAO,GAAGD,kBAAkB,CAACkC,SAAS,IAAI,CAAC,CAAC,CAAC;EAEnD,IAAIjC,OAAO,CAACC,iBAAiB,EAAE;IAC7BK,MAAM,GAAGD,mBAAmB,CAACC,MAAM,CAAC;EACtC;EAEAA,MAAM,GAAGQ,sBAAsB,CAACR,MAAM,EAAEN,OAAO,CAAC;EAEhD,IAAIA,OAAO,CAACG,wBAAwB,EAAE;IACpCG,MAAM,GAAGY,qBAAqB,CAACZ,MAAM,EAAEN,OAAO,CAAC;EACjD;EAEA,OAAOM,MAAM;AACf,CAAC;AAAC,IAAA4B,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa,IAAAC,kCAAmB,EAACL,YAAY,EAAElC,GAAG,CAACwC,IAAI,EAAExC,GAAG,CAACyC,OAAO,CAAC","ignoreList":[]}
|