react-native-audio-api 0.10.0-nightly-2d11b56-20251021 → 0.10.0-nightly-325e87a-20251023
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/RNAudioAPI.podspec +3 -0
- package/android/build.gradle +26 -2
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +29 -1
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +20 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +69 -32
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +37 -1
- package/common/cpp/audioapi/core/utils/Constants.h +2 -1
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +0 -10
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +2 -3
- package/common/cpp/test/CMakeLists.txt +3 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +389 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +64 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +284 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +40 -0
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +2 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/system/AudioSessionManager.mm +9 -0
- package/lib/commonjs/core/AudioContext.js +1 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +16 -25
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/utils/index.js +19 -4
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +17 -26
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/OfflineAudioContext.js +2 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/utils/index.js +15 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +4 -1
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/AudioContext.ts +3 -2
- package/src/core/BaseAudioContext.ts +44 -60
- package/src/core/OfflineAudioContext.ts +2 -2
- package/src/utils/index.ts +22 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#include <test/src/biquad/BiquadFilterChromium.h>
|
|
2
|
+
#include <test/src/biquad/BiquadFilterTest.h>
|
|
3
|
+
|
|
4
|
+
namespace audioapi {
|
|
5
|
+
|
|
6
|
+
void BiquadFilterTest::expectCoefficientsNear(
|
|
7
|
+
const std::shared_ptr<BiquadFilterNode> &biquadNode,
|
|
8
|
+
const BiquadCoefficients &expected) {
|
|
9
|
+
EXPECT_NEAR(biquadNode->b0_, expected.b0, tolerance);
|
|
10
|
+
EXPECT_NEAR(biquadNode->b1_, expected.b1, tolerance);
|
|
11
|
+
EXPECT_NEAR(biquadNode->b2_, expected.b2, tolerance);
|
|
12
|
+
EXPECT_NEAR(biquadNode->a1_, expected.a1, tolerance);
|
|
13
|
+
EXPECT_NEAR(biquadNode->a2_, expected.a2, tolerance);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
void BiquadFilterTest::testLowpass(float frequency, float Q) {
|
|
17
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
18
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
19
|
+
|
|
20
|
+
node->setLowpassCoefficients(normalizedFrequency, Q);
|
|
21
|
+
expectCoefficientsNear(
|
|
22
|
+
node, calculateLowpassCoefficients(normalizedFrequency, Q));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void BiquadFilterTest::testHighpass(float frequency, float Q) {
|
|
26
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
27
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
28
|
+
|
|
29
|
+
node->setHighpassCoefficients(normalizedFrequency, Q);
|
|
30
|
+
expectCoefficientsNear(
|
|
31
|
+
node, calculateHighpassCoefficients(normalizedFrequency, Q));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void BiquadFilterTest::testBandpass(float frequency, float Q) {
|
|
35
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
36
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
37
|
+
|
|
38
|
+
node->setBandpassCoefficients(normalizedFrequency, Q);
|
|
39
|
+
expectCoefficientsNear(
|
|
40
|
+
node, calculateBandpassCoefficients(normalizedFrequency, Q));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void BiquadFilterTest::testNotch(float frequency, float Q) {
|
|
44
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
45
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
46
|
+
|
|
47
|
+
node->setNotchCoefficients(normalizedFrequency, Q);
|
|
48
|
+
expectCoefficientsNear(
|
|
49
|
+
node, calculateNotchCoefficients(normalizedFrequency, Q));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
void BiquadFilterTest::testAllpass(float frequency, float Q) {
|
|
53
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
54
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
55
|
+
|
|
56
|
+
node->setAllpassCoefficients(normalizedFrequency, Q);
|
|
57
|
+
expectCoefficientsNear(
|
|
58
|
+
node, calculateAllpassCoefficients(normalizedFrequency, Q));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
|
|
62
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
63
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
64
|
+
|
|
65
|
+
node->setPeakingCoefficients(normalizedFrequency, Q, gain);
|
|
66
|
+
expectCoefficientsNear(
|
|
67
|
+
node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void BiquadFilterTest::testLowshelf(float frequency, float gain) {
|
|
71
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
72
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
73
|
+
|
|
74
|
+
node->setLowshelfCoefficients(normalizedFrequency, gain);
|
|
75
|
+
expectCoefficientsNear(
|
|
76
|
+
node, calculateLowshelfCoefficients(normalizedFrequency, gain));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void BiquadFilterTest::testHighshelf(float frequency, float gain) {
|
|
80
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
81
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
82
|
+
|
|
83
|
+
node->setHighshelfCoefficients(normalizedFrequency, gain);
|
|
84
|
+
expectCoefficientsNear(
|
|
85
|
+
node, calculateHighshelfCoefficients(normalizedFrequency, gain));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
89
|
+
Frequencies,
|
|
90
|
+
BiquadFilterFrequencyTest,
|
|
91
|
+
::testing::Values(
|
|
92
|
+
0.0f, // 0 Hz - the filter should block all input signal
|
|
93
|
+
10.0f, // very low frequency
|
|
94
|
+
350.0f, // default
|
|
95
|
+
nyquistFrequency - 0.0001f, // frequency near Nyquist
|
|
96
|
+
nyquistFrequency)); // maximal frequency
|
|
97
|
+
|
|
98
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
99
|
+
QEdgeCases,
|
|
100
|
+
BiquadFilterQTestLowpassHighpass,
|
|
101
|
+
::testing::Values(
|
|
102
|
+
-770.63678f, // min value for lowpass and highpass
|
|
103
|
+
0.0f, // default
|
|
104
|
+
770.63678f)); // max value for lowpass and highpass
|
|
105
|
+
|
|
106
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
107
|
+
QEdgeCases,
|
|
108
|
+
BiquadFilterQTestRestTypes, // bandpass, notch, allpass, peaking
|
|
109
|
+
::testing::Values(
|
|
110
|
+
0.0f, // default and min value
|
|
111
|
+
MOST_POSITIVE_SINGLE_FLOAT));
|
|
112
|
+
|
|
113
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
114
|
+
GainEdgeCases,
|
|
115
|
+
BiquadFilterGainTest,
|
|
116
|
+
::testing::Values(
|
|
117
|
+
-40.0f,
|
|
118
|
+
0.0f, // default
|
|
119
|
+
40.0f));
|
|
120
|
+
|
|
121
|
+
TEST_P(BiquadFilterFrequencyTest, SetLowpassCoefficients) {
|
|
122
|
+
float frequency = GetParam();
|
|
123
|
+
float Q = 1.0f;
|
|
124
|
+
testLowpass(frequency, Q);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
TEST_P(BiquadFilterFrequencyTest, SetHighpassCoefficients) {
|
|
128
|
+
float frequency = GetParam();
|
|
129
|
+
float Q = 1.0f;
|
|
130
|
+
testHighpass(frequency, Q);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
TEST_P(BiquadFilterFrequencyTest, SetBandpassCoefficients) {
|
|
134
|
+
float frequency = GetParam();
|
|
135
|
+
float Q = 1.0f;
|
|
136
|
+
testBandpass(frequency, Q);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
TEST_P(BiquadFilterFrequencyTest, SetNotchCoefficients) {
|
|
140
|
+
float frequency = GetParam();
|
|
141
|
+
float Q = 1.0f;
|
|
142
|
+
testNotch(frequency, Q);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
TEST_P(BiquadFilterFrequencyTest, SetAllpassCoefficients) {
|
|
146
|
+
float frequency = GetParam();
|
|
147
|
+
float Q = 1.0f;
|
|
148
|
+
testAllpass(frequency, Q);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
TEST_P(BiquadFilterFrequencyTest, SetPeakingCoefficients) {
|
|
152
|
+
float frequency = GetParam();
|
|
153
|
+
float Q = 1.0f;
|
|
154
|
+
float gain = 2.0f;
|
|
155
|
+
testPeaking(frequency, Q, gain);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
TEST_P(BiquadFilterFrequencyTest, SetLowshelfCoefficients) {
|
|
159
|
+
float frequency = GetParam();
|
|
160
|
+
float gain = 2.0f;
|
|
161
|
+
testLowshelf(frequency, gain);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
TEST_P(BiquadFilterFrequencyTest, SetHighshelfCoefficients) {
|
|
165
|
+
float frequency = GetParam();
|
|
166
|
+
float gain = 2.0f;
|
|
167
|
+
testHighshelf(frequency, gain);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
TEST_P(BiquadFilterQTestLowpassHighpass, SetLowpassCoefficients) {
|
|
171
|
+
float frequency = 1000.0f;
|
|
172
|
+
float Q = GetParam();
|
|
173
|
+
testLowpass(frequency, Q);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
TEST_P(BiquadFilterQTestLowpassHighpass, SetHighpassCoefficients) {
|
|
177
|
+
float frequency = 1000.0f;
|
|
178
|
+
float Q = GetParam();
|
|
179
|
+
testHighpass(frequency, Q);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
TEST_P(BiquadFilterQTestRestTypes, SetBandpassCoefficients) {
|
|
183
|
+
float frequency = 1000.0f;
|
|
184
|
+
float Q = GetParam();
|
|
185
|
+
testBandpass(frequency, Q);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
TEST_P(BiquadFilterQTestRestTypes, SetNotchCoefficients) {
|
|
189
|
+
float frequency = 1000.0f;
|
|
190
|
+
float Q = GetParam();
|
|
191
|
+
testNotch(frequency, Q);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
TEST_P(BiquadFilterQTestRestTypes, SetAllpassCoefficients) {
|
|
195
|
+
float frequency = 1000.0f;
|
|
196
|
+
float Q = GetParam();
|
|
197
|
+
testAllpass(frequency, Q);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
TEST_P(BiquadFilterQTestRestTypes, SetPeakingCoefficients) {
|
|
201
|
+
float frequency = 1000.0f;
|
|
202
|
+
float Q = GetParam();
|
|
203
|
+
float gain = 2.0f;
|
|
204
|
+
testPeaking(frequency, Q, gain);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
TEST_P(BiquadFilterGainTest, SetPeakingCoefficients) {
|
|
208
|
+
float frequency = 1000.0f;
|
|
209
|
+
float Q = 1.0f;
|
|
210
|
+
float gain = GetParam();
|
|
211
|
+
testPeaking(frequency, Q, gain);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
TEST_P(BiquadFilterGainTest, SetLowshelfCoefficients) {
|
|
215
|
+
float frequency = 1000.0f;
|
|
216
|
+
float gain = GetParam();
|
|
217
|
+
testLowshelf(frequency, gain);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
TEST_P(BiquadFilterGainTest, SetHighshelfCoefficients) {
|
|
221
|
+
float frequency = 1000.0f;
|
|
222
|
+
float gain = GetParam();
|
|
223
|
+
testHighshelf(frequency, gain);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
TEST_F(BiquadFilterTest, GetFrequencyResponse) {
|
|
227
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
228
|
+
|
|
229
|
+
float frequency = 1000.0f;
|
|
230
|
+
float Q = 1.0f;
|
|
231
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
232
|
+
|
|
233
|
+
node->setLowpassCoefficients(normalizedFrequency, Q);
|
|
234
|
+
auto coeffs = calculateLowpassCoefficients(normalizedFrequency, Q);
|
|
235
|
+
|
|
236
|
+
std::vector<float> TestFrequencies = {
|
|
237
|
+
-0.0001f,
|
|
238
|
+
0.0f,
|
|
239
|
+
0.0001f,
|
|
240
|
+
0.25f * nyquistFrequency,
|
|
241
|
+
0.5f * nyquistFrequency,
|
|
242
|
+
0.75f * nyquistFrequency,
|
|
243
|
+
nyquistFrequency - 0.0001f,
|
|
244
|
+
nyquistFrequency,
|
|
245
|
+
nyquistFrequency + 0.0001f};
|
|
246
|
+
|
|
247
|
+
std::vector<float> magResponseNode(TestFrequencies.size());
|
|
248
|
+
std::vector<float> phaseResponseNode(TestFrequencies.size());
|
|
249
|
+
std::vector<float> magResponseExpected(TestFrequencies.size());
|
|
250
|
+
std::vector<float> phaseResponseExpected(TestFrequencies.size());
|
|
251
|
+
|
|
252
|
+
node->getFrequencyResponse(
|
|
253
|
+
TestFrequencies.data(),
|
|
254
|
+
magResponseNode.data(),
|
|
255
|
+
phaseResponseNode.data(),
|
|
256
|
+
TestFrequencies.size());
|
|
257
|
+
getFrequencyResponse(
|
|
258
|
+
coeffs,
|
|
259
|
+
TestFrequencies,
|
|
260
|
+
magResponseExpected,
|
|
261
|
+
phaseResponseExpected,
|
|
262
|
+
nyquistFrequency);
|
|
263
|
+
|
|
264
|
+
for (size_t i = 0; i < TestFrequencies.size(); ++i) {
|
|
265
|
+
float f = TestFrequencies[i];
|
|
266
|
+
if (std::isnan(magResponseExpected[i])) {
|
|
267
|
+
EXPECT_TRUE(std::isnan(magResponseNode[i]))
|
|
268
|
+
<< "Expected NaN at frequency " << f;
|
|
269
|
+
} else {
|
|
270
|
+
EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)
|
|
271
|
+
<< "Magnitude mismatch at " << f << " Hz";
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (std::isnan(phaseResponseExpected[i])) {
|
|
275
|
+
EXPECT_TRUE(std::isnan(phaseResponseNode[i]))
|
|
276
|
+
<< "Expected NaN at frequency " << f;
|
|
277
|
+
} else {
|
|
278
|
+
EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)
|
|
279
|
+
<< "Phase mismatch at " << f << " Hz";
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
4
|
+
#include <audioapi/core/effects/BiquadFilterNode.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
6
|
+
#include <gtest/gtest.h>
|
|
7
|
+
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
static constexpr int sampleRate = 44100;
|
|
11
|
+
static constexpr float nyquistFrequency = sampleRate / 2.0f;
|
|
12
|
+
static constexpr float tolerance = 0.0001f;
|
|
13
|
+
|
|
14
|
+
namespace audioapi {
|
|
15
|
+
class BiquadFilterTest : public ::testing::Test {
|
|
16
|
+
protected:
|
|
17
|
+
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
|
|
18
|
+
std::unique_ptr<OfflineAudioContext> context;
|
|
19
|
+
|
|
20
|
+
void SetUp() override {
|
|
21
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
22
|
+
context = std::make_unique<OfflineAudioContext>(2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void expectCoefficientsNear(const std::shared_ptr<BiquadFilterNode> &node, const BiquadCoefficients &expected);
|
|
26
|
+
void testLowpass(float frequency, float Q);
|
|
27
|
+
void testHighpass(float frequency, float Q);
|
|
28
|
+
void testBandpass(float frequency, float Q);
|
|
29
|
+
void testNotch(float frequency, float Q);
|
|
30
|
+
void testAllpass(float frequency, float Q);
|
|
31
|
+
void testPeaking(float frequency, float Q, float gain);
|
|
32
|
+
void testLowshelf(float frequency, float gain);
|
|
33
|
+
void testHighshelf(float frequency, float gain);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
37
|
+
class BiquadFilterQTestRestTypes : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
38
|
+
class BiquadFilterFrequencyTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
39
|
+
class BiquadFilterGainTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
40
|
+
} // namespace audioapi
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
2
2
|
#import <React/RCTCallInvokerModule.h>
|
|
3
|
+
#import <React/RCTInvalidating.h>
|
|
3
4
|
#import <rnaudioapi/rnaudioapi.h>
|
|
4
5
|
#else // RCT_NEW_ARCH_ENABLED
|
|
5
6
|
#import <React/RCTBridgeModule.h>
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
@interface AudioAPIModule : RCTEventEmitter
|
|
16
17
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
17
|
-
<NativeAudioAPIModuleSpec, RCTCallInvokerModule>
|
|
18
|
+
<NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
|
|
18
19
|
#else
|
|
19
20
|
<RCTBridgeModule>
|
|
20
21
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
@@ -18,8 +18,7 @@ class IOSAudioRecorder : public AudioRecorder {
|
|
|
18
18
|
IOSAudioRecorder(
|
|
19
19
|
float sampleRate,
|
|
20
20
|
int bufferLength,
|
|
21
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
22
|
-
&audioEventHandlerRegistry);
|
|
21
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
23
22
|
|
|
24
23
|
~IOSAudioRecorder() override;
|
|
25
24
|
|
|
@@ -213,6 +213,15 @@
|
|
|
213
213
|
|
|
214
214
|
- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
|
|
215
215
|
{
|
|
216
|
+
id value = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
|
|
217
|
+
// if there is no entry NSMicrophoneUsageDescription calling requestRecordPermission will quit an app
|
|
218
|
+
if (value == nil) {
|
|
219
|
+
reject(
|
|
220
|
+
nil,
|
|
221
|
+
@"There is no NSMicrophoneUsageDescription entry in info.plist file. App cannot access microphone without it.",
|
|
222
|
+
nil);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
216
225
|
if (@available(iOS 17, *)) {
|
|
217
226
|
[AVAudioSession.sharedInstance requestRecordPermission:^(BOOL granted) {
|
|
218
227
|
if (granted) {
|
|
@@ -15,7 +15,7 @@ class AudioContext extends _BaseAudioContext.default {
|
|
|
15
15
|
throw new _errors.NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
16
16
|
}
|
|
17
17
|
let audioRuntime = null;
|
|
18
|
-
if (_utils.
|
|
18
|
+
if (_utils.isWorkletsVersionSupported) {
|
|
19
19
|
audioRuntime = _utils.workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
20
20
|
}
|
|
21
21
|
super(global.createAudioContext(options?.sampleRate || _system.default.getDevicePreferredSampleRate(), options?.initSuspended || false, audioRuntime));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","_utils","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","audioRuntime","
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_system","_errors","_utils","e","__esModule","default","AudioContext","BaseAudioContext","constructor","options","sampleRate","NotSupportedError","audioRuntime","isWorkletsVersionSupported","workletsModule","createWorkletRuntime","global","createAudioContext","AudioManager","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend","exports"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;;;;;AACA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAAsE,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvD,MAAMG,YAAY,SAASC,yBAAgB,CAAC;EACzDC,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIC,yBAAiB,CACzB,6CAA6CF,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IACA,IAAIE,YAAY,GAAG,IAAI;IAEvB,IAAIC,iCAA0B,EAAE;MAC9BD,YAAY,GAAGE,qBAAc,CAACC,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBR,OAAO,EAAEC,UAAU,IAAIQ,eAAY,CAACC,4BAA4B,CAAC,CAAC,EAClEV,OAAO,EAAEW,aAAa,IAAI,KAAK,EAC/BR,YACF,CACF,CAAC;EACH;EAEA,MAAMS,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF;AAACC,OAAA,CAAApB,OAAA,GAAAC,YAAA","ignoreList":[]}
|
|
@@ -52,37 +52,28 @@ class BaseAudioContext {
|
|
|
52
52
|
if (bufferLength < 1) {
|
|
53
53
|
throw new _errors.NotSupportedError(`The buffer length provided (${bufferLength}) can not be less than 1`);
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
56
|
+
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((audioBuffers, channelCount) => {
|
|
57
|
+
'worklet';
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
65
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
59
|
+
const floatAudioData = audioBuffers.map(buffer => new Float32Array(buffer));
|
|
60
|
+
callback(floatAudioData, channelCount);
|
|
61
|
+
});
|
|
62
|
+
return new _WorkletNode.default(this, this.context.createWorkletNode(shareableWorklet, workletRuntime === 'UIRuntime', bufferLength, inputChannelCount));
|
|
66
63
|
}
|
|
67
64
|
createWorkletProcessingNode(callback, workletRuntime = 'AudioRuntime') {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
66
|
+
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((inputBuffers, outputBuffers, framesToProcess, currentTime) => {
|
|
67
|
+
'worklet';
|
|
71
68
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
79
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
69
|
+
const inputData = inputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
70
|
+
const outputData = outputBuffers.map(buffer => new Float32Array(buffer, 0, framesToProcess));
|
|
71
|
+
callback(inputData, outputData, framesToProcess, currentTime);
|
|
72
|
+
});
|
|
73
|
+
return new _WorkletProcessingNode.default(this, this.context.createWorkletProcessingNode(shareableWorklet, workletRuntime === 'UIRuntime'));
|
|
80
74
|
}
|
|
81
75
|
createWorkletSourceNode(callback, workletRuntime = 'AudioRuntime') {
|
|
82
|
-
|
|
83
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
84
|
-
throw new Error('[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.');
|
|
85
|
-
}
|
|
76
|
+
(0, _utils.assertWorkletsEnabled)();
|
|
86
77
|
const shareableWorklet = _utils.workletsModule.makeShareableCloneRecursive((audioBuffers, framesToProcess, currentTime, startOffset) => {
|
|
87
78
|
'worklet';
|
|
88
79
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_utils","_WorkletSourceNode","_interopRequireDefault","_WorkletProcessingNode","_AnalyserNode","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConstantSourceNode","_GainNode","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WorkletNode","_AudioDecoder","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","decodeAudioData","input","ArrayBuffer","TypeError","decodePCMInBase64","base64String","inputSampleRate","inputChannelCount","isInterleaved","createWorkletNode","callback","bufferLength","workletRuntime","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["_errors","require","_utils","_WorkletSourceNode","_interopRequireDefault","_WorkletProcessingNode","_AnalyserNode","_AudioBuffer","_AudioBufferQueueSourceNode","_AudioBufferSourceNode","_AudioDestinationNode","_BiquadFilterNode","_ConstantSourceNode","_GainNode","_OscillatorNode","_PeriodicWave","_RecorderAdapterNode","_StereoPannerNode","_StreamerNode","_WorkletNode","_AudioDecoder","e","__esModule","default","BaseAudioContext","constructor","context","destination","AudioDestinationNode","sampleRate","currentTime","state","decodeAudioData","input","ArrayBuffer","TypeError","decodePCMInBase64","base64String","inputSampleRate","inputChannelCount","isInterleaved","createWorkletNode","callback","bufferLength","workletRuntime","NotSupportedError","assertWorkletsEnabled","shareableWorklet","workletsModule","makeShareableCloneRecursive","audioBuffers","channelCount","floatAudioData","map","buffer","Float32Array","WorkletNode","createWorkletProcessingNode","inputBuffers","outputBuffers","framesToProcess","inputData","outputData","WorkletProcessingNode","createWorkletSourceNode","startOffset","WorkletSourceNode","createRecorderAdapter","RecorderAdapterNode","createOscillator","OscillatorNode","createStreamer","StreamerNode","createConstantSource","ConstantSourceNode","createGain","GainNode","createStereoPanner","StereoPannerNode","createBiquadFilter","BiquadFilterNode","createBufferSource","options","pitchCorrection","AudioBufferSourceNode","createBufferQueueSource","AudioBufferQueueSourceNode","createBuffer","numOfChannels","length","AudioBuffer","createPeriodicWave","real","imag","constraints","InvalidAccessError","disableNormalization","PeriodicWave","createAnalyser","AnalyserNode","exports"],"sourceRoot":"../../../src","sources":["core/BaseAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,7 +12,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
12
12
|
class OfflineAudioContext extends _BaseAudioContext.default {
|
|
13
13
|
constructor(arg0, arg1, arg2) {
|
|
14
14
|
let audioRuntime = null;
|
|
15
|
-
if (_utils.
|
|
15
|
+
if (_utils.isWorkletsVersionSupported) {
|
|
16
16
|
audioRuntime = _utils.workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
17
17
|
}
|
|
18
18
|
if (typeof arg0 === 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_errors","_AudioBuffer","_utils","e","__esModule","default","OfflineAudioContext","BaseAudioContext","constructor","arg0","arg1","arg2","audioRuntime","
|
|
1
|
+
{"version":3,"names":["_BaseAudioContext","_interopRequireDefault","require","_errors","_AudioBuffer","_utils","e","__esModule","default","OfflineAudioContext","BaseAudioContext","constructor","arg0","arg1","arg2","audioRuntime","isWorkletsVersionSupported","workletsModule","createWorkletRuntime","numberOfChannels","length","sampleRate","global","createOfflineAudioContext","duration","NotSupportedError","isSuspended","isRendering","resume","InvalidStateError","context","suspend","suspendTime","currentTime","startRendering","audioBuffer","AudioBuffer","exports"],"sourceRoot":"../../../src","sources":["core/OfflineAudioContext.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,18 +3,33 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.assertWorkletsEnabled = assertWorkletsEnabled;
|
|
6
7
|
exports.clamp = clamp;
|
|
7
|
-
exports.workletsModule = exports.
|
|
8
|
+
exports.workletsVersion = exports.workletsModule = exports.supportedWorkletsVersions = exports.isWorkletsVersionSupported = void 0;
|
|
8
9
|
function clamp(value, min, max) {
|
|
9
10
|
return Math.min(Math.max(value, min), max);
|
|
10
11
|
}
|
|
11
|
-
let isWorkletsAvailable =
|
|
12
|
+
let isWorkletsAvailable = false;
|
|
13
|
+
let isWorkletsVersionSupported = exports.isWorkletsVersionSupported = false;
|
|
14
|
+
let workletsVersion = exports.workletsVersion = 'unknown';
|
|
15
|
+
const supportedWorkletsVersions = exports.supportedWorkletsVersions = ['0.6.0', '0.6.1'];
|
|
12
16
|
let workletsModule = exports.workletsModule = void 0;
|
|
17
|
+
function assertWorkletsEnabled() {
|
|
18
|
+
if (!isWorkletsAvailable) {
|
|
19
|
+
throw new Error('[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.');
|
|
20
|
+
} else if (!isWorkletsVersionSupported) {
|
|
21
|
+
throw new Error(`[react-native-audio-api]: Worklets version ${workletsVersion} is not supported.
|
|
22
|
+
Please install react-native-worklets of one of the following versions: [${supportedWorkletsVersions.join(', ')}] to use this feature.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
13
25
|
try {
|
|
14
26
|
exports.workletsModule = workletsModule = require('react-native-worklets');
|
|
15
|
-
|
|
27
|
+
const workletsModuleJson = require('react-native-worklets/package.json');
|
|
28
|
+
exports.isWorkletsVersionSupported = isWorkletsVersionSupported = supportedWorkletsVersions.includes(workletsModuleJson.version);
|
|
29
|
+
isWorkletsAvailable = true;
|
|
30
|
+
exports.workletsVersion = workletsVersion = workletsModuleJson.version;
|
|
16
31
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
32
|
} catch (error) {
|
|
18
|
-
|
|
33
|
+
isWorkletsAvailable = false;
|
|
19
34
|
}
|
|
20
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","exports","workletsModule","require","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["clamp","value","min","max","Math","isWorkletsAvailable","isWorkletsVersionSupported","exports","workletsVersion","supportedWorkletsVersions","workletsModule","assertWorkletsEnabled","Error","join","require","workletsModuleJson","includes","version","error"],"sourceRoot":"../../../src","sources":["utils/index.ts"],"mappings":";;;;;;;;AAWO,SAASA,KAAKA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,EAAU;EACrE,OAAOC,IAAI,CAACF,GAAG,CAACE,IAAI,CAACD,GAAG,CAACF,KAAK,EAAEC,GAAG,CAAC,EAAEC,GAAG,CAAC;AAC5C;AAEA,IAAIE,mBAAmB,GAAG,KAAK;AACxB,IAAIC,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAG,KAAK;AACtC,IAAIE,eAAe,GAAAD,OAAA,CAAAC,eAAA,GAAG,SAAS;AAC/B,MAAMC,yBAAyB,GAAAF,OAAA,CAAAE,yBAAA,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;AACpD,IAAIC,cAAuC,GAAAH,OAAA,CAAAG,cAAA;AAE3C,SAASC,qBAAqBA,CAAA,EAAG;EACtC,IAAI,CAACN,mBAAmB,EAAE;IACxB,MAAM,IAAIO,KAAK,CACb,iHACF,CAAC;EACH,CAAC,MAAM,IAAI,CAACN,0BAA0B,EAAE;IACtC,MAAM,IAAIM,KAAK,CACb,8CAA8CJ,eAAe;AACnE,gFAAgFC,yBAAyB,CAACI,IAAI,CAAC,IAAI,CAAC,wBAChH,CAAC;EACH;AACF;AAEA,IAAI;EACFN,OAAA,CAAAG,cAAA,GAAAA,cAAc,GAAGI,OAAO,CAAC,uBAAuB,CAAC;EACjD,MAAMC,kBAAkB,GAAGD,OAAO,CAAC,oCAAoC,CAAC;EACxEP,OAAA,CAAAD,0BAAA,GAAAA,0BAA0B,GAAGG,yBAAyB,CAACO,QAAQ,CAC7DD,kBAAkB,CAACE,OACrB,CAAC;EACDZ,mBAAmB,GAAG,IAAI;EAC1BE,OAAA,CAAAC,eAAA,GAAAA,eAAe,GAAGO,kBAAkB,CAACE,OAAO;EAC5C;AACF,CAAC,CAAC,OAAOC,KAAK,EAAE;EACdb,mBAAmB,GAAG,KAAK;AAC7B","ignoreList":[]}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
import BaseAudioContext from "./BaseAudioContext.js";
|
|
4
4
|
import AudioManager from "../system/index.js";
|
|
5
5
|
import { NotSupportedError } from "../errors/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { isWorkletsVersionSupported, workletsModule } from "../utils/index.js";
|
|
7
7
|
export default class AudioContext extends BaseAudioContext {
|
|
8
8
|
constructor(options) {
|
|
9
9
|
if (options && options.sampleRate && (options.sampleRate < 8000 || options.sampleRate > 96000)) {
|
|
10
10
|
throw new NotSupportedError(`The provided sampleRate is not supported: ${options.sampleRate}`);
|
|
11
11
|
}
|
|
12
12
|
let audioRuntime = null;
|
|
13
|
-
if (
|
|
13
|
+
if (isWorkletsVersionSupported) {
|
|
14
14
|
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
15
15
|
}
|
|
16
16
|
super(global.createAudioContext(options?.sampleRate || AudioManager.getDevicePreferredSampleRate(), options?.initSuspended || false, audioRuntime));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","
|
|
1
|
+
{"version":3,"names":["BaseAudioContext","AudioManager","NotSupportedError","isWorkletsVersionSupported","workletsModule","AudioContext","constructor","options","sampleRate","audioRuntime","createWorkletRuntime","global","createAudioContext","getDevicePreferredSampleRate","initSuspended","close","context","resume","suspend"],"sourceRoot":"../../../src","sources":["core/AudioContext.ts"],"mappings":";;AACA,OAAOA,gBAAgB,MAAM,uBAAoB;AACjD,OAAOC,YAAY,MAAM,oBAAW;AAEpC,SAASC,iBAAiB,QAAQ,oBAAW;AAC7C,SAASC,0BAA0B,EAAEC,cAAc,QAAQ,mBAAU;AAErE,eAAe,MAAMC,YAAY,SAASL,gBAAgB,CAAC;EACzDM,WAAWA,CAACC,OAA6B,EAAE;IACzC,IACEA,OAAO,IACPA,OAAO,CAACC,UAAU,KACjBD,OAAO,CAACC,UAAU,GAAG,IAAI,IAAID,OAAO,CAACC,UAAU,GAAG,KAAK,CAAC,EACzD;MACA,MAAM,IAAIN,iBAAiB,CACzB,6CAA6CK,OAAO,CAACC,UAAU,EACjE,CAAC;IACH;IACA,IAAIC,YAAY,GAAG,IAAI;IAEvB,IAAIN,0BAA0B,EAAE;MAC9BM,YAAY,GAAGL,cAAc,CAACM,oBAAoB,CAAC,qBAAqB,CAAC;IAC3E;IAEA,KAAK,CACHC,MAAM,CAACC,kBAAkB,CACvBL,OAAO,EAAEC,UAAU,IAAIP,YAAY,CAACY,4BAA4B,CAAC,CAAC,EAClEN,OAAO,EAAEO,aAAa,IAAI,KAAK,EAC/BL,YACF,CACF,CAAC;EACH;EAEA,MAAMM,KAAKA,CAAA,EAAkB;IAC3B,OAAQ,IAAI,CAACC,OAAO,CAAmBD,KAAK,CAAC,CAAC;EAChD;EAEA,MAAME,MAAMA,CAAA,EAAqB;IAC/B,OAAQ,IAAI,CAACD,OAAO,CAAmBC,MAAM,CAAC,CAAC;EACjD;EAEA,MAAMC,OAAOA,CAAA,EAAqB;IAChC,OAAQ,IAAI,CAACF,OAAO,CAAmBE,OAAO,CAAC,CAAC;EAClD;AACF","ignoreList":[]}
|