react-native-audio-api 0.11.0-nightly-568a154-20251222 → 0.11.0-nightly-94b7f30-20251224
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/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +1 -1
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +11 -3
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +47 -79
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +3 -2
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +2 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +9 -1
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp +72 -0
- package/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h +23 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +15 -13
- package/common/cpp/audioapi/core/AudioContext.h +2 -1
- package/common/cpp/audioapi/core/AudioNode.cpp +39 -24
- package/common/cpp/audioapi/core/AudioNode.h +3 -3
- package/common/cpp/audioapi/core/AudioParam.cpp +9 -6
- package/common/cpp/audioapi/core/AudioParam.h +2 -2
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +32 -21
- package/common/cpp/audioapi/core/BaseAudioContext.h +5 -1
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +8 -11
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +9 -3
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +18 -9
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +3 -3
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +1 -1
- package/common/cpp/audioapi/core/effects/DelayNode.cpp +20 -11
- package/common/cpp/audioapi/core/effects/DelayNode.h +1 -1
- package/common/cpp/audioapi/core/effects/GainNode.cpp +12 -4
- package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
- package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +6 -3
- package/common/cpp/audioapi/core/effects/IIRFilterNode.h +1 -1
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +7 -4
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
- package/common/cpp/audioapi/core/effects/WaveShaperNode.cpp +79 -0
- package/common/cpp/audioapi/core/effects/WaveShaperNode.h +66 -0
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +2 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.h +2 -2
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +7 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +6 -2
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +2 -3
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +1 -1
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +59 -25
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +4 -2
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +18 -11
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -21
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -3
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +11 -11
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +4 -2
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +16 -8
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +30 -18
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +4 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +24 -10
- package/common/cpp/audioapi/core/sources/StreamerNode.h +4 -3
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +11 -4
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +6 -2
- package/common/cpp/audioapi/core/types/OverSampleType.h +7 -0
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +1 -0
- package/common/cpp/audioapi/dsp/Resampler.cpp +200 -0
- package/common/cpp/audioapi/dsp/Resampler.h +65 -0
- package/common/cpp/audioapi/dsp/WaveShaper.cpp +105 -0
- package/common/cpp/audioapi/dsp/WaveShaper.h +46 -0
- package/common/cpp/audioapi/utils/AudioArray.cpp +5 -0
- package/common/cpp/audioapi/utils/AudioArray.h +6 -0
- package/common/cpp/test/RunTests.sh +1 -1
- package/common/cpp/test/src/AudioParamTest.cpp +10 -10
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +31 -15
- package/common/cpp/test/src/ConstantSourceTest.cpp +16 -14
- package/common/cpp/test/src/DelayTest.cpp +14 -13
- package/common/cpp/test/src/GainTest.cpp +10 -9
- package/common/cpp/test/src/IIRFilterTest.cpp +4 -4
- package/common/cpp/test/src/OscillatorTest.cpp +2 -2
- package/common/cpp/test/src/StereoPannerTest.cpp +14 -12
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +25 -25
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +3 -5
- package/common/cpp/test/src/core/effects/WaveShaperNodeTest.cpp +76 -0
- package/common/cpp/test/src/dsp/ResamplerTest.cpp +117 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +4 -4
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +9 -3
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +0 -3
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js +20 -0
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js +6 -0
- package/lib/commonjs/AudioAPIModule/ModuleInterfaces.js.map +1 -0
- package/lib/commonjs/api.js +16 -0
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +23 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +4 -0
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/WaveShaperNode.js +38 -0
- package/lib/commonjs/core/WaveShaperNode.js.map +1 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.web.js +47 -0
- package/lib/commonjs/specs/NativeAudioAPIModule.web.js.map +1 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/system/types.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/web-core/WaveShaperNode.js +38 -0
- package/lib/commonjs/web-core/WaveShaperNode.js.map +1 -0
- package/lib/commonjs/web-system/AudioManager.js +30 -0
- package/lib/commonjs/web-system/AudioManager.js.map +1 -0
- package/lib/commonjs/web-system/index.js +12 -0
- package/lib/commonjs/web-system/index.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.js +0 -4
- package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -1
- package/lib/module/AudioAPIModule/AudioAPIModule.web.js +16 -0
- package/lib/module/AudioAPIModule/AudioAPIModule.web.js.map +1 -0
- package/lib/module/AudioAPIModule/ModuleInterfaces.js +4 -0
- package/lib/module/AudioAPIModule/ModuleInterfaces.js.map +1 -0
- package/lib/module/AudioAPIModule/index.js +1 -1
- package/lib/module/AudioAPIModule/index.js.map +1 -1
- package/lib/module/api.js +2 -0
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +3 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +4 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/WaveShaperNode.js +32 -0
- package/lib/module/core/WaveShaperNode.js.map +1 -0
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.web.js +44 -0
- package/lib/module/specs/NativeAudioAPIModule.web.js.map +1 -0
- package/lib/module/specs/index.js +1 -1
- package/lib/module/specs/index.js.map +1 -1
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/system/types.js +2 -0
- package/lib/module/web-core/AudioContext.js +4 -0
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/OfflineAudioContext.js +4 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/web-core/WaveShaperNode.js +32 -0
- package/lib/module/web-core/WaveShaperNode.js.map +1 -0
- package/lib/module/web-system/AudioManager.js +26 -0
- package/lib/module/web-system/AudioManager.js.map +1 -0
- package/lib/module/web-system/index.js +1 -0
- package/lib/module/web-system/index.js.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +2 -10
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts +13 -0
- package/lib/typescript/AudioAPIModule/AudioAPIModule.web.d.ts.map +1 -0
- package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts +18 -0
- package/lib/typescript/AudioAPIModule/ModuleInterfaces.d.ts.map +1 -0
- 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/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/WaveShaperNode.d.ts +9 -0
- package/lib/typescript/core/WaveShaperNode.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +8 -2
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts +34 -0
- package/lib/typescript/specs/NativeAudioAPIModule.web.d.ts.map +1 -0
- package/lib/typescript/system/AudioManager.d.ts +2 -2
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/notification/types.d.ts +1 -1
- package/lib/typescript/system/notification/types.d.ts.map +1 -1
- package/lib/typescript/system/types.d.ts +17 -0
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +1 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +2 -0
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +3 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/WaveShaperNode.d.ts +9 -0
- package/lib/typescript/web-core/WaveShaperNode.d.ts.map +1 -0
- package/lib/typescript/web-system/AudioManager.d.ts +24 -0
- package/lib/typescript/web-system/AudioManager.d.ts.map +1 -0
- package/lib/typescript/web-system/index.d.ts +1 -0
- package/lib/typescript/web-system/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AudioAPIModule/AudioAPIModule.ts +6 -17
- package/src/AudioAPIModule/AudioAPIModule.web.ts +18 -0
- package/src/AudioAPIModule/ModuleInterfaces.ts +25 -0
- package/src/api.ts +2 -0
- package/src/api.web.ts +3 -0
- package/src/core/BaseAudioContext.ts +5 -0
- package/src/core/WaveShaperNode.ts +43 -0
- package/src/interfaces.ts +9 -1
- package/src/specs/NativeAudioAPIModule.ts +5 -3
- package/src/specs/NativeAudioAPIModule.web.ts +93 -0
- package/src/system/AudioManager.ts +19 -14
- package/src/system/notification/types.ts +1 -1
- package/src/system/types.ts +22 -0
- package/src/types.ts +2 -0
- package/src/web-core/AudioContext.tsx +5 -0
- package/src/web-core/BaseAudioContext.tsx +3 -1
- package/src/web-core/OfflineAudioContext.tsx +5 -0
- package/src/web-core/WaveShaperNode.tsx +42 -0
- package/src/web-system/AudioManager.ts +33 -0
- package/src/web-system/index.ts +1 -0
|
@@ -14,14 +14,14 @@ using namespace audioapi;
|
|
|
14
14
|
class IIRFilterTest : public ::testing::Test {
|
|
15
15
|
protected:
|
|
16
16
|
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
17
|
-
std::
|
|
17
|
+
std::shared_ptr<OfflineAudioContext> context;
|
|
18
18
|
static constexpr int sampleRate = 44100;
|
|
19
19
|
static constexpr float nyquistFrequency = sampleRate / 2.0f;
|
|
20
20
|
static constexpr float tolerance = 0.0001f;
|
|
21
21
|
|
|
22
22
|
void SetUp() override {
|
|
23
23
|
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
24
|
-
context = std::
|
|
24
|
+
context = std::make_shared<OfflineAudioContext>(
|
|
25
25
|
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -99,7 +99,7 @@ TEST_F(IIRFilterTest, GetFrequencyResponse) {
|
|
|
99
99
|
const std::vector<float> feedforward = {0.0050662636, 0.0101325272, 0.0050662636};
|
|
100
100
|
const std::vector<float> feedback = {1.0632762845, -1.9797349456, 0.9367237155};
|
|
101
101
|
|
|
102
|
-
auto node =
|
|
102
|
+
auto node = IIRFilterNode(context, feedforward, feedback);
|
|
103
103
|
|
|
104
104
|
float frequency = 1000.0f;
|
|
105
105
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
@@ -120,7 +120,7 @@ TEST_F(IIRFilterTest, GetFrequencyResponse) {
|
|
|
120
120
|
std::vector<float> magResponseExpected(TestFrequencies.size());
|
|
121
121
|
std::vector<float> phaseResponseExpected(TestFrequencies.size());
|
|
122
122
|
|
|
123
|
-
node
|
|
123
|
+
node.getFrequencyResponse(
|
|
124
124
|
TestFrequencies.data(),
|
|
125
125
|
magResponseNode.data(),
|
|
126
126
|
phaseResponseNode.data(),
|
|
@@ -10,12 +10,12 @@ using namespace audioapi;
|
|
|
10
10
|
class OscillatorTest : public ::testing::Test {
|
|
11
11
|
protected:
|
|
12
12
|
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
13
|
-
std::
|
|
13
|
+
std::shared_ptr<OfflineAudioContext> context;
|
|
14
14
|
static constexpr int sampleRate = 44100;
|
|
15
15
|
|
|
16
16
|
void SetUp() override {
|
|
17
17
|
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
18
|
-
context = std::
|
|
18
|
+
context = std::make_shared<OfflineAudioContext>(
|
|
19
19
|
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
20
20
|
}
|
|
21
21
|
};
|
|
@@ -12,19 +12,21 @@ using namespace audioapi;
|
|
|
12
12
|
class StereoPannerTest : public ::testing::Test {
|
|
13
13
|
protected:
|
|
14
14
|
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
15
|
-
std::
|
|
15
|
+
std::shared_ptr<OfflineAudioContext> context;
|
|
16
16
|
static constexpr int sampleRate = 44100;
|
|
17
17
|
|
|
18
18
|
void SetUp() override {
|
|
19
19
|
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
20
|
-
context = std::
|
|
20
|
+
context = std::make_shared<OfflineAudioContext>(
|
|
21
21
|
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
22
|
+
context->initialize();
|
|
22
23
|
}
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
class TestableStereoPannerNode : public StereoPannerNode {
|
|
26
27
|
public:
|
|
27
|
-
explicit TestableStereoPannerNode(BaseAudioContext
|
|
28
|
+
explicit TestableStereoPannerNode(std::shared_ptr<BaseAudioContext> context)
|
|
29
|
+
: StereoPannerNode(context) {}
|
|
28
30
|
|
|
29
31
|
void setPanParam(float value) {
|
|
30
32
|
getPanParam()->setValue(value);
|
|
@@ -45,15 +47,15 @@ TEST_F(StereoPannerTest, StereoPannerCanBeCreated) {
|
|
|
45
47
|
TEST_F(StereoPannerTest, PanModulatesInputMonoCorrectly) {
|
|
46
48
|
static constexpr float PAN_VALUE = 0.5;
|
|
47
49
|
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
48
|
-
auto panNode =
|
|
49
|
-
panNode
|
|
50
|
+
auto panNode = TestableStereoPannerNode(context);
|
|
51
|
+
panNode.setPanParam(PAN_VALUE);
|
|
50
52
|
|
|
51
53
|
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
52
54
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
53
55
|
(*bus->getChannelByType(AudioBus::ChannelLeft))[i] = i + 1;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
auto resultBus = panNode
|
|
58
|
+
auto resultBus = panNode.processNode(bus, FRAMES_TO_PROCESS);
|
|
57
59
|
// x = (0.5 + 1) / 2 = 0.75
|
|
58
60
|
// gainL = cos(x * (π / 2)) = cos(0.75 * (π / 2)) = 0.38268343236508984
|
|
59
61
|
// gainR = sin(x * (π / 2)) = sin(0.75 * (π / 2)) = 0.9238795325112867
|
|
@@ -72,8 +74,8 @@ TEST_F(StereoPannerTest, PanModulatesInputMonoCorrectly) {
|
|
|
72
74
|
TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithNegativePan) {
|
|
73
75
|
static constexpr float PAN_VALUE = -0.5;
|
|
74
76
|
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
75
|
-
auto panNode =
|
|
76
|
-
panNode
|
|
77
|
+
auto panNode = TestableStereoPannerNode(context);
|
|
78
|
+
panNode.setPanParam(PAN_VALUE);
|
|
77
79
|
|
|
78
80
|
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
79
81
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
@@ -81,7 +83,7 @@ TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithNegativePan) {
|
|
|
81
83
|
(*bus->getChannelByType(AudioBus::ChannelRight))[i] = i + 1;
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
auto resultBus = panNode
|
|
86
|
+
auto resultBus = panNode.processNode(bus, FRAMES_TO_PROCESS);
|
|
85
87
|
// x = -0.5 + 1 = 0.5
|
|
86
88
|
// gainL = cos(x * (π / 2)) = cos(0.5 * (π / 2)) = 0.7071067811865476
|
|
87
89
|
// gainR = sin(x * (π / 2)) = sin(0.5 * (π / 2)) = 0.7071067811865476
|
|
@@ -100,8 +102,8 @@ TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithNegativePan) {
|
|
|
100
102
|
TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithPositivePan) {
|
|
101
103
|
static constexpr float PAN_VALUE = 0.75;
|
|
102
104
|
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
103
|
-
auto panNode =
|
|
104
|
-
panNode
|
|
105
|
+
auto panNode = TestableStereoPannerNode(context);
|
|
106
|
+
panNode.setPanParam(PAN_VALUE);
|
|
105
107
|
|
|
106
108
|
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
107
109
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
@@ -109,7 +111,7 @@ TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithPositivePan) {
|
|
|
109
111
|
(*bus->getChannelByType(AudioBus::ChannelRight))[i] = i + 1;
|
|
110
112
|
}
|
|
111
113
|
|
|
112
|
-
auto resultBus = panNode
|
|
114
|
+
auto resultBus = panNode.processNode(bus, FRAMES_TO_PROCESS);
|
|
113
115
|
// x = 0.75
|
|
114
116
|
// gainL = cos(x * (π / 2)) = cos(0.75 * (π / 2)) = 0.38268343236508984
|
|
115
117
|
// gainR = sin(x * (π / 2)) = sin(0.75 * (π / 2)) = 0.9238795325112867
|
|
@@ -6,76 +6,76 @@
|
|
|
6
6
|
namespace audioapi {
|
|
7
7
|
|
|
8
8
|
void BiquadFilterTest::expectCoefficientsNear(
|
|
9
|
-
const
|
|
9
|
+
const BiquadFilterNode &biquadNode,
|
|
10
10
|
const BiquadCoefficients &expected) {
|
|
11
|
-
EXPECT_NEAR(biquadNode
|
|
12
|
-
EXPECT_NEAR(biquadNode
|
|
13
|
-
EXPECT_NEAR(biquadNode
|
|
14
|
-
EXPECT_NEAR(biquadNode
|
|
15
|
-
EXPECT_NEAR(biquadNode
|
|
11
|
+
EXPECT_NEAR(biquadNode.b0_, expected.b0, tolerance);
|
|
12
|
+
EXPECT_NEAR(biquadNode.b1_, expected.b1, tolerance);
|
|
13
|
+
EXPECT_NEAR(biquadNode.b2_, expected.b2, tolerance);
|
|
14
|
+
EXPECT_NEAR(biquadNode.a1_, expected.a1, tolerance);
|
|
15
|
+
EXPECT_NEAR(biquadNode.a2_, expected.a2, tolerance);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
void BiquadFilterTest::testLowpass(float frequency, float Q) {
|
|
19
|
-
auto node =
|
|
19
|
+
auto node = BiquadFilterNode(context);
|
|
20
20
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
21
21
|
|
|
22
|
-
node
|
|
22
|
+
node.setLowpassCoefficients(normalizedFrequency, Q);
|
|
23
23
|
expectCoefficientsNear(node, calculateLowpassCoefficients(normalizedFrequency, Q));
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
void BiquadFilterTest::testHighpass(float frequency, float Q) {
|
|
27
|
-
auto node =
|
|
27
|
+
auto node = BiquadFilterNode(context);
|
|
28
28
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
29
29
|
|
|
30
|
-
node
|
|
30
|
+
node.setHighpassCoefficients(normalizedFrequency, Q);
|
|
31
31
|
expectCoefficientsNear(node, calculateHighpassCoefficients(normalizedFrequency, Q));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
void BiquadFilterTest::testBandpass(float frequency, float Q) {
|
|
35
|
-
auto node =
|
|
35
|
+
auto node = BiquadFilterNode(context);
|
|
36
36
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
37
37
|
|
|
38
|
-
node
|
|
38
|
+
node.setBandpassCoefficients(normalizedFrequency, Q);
|
|
39
39
|
expectCoefficientsNear(node, calculateBandpassCoefficients(normalizedFrequency, Q));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
void BiquadFilterTest::testNotch(float frequency, float Q) {
|
|
43
|
-
auto node =
|
|
43
|
+
auto node = BiquadFilterNode(context);
|
|
44
44
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
45
45
|
|
|
46
|
-
node
|
|
46
|
+
node.setNotchCoefficients(normalizedFrequency, Q);
|
|
47
47
|
expectCoefficientsNear(node, calculateNotchCoefficients(normalizedFrequency, Q));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
void BiquadFilterTest::testAllpass(float frequency, float Q) {
|
|
51
|
-
auto node =
|
|
51
|
+
auto node = BiquadFilterNode(context);
|
|
52
52
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
53
53
|
|
|
54
|
-
node
|
|
54
|
+
node.setAllpassCoefficients(normalizedFrequency, Q);
|
|
55
55
|
expectCoefficientsNear(node, calculateAllpassCoefficients(normalizedFrequency, Q));
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
|
|
59
|
-
auto node =
|
|
59
|
+
auto node = BiquadFilterNode(context);
|
|
60
60
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
61
61
|
|
|
62
|
-
node
|
|
62
|
+
node.setPeakingCoefficients(normalizedFrequency, Q, gain);
|
|
63
63
|
expectCoefficientsNear(node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
void BiquadFilterTest::testLowshelf(float frequency, float gain) {
|
|
67
|
-
auto node =
|
|
67
|
+
auto node = BiquadFilterNode(context);
|
|
68
68
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
69
69
|
|
|
70
|
-
node
|
|
70
|
+
node.setLowshelfCoefficients(normalizedFrequency, gain);
|
|
71
71
|
expectCoefficientsNear(node, calculateLowshelfCoefficients(normalizedFrequency, gain));
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
void BiquadFilterTest::testHighshelf(float frequency, float gain) {
|
|
75
|
-
auto node =
|
|
75
|
+
auto node = BiquadFilterNode(context);
|
|
76
76
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
77
77
|
|
|
78
|
-
node
|
|
78
|
+
node.setHighshelfCoefficients(normalizedFrequency, gain);
|
|
79
79
|
expectCoefficientsNear(node, calculateHighshelfCoefficients(normalizedFrequency, gain));
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -218,13 +218,13 @@ TEST_P(BiquadFilterGainTest, SetHighshelfCoefficients) {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
TEST_F(BiquadFilterTest, GetFrequencyResponse) {
|
|
221
|
-
auto node =
|
|
221
|
+
auto node = BiquadFilterNode(context);
|
|
222
222
|
|
|
223
223
|
float frequency = 1000.0f;
|
|
224
224
|
float Q = 1.0f;
|
|
225
225
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
226
226
|
|
|
227
|
-
node
|
|
227
|
+
node.setLowpassCoefficients(normalizedFrequency, Q);
|
|
228
228
|
auto coeffs = calculateLowpassCoefficients(normalizedFrequency, Q);
|
|
229
229
|
|
|
230
230
|
std::vector<float> TestFrequencies = {
|
|
@@ -243,7 +243,7 @@ TEST_F(BiquadFilterTest, GetFrequencyResponse) {
|
|
|
243
243
|
std::vector<float> magResponseExpected(TestFrequencies.size());
|
|
244
244
|
std::vector<float> phaseResponseExpected(TestFrequencies.size());
|
|
245
245
|
|
|
246
|
-
node
|
|
246
|
+
node.getFrequencyResponse(
|
|
247
247
|
TestFrequencies.data(),
|
|
248
248
|
magResponseNode.data(),
|
|
249
249
|
phaseResponseNode.data(),
|
|
@@ -15,17 +15,15 @@ namespace audioapi {
|
|
|
15
15
|
class BiquadFilterTest : public ::testing::Test {
|
|
16
16
|
protected:
|
|
17
17
|
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
18
|
-
std::
|
|
18
|
+
std::shared_ptr<OfflineAudioContext> context;
|
|
19
19
|
|
|
20
20
|
void SetUp() override {
|
|
21
21
|
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
22
|
-
context = std::
|
|
22
|
+
context = std::make_shared<OfflineAudioContext>(
|
|
23
23
|
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
void expectCoefficientsNear(
|
|
27
|
-
const std::shared_ptr<BiquadFilterNode> &node,
|
|
28
|
-
const BiquadCoefficients &expected);
|
|
26
|
+
void expectCoefficientsNear(const BiquadFilterNode &node, const BiquadCoefficients &expected);
|
|
29
27
|
void testLowpass(float frequency, float Q);
|
|
30
28
|
void testHighpass(float frequency, float Q);
|
|
31
29
|
void testBandpass(float frequency, float Q);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
2
|
+
#include <audioapi/core/effects/WaveShaperNode.h>
|
|
3
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
4
|
+
#include <audioapi/utils/AudioArray.h>
|
|
5
|
+
#include <audioapi/utils/AudioBus.h>
|
|
6
|
+
#include <gtest/gtest.h>
|
|
7
|
+
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
using namespace audioapi;
|
|
11
|
+
|
|
12
|
+
class WaveShaperNodeTest : public ::testing::Test {
|
|
13
|
+
protected:
|
|
14
|
+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
15
|
+
std::shared_ptr<OfflineAudioContext> context;
|
|
16
|
+
static constexpr int sampleRate = 44100;
|
|
17
|
+
|
|
18
|
+
void SetUp() override {
|
|
19
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
20
|
+
context = std::make_shared<OfflineAudioContext>(
|
|
21
|
+
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
class TestableWaveShaperNode : public WaveShaperNode {
|
|
26
|
+
public:
|
|
27
|
+
explicit TestableWaveShaperNode(std::shared_ptr<BaseAudioContext> context)
|
|
28
|
+
: WaveShaperNode(context) {
|
|
29
|
+
testCurve_ = std::make_shared<AudioArray>(3);
|
|
30
|
+
auto data = testCurve_->getData();
|
|
31
|
+
data[0] = -2.0f;
|
|
32
|
+
data[1] = 0.0f;
|
|
33
|
+
data[2] = 2.0f;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
std::shared_ptr<AudioBus> processNode(
|
|
37
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
38
|
+
int framesToProcess) override {
|
|
39
|
+
return WaveShaperNode::processNode(processingBus, framesToProcess);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
std::shared_ptr<AudioArray> testCurve_;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
TEST_F(WaveShaperNodeTest, WaveShaperNodeCanBeCreated) {
|
|
46
|
+
auto waveShaper = context->createWaveShaper();
|
|
47
|
+
ASSERT_NE(waveShaper, nullptr);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
TEST_F(WaveShaperNodeTest, NullCanBeAsignedToCurve) {
|
|
51
|
+
auto waveShaper = context->createWaveShaper();
|
|
52
|
+
ASSERT_NO_THROW(waveShaper->setCurve(nullptr));
|
|
53
|
+
ASSERT_EQ(waveShaper->getCurve(), nullptr);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
TEST_F(WaveShaperNodeTest, NoneOverSamplingProcessesCorrectly) {
|
|
57
|
+
static constexpr int FRAMES_TO_PROCESS = 5;
|
|
58
|
+
auto waveShaper = std::make_shared<TestableWaveShaperNode>(context);
|
|
59
|
+
waveShaper->setOversample("none");
|
|
60
|
+
waveShaper->setCurve(waveShaper->testCurve_);
|
|
61
|
+
|
|
62
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
63
|
+
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
64
|
+
bus->getChannel(0)->getData()[i] = -1.0f + i * 0.5f;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
auto resultBus = waveShaper->processNode(bus, FRAMES_TO_PROCESS);
|
|
68
|
+
auto curveData = waveShaper->testCurve_->getData();
|
|
69
|
+
auto resultData = resultBus->getChannel(0)->getData();
|
|
70
|
+
|
|
71
|
+
EXPECT_FLOAT_EQ(resultData[0], curveData[0]);
|
|
72
|
+
EXPECT_FLOAT_EQ(resultData[1], -1.0f);
|
|
73
|
+
EXPECT_FLOAT_EQ(resultData[2], 0.0f);
|
|
74
|
+
EXPECT_FLOAT_EQ(resultData[3], 1.0f);
|
|
75
|
+
EXPECT_FLOAT_EQ(resultData[4], curveData[2]);
|
|
76
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
2
|
+
#include <audioapi/dsp/Resampler.h>
|
|
3
|
+
#include <audioapi/utils/AudioArray.h>
|
|
4
|
+
#include <audioapi/utils/AudioBus.h>
|
|
5
|
+
#include <audioapi/core/utils/Constants.h>
|
|
6
|
+
#include <gtest/gtest.h>
|
|
7
|
+
#include <memory>
|
|
8
|
+
|
|
9
|
+
using namespace audioapi;
|
|
10
|
+
|
|
11
|
+
class ResamplerTest : public ::testing::Test {
|
|
12
|
+
protected:
|
|
13
|
+
static constexpr int KERNEL_SIZE = RENDER_QUANTUM_SIZE;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
class TestableUpSampler : public UpSampler {
|
|
17
|
+
public:
|
|
18
|
+
explicit TestableUpSampler(int maxBlockSize, int kernelSize)
|
|
19
|
+
: UpSampler(maxBlockSize, kernelSize) {}
|
|
20
|
+
|
|
21
|
+
std::shared_ptr<AudioArray> getKernel() {
|
|
22
|
+
return kernel_;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
class TestableDownSampler : public DownSampler {
|
|
27
|
+
public:
|
|
28
|
+
explicit TestableDownSampler(int maxBlockSize, int kernelSize)
|
|
29
|
+
: DownSampler(maxBlockSize, kernelSize) {}
|
|
30
|
+
|
|
31
|
+
std::shared_ptr<AudioArray> getKernel() {
|
|
32
|
+
return kernel_;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
TEST_F(ResamplerTest, UpSamplerCanBeCreated) {
|
|
37
|
+
auto upSampler = std::make_unique<UpSampler>(RENDER_QUANTUM_SIZE, RENDER_QUANTUM_SIZE);
|
|
38
|
+
ASSERT_NE(upSampler, nullptr);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
TEST_F(ResamplerTest, DownSamplerCanBeCreated) {
|
|
42
|
+
auto downSampler = std::make_unique<DownSampler>(RENDER_QUANTUM_SIZE * 2, RENDER_QUANTUM_SIZE * 2);
|
|
43
|
+
ASSERT_NE(downSampler, nullptr);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
TEST_F(ResamplerTest, UpSamplerKernelSymmetry) {
|
|
47
|
+
auto upSampler = std::make_unique<TestableUpSampler>(RENDER_QUANTUM_SIZE, RENDER_QUANTUM_SIZE);
|
|
48
|
+
auto kernel = upSampler->getKernel();
|
|
49
|
+
|
|
50
|
+
// check for symmetry around the center point
|
|
51
|
+
for (size_t i = 0; i < kernel->getSize() / 2; ++i) {
|
|
52
|
+
EXPECT_NEAR((*kernel)[i], (*kernel)[kernel->getSize() - 1 - i], 1e-6);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
TEST_F(ResamplerTest, DownSamplerKernelSymmetry) {
|
|
57
|
+
auto downSampler =
|
|
58
|
+
std::make_unique<TestableDownSampler>(RENDER_QUANTUM_SIZE * 2, RENDER_QUANTUM_SIZE * 2);
|
|
59
|
+
auto kernel = downSampler->getKernel();
|
|
60
|
+
|
|
61
|
+
// check for symmetry around the center point
|
|
62
|
+
// as the kernel size is even, we compare pairs around the center -> kernel[size/2 - 1]
|
|
63
|
+
// last value is skipped
|
|
64
|
+
for (size_t i = 0; i < kernel->getSize() / 2; ++i) {
|
|
65
|
+
EXPECT_NEAR((*kernel)[i], (*kernel)[kernel->getSize() - 2 - i], 1e-6);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
EXPECT_FLOAT_EQ((*kernel)[kernel->getSize() / 2 - 1], 0.5f);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
TEST_F(ResamplerTest, UpSamplerKernelSum) {
|
|
72
|
+
auto upSampler = std::make_unique<TestableUpSampler>(RENDER_QUANTUM_SIZE, RENDER_QUANTUM_SIZE);
|
|
73
|
+
auto kernel = upSampler->getKernel();
|
|
74
|
+
|
|
75
|
+
float sum = 0.0f;
|
|
76
|
+
for (size_t i = 0; i < kernel->getSize(); ++i) {
|
|
77
|
+
sum += (*kernel)[i];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
EXPECT_NEAR(sum, 1.0f, 1e-6);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
TEST_F(ResamplerTest, DownSamplerKernelSum) {
|
|
84
|
+
auto downSampler =
|
|
85
|
+
std::make_unique<TestableDownSampler>(RENDER_QUANTUM_SIZE * 2, RENDER_QUANTUM_SIZE * 2);
|
|
86
|
+
auto kernel = downSampler->getKernel();
|
|
87
|
+
|
|
88
|
+
float sum = 0.0f;
|
|
89
|
+
for (size_t i = 0; i < kernel->getSize(); ++i) {
|
|
90
|
+
sum += (*kernel)[i];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
EXPECT_NEAR(sum, 1.0f, 1e-6);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
TEST_F(ResamplerTest, UpDownSamplingProcess) {
|
|
97
|
+
auto upSampler = std::make_unique<TestableUpSampler>(RENDER_QUANTUM_SIZE, RENDER_QUANTUM_SIZE);
|
|
98
|
+
auto downSampler =
|
|
99
|
+
std::make_unique<TestableDownSampler>(RENDER_QUANTUM_SIZE * 2, RENDER_QUANTUM_SIZE * 2);
|
|
100
|
+
|
|
101
|
+
auto inputArray = std::make_shared<AudioArray>(4);
|
|
102
|
+
(*inputArray)[0] = 1.0f;
|
|
103
|
+
(*inputArray)[1] = 0.0f;
|
|
104
|
+
(*inputArray)[2] = -1.0f;
|
|
105
|
+
(*inputArray)[3] = 1.0f;
|
|
106
|
+
|
|
107
|
+
auto outputArray = std::make_shared<AudioArray>(8);
|
|
108
|
+
|
|
109
|
+
int upSamplerOutputFrames;
|
|
110
|
+
int downSamplerOutputFrames;
|
|
111
|
+
|
|
112
|
+
EXPECT_NO_THROW(upSamplerOutputFrames = upSampler->process(inputArray, outputArray, 4));
|
|
113
|
+
EXPECT_NO_THROW(downSamplerOutputFrames = downSampler->process(outputArray, inputArray, 8));
|
|
114
|
+
|
|
115
|
+
EXPECT_EQ(upSamplerOutputFrames, 8);
|
|
116
|
+
EXPECT_EQ(downSamplerOutputFrames, 4);
|
|
117
|
+
}
|
|
@@ -181,8 +181,8 @@ RCT_EXPORT_METHOD(
|
|
|
181
181
|
{
|
|
182
182
|
// iOS doesn't require explicit notification permissions for media controls
|
|
183
183
|
// MPNowPlayingInfoCenter and MPRemoteCommandCenter work without permissions
|
|
184
|
-
// Return '
|
|
185
|
-
resolve(@"
|
|
184
|
+
// Return 'Granted' to match the spec interface
|
|
185
|
+
resolve(@"Granted");
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
RCT_EXPORT_METHOD(
|
|
@@ -190,8 +190,8 @@ RCT_EXPORT_METHOD(
|
|
|
190
190
|
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
191
191
|
{
|
|
192
192
|
// iOS doesn't require explicit notification permissions for media controls
|
|
193
|
-
// Return '
|
|
194
|
-
resolve(@"
|
|
193
|
+
// Return 'Granted' to match the spec interface
|
|
194
|
+
resolve(@"Granted");
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
RCT_EXPORT_METHOD(
|
|
@@ -73,7 +73,7 @@ IOSAudioRecorder::~IOSAudioRecorder()
|
|
|
73
73
|
/// @returns Result containing the file path if recording started successfully, or an error message.
|
|
74
74
|
Result<std::string, std::string> IOSAudioRecorder::start()
|
|
75
75
|
{
|
|
76
|
-
if (
|
|
76
|
+
if (!isIdle()) {
|
|
77
77
|
return Result<std::string, std::string>::Err("Recorder is already recording");
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -97,7 +97,9 @@ Result<NoneType, std::string> IOSRecorderCallback::prepare(
|
|
|
97
97
|
void IOSRecorderCallback::cleanup()
|
|
98
98
|
{
|
|
99
99
|
@autoreleasepool {
|
|
100
|
-
|
|
100
|
+
if (circularBus_[0]->getNumberOfAvailableFrames() > 0) {
|
|
101
|
+
emitAudioData(true);
|
|
102
|
+
}
|
|
101
103
|
|
|
102
104
|
converter_ = nil;
|
|
103
105
|
bufferFormat_ = nil;
|
|
@@ -133,7 +135,9 @@ void IOSRecorderCallback::receiveAudioData(const AudioBufferList *inputBuffer, i
|
|
|
133
135
|
circularBus_[i]->push_back(inputChannel, numFrames);
|
|
134
136
|
}
|
|
135
137
|
|
|
136
|
-
|
|
138
|
+
if (circularBus_[0]->getNumberOfAvailableFrames() >= bufferLength_) {
|
|
139
|
+
emitAudioData();
|
|
140
|
+
}
|
|
137
141
|
return;
|
|
138
142
|
}
|
|
139
143
|
|
|
@@ -178,7 +182,9 @@ void IOSRecorderCallback::receiveAudioData(const AudioBufferList *inputBuffer, i
|
|
|
178
182
|
circularBus_[i]->push_back(inputChannel, outputFrameCount);
|
|
179
183
|
}
|
|
180
184
|
|
|
181
|
-
|
|
185
|
+
if (circularBus_[0]->getNumberOfAvailableFrames() >= bufferLength_) {
|
|
186
|
+
emitAudioData();
|
|
187
|
+
}
|
|
182
188
|
}
|
|
183
189
|
}
|
|
184
190
|
|
|
@@ -5,9 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _specs = require("../specs");
|
|
8
|
-
// Hint: Copied from react-native-worklets
|
|
9
|
-
// Doesn't really matter what is inside, just need a unique type
|
|
10
|
-
|
|
11
8
|
class AudioAPIModule {
|
|
12
9
|
#workletsModule_ = null;
|
|
13
10
|
#canUseWorklets_ = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_specs","require","AudioAPIModule","workletsModule_","canUseWorklets_","workletsVersion","workletsAvailable_","supportedWorkletsVersion","constructor","verifyWorklets","verifyInstallation","NativeAudioAPIModule","Error","install","#verifyWorklets","workletsPackage","workletsPackageJson","version","includes","#verifyInstallation","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","createAudioStretcher","AudioEventEmitter","workletsModule","canUseWorklets","areWorkletsAvailable","isWorkletsVersionSupported","createAudioRuntime","createWorkletRuntime","_default","exports","default"],"sourceRoot":"../../../src","sources":["AudioAPIModule/AudioAPIModule.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"names":["_specs","require","AudioAPIModule","workletsModule_","canUseWorklets_","workletsVersion","workletsAvailable_","supportedWorkletsVersion","constructor","verifyWorklets","verifyInstallation","NativeAudioAPIModule","Error","install","#verifyWorklets","workletsPackage","workletsPackageJson","version","includes","#verifyInstallation","global","createAudioContext","createOfflineAudioContext","createAudioRecorder","createAudioDecoder","createAudioStretcher","AudioEventEmitter","workletsModule","canUseWorklets","areWorkletsAvailable","isWorkletsVersionSupported","createAudioRuntime","createWorkletRuntime","_default","exports","default"],"sourceRoot":"../../../src","sources":["AudioAPIModule/AudioAPIModule.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAOA,MAAMC,cAAc,CAA4B;EAC9C,CAACC,eAAe,GAA2B,IAAI;EAC/C,CAACC,eAAe,GAAG,KAAK;EACxB,CAACC,eAAe,GAAG,SAAS;EAC5B,CAACC,kBAAkB,GAAG,KAAK;EAEpBC,wBAAwB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;EAEpDC,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,KAAK,CACb,iFACF,CAAC;IACH;IAEAD,2BAAoB,CAACE,OAAO,CAAC,CAAC;EAChC;EAEA,CAACJ,cAAcK,CAAA,EAAY;IACzB,IAAI;MACF,MAAMC,eAAe,GAAGd,OAAO,CAAC,uBAAuB,CAAC;MACxD,MAAMe,mBAAmB,GAAGf,OAAO,CAAC,oCAAoC,CAAC;MACzE,IAAI,CAAC,CAACI,eAAe,GAAGW,mBAAmB,CAACC,OAAO;MACnD,IAAI,CAAC,CAACX,kBAAkB,GAAG,IAAI;MAE/B,IAAI,CAAC,CAACF,eAAe,GAAG,IAAI,CAACG,wBAAwB,CAACW,QAAQ,CAC5DF,mBAAmB,CAACC,OACtB,CAAC;MAED,IAAI,IAAI,CAAC,CAACb,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,kBAAkB,IAAI,IAAI,IACjCJ,MAAM,CAACK,oBAAoB,IAAI,IAAI,IACnCL,MAAM,CAACM,iBAAiB,IAAI,IAAI;EAEpC;EAEA,IAAIC,cAAcA,CAAA,EAA2B;IAC3C,OAAO,IAAI,CAAC,CAACxB,eAAe;EAC9B;;EAEA;AACF;AACA;AACA;EACE,IAAIyB,cAAcA,CAAA,EAAY;IAC5B,OAAO,IAAI,CAAC,CAACxB,eAAe;EAC9B;;EAEA;EACA,IAAIC,eAAeA,CAAA,EAAW;IAC5B,OAAO,IAAI,CAAC,CAACA,eAAe;EAC9B;;EAEA;AACF;AACA;AACA;EACE,IAAIwB,oBAAoBA,CAAA,EAAY;IAClC,OAAO,IAAI,CAAC,CAACvB,kBAAkB;EACjC;;EAEA;AACF;AACA;AACA;EACE,IAAIwB,0BAA0BA,CAAA,EAAY;IACxC;IACA,OAAO,IAAI,CAAC,CAAC1B,eAAe;EAC9B;EAEO2B,kBAAkBA,CAAA,EAA0B;IACjD,IAAI,CAAC,IAAI,CAAC,CAAC3B,eAAe,EAAE;MAC1B,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC,CAACD,eAAe,CAAE6B,oBAAoB,CAAC,qBAAqB,CAAC;EAC3E;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc,IAAIjC,cAAc,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
const mockGetter = value => value;
|
|
8
|
+
class AudioAPIModule {
|
|
9
|
+
supportedWorkletsVersion = [];
|
|
10
|
+
workletsModule = mockGetter(null);
|
|
11
|
+
canUseWorklets = mockGetter(false);
|
|
12
|
+
workletsVersion = mockGetter('unknown');
|
|
13
|
+
areWorkletsAvailable = mockGetter(false);
|
|
14
|
+
isWorkletsVersionSupported = mockGetter(false);
|
|
15
|
+
createAudioRuntime() {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
var _default = exports.default = new AudioAPIModule();
|
|
20
|
+
//# sourceMappingURL=AudioAPIModule.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["mockGetter","value","AudioAPIModule","supportedWorkletsVersion","workletsModule","canUseWorklets","workletsVersion","areWorkletsAvailable","isWorkletsVersionSupported","createAudioRuntime","_default","exports","default"],"sourceRoot":"../../../src","sources":["AudioAPIModule/AudioAPIModule.web.ts"],"mappings":";;;;;;AAEA,MAAMA,UAAU,GAAOC,KAAQ,IAAKA,KAAK;AAEzC,MAAMC,cAAc,CAA4B;EACvCC,wBAAwB,GAAG,EAAE;EACpCC,cAAc,GAAGJ,UAAU,CAAC,IAA8B,CAAC;EAC3DK,cAAc,GAAGL,UAAU,CAAC,KAAK,CAAC;EAClCM,eAAe,GAAGN,UAAU,CAAC,SAAS,CAAC;EACvCO,oBAAoB,GAAGP,UAAU,CAAC,KAAK,CAAC;EACxCQ,0BAA0B,GAAGR,UAAU,CAAC,KAAK,CAAC;EAE9CS,kBAAkBA,CAAA,EAAG;IACnB,OAAO,IAAI;EACb;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc,IAAIV,cAAc,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["AudioAPIModule/ModuleInterfaces.ts"],"mappings":"","ignoreList":[]}
|
package/lib/commonjs/api.js
CHANGED
|
@@ -21,12 +21,14 @@ var _exportNames = {
|
|
|
21
21
|
BiquadFilterNode: true,
|
|
22
22
|
ConstantSourceNode: true,
|
|
23
23
|
ConvolverNode: true,
|
|
24
|
+
DelayNode: true,
|
|
24
25
|
GainNode: true,
|
|
25
26
|
OfflineAudioContext: true,
|
|
26
27
|
OscillatorNode: true,
|
|
27
28
|
RecorderAdapterNode: true,
|
|
28
29
|
StereoPannerNode: true,
|
|
29
30
|
StreamerNode: true,
|
|
31
|
+
WaveShaperNode: true,
|
|
30
32
|
WorkletNode: true,
|
|
31
33
|
WorkletProcessingNode: true,
|
|
32
34
|
WorkletSourceNode: true,
|
|
@@ -134,6 +136,12 @@ Object.defineProperty(exports, "ConvolverNode", {
|
|
|
134
136
|
return _ConvolverNode.default;
|
|
135
137
|
}
|
|
136
138
|
});
|
|
139
|
+
Object.defineProperty(exports, "DelayNode", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
get: function () {
|
|
142
|
+
return _DelayNode.default;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
137
145
|
Object.defineProperty(exports, "FilePreset", {
|
|
138
146
|
enumerable: true,
|
|
139
147
|
get: function () {
|
|
@@ -236,6 +244,12 @@ Object.defineProperty(exports, "StreamerNode", {
|
|
|
236
244
|
return _StreamerNode.default;
|
|
237
245
|
}
|
|
238
246
|
});
|
|
247
|
+
Object.defineProperty(exports, "WaveShaperNode", {
|
|
248
|
+
enumerable: true,
|
|
249
|
+
get: function () {
|
|
250
|
+
return _WaveShaperNode.default;
|
|
251
|
+
}
|
|
252
|
+
});
|
|
239
253
|
Object.defineProperty(exports, "WorkletNode", {
|
|
240
254
|
enumerable: true,
|
|
241
255
|
get: function () {
|
|
@@ -295,12 +309,14 @@ var _BaseAudioContext = _interopRequireDefault(require("./core/BaseAudioContext"
|
|
|
295
309
|
var _BiquadFilterNode = _interopRequireDefault(require("./core/BiquadFilterNode"));
|
|
296
310
|
var _ConstantSourceNode = _interopRequireDefault(require("./core/ConstantSourceNode"));
|
|
297
311
|
var _ConvolverNode = _interopRequireDefault(require("./core/ConvolverNode"));
|
|
312
|
+
var _DelayNode = _interopRequireDefault(require("./core/DelayNode"));
|
|
298
313
|
var _GainNode = _interopRequireDefault(require("./core/GainNode"));
|
|
299
314
|
var _OfflineAudioContext = _interopRequireDefault(require("./core/OfflineAudioContext"));
|
|
300
315
|
var _OscillatorNode = _interopRequireDefault(require("./core/OscillatorNode"));
|
|
301
316
|
var _RecorderAdapterNode = _interopRequireDefault(require("./core/RecorderAdapterNode"));
|
|
302
317
|
var _StereoPannerNode = _interopRequireDefault(require("./core/StereoPannerNode"));
|
|
303
318
|
var _StreamerNode = _interopRequireDefault(require("./core/StreamerNode"));
|
|
319
|
+
var _WaveShaperNode = _interopRequireDefault(require("./core/WaveShaperNode"));
|
|
304
320
|
var _WorkletNode = _interopRequireDefault(require("./core/WorkletNode"));
|
|
305
321
|
var _WorkletProcessingNode = _interopRequireDefault(require("./core/WorkletProcessingNode"));
|
|
306
322
|
var _WorkletSourceNode = _interopRequireDefault(require("./core/WorkletSourceNode"));
|