react-native-audio-api 0.11.0-nightly-141c86f-20251118 → 0.11.0-nightly-4e6f25c-20251119
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/AudioAPIModule.cpp +10 -16
- package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +4 -4
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +11 -20
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +24 -46
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +48 -78
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -21
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +42 -78
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +14 -18
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
- package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +16 -28
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +4 -6
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +8 -10
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +13 -27
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +11 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +15 -22
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +7 -12
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -9
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +16 -30
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +6 -10
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +4 -8
- package/common/cpp/audioapi/core/AudioContext.cpp +4 -4
- package/common/cpp/audioapi/core/AudioContext.h +5 -2
- package/common/cpp/audioapi/core/AudioNode.cpp +13 -19
- package/common/cpp/audioapi/core/AudioNode.h +14 -7
- package/common/cpp/audioapi/core/AudioParam.cpp +66 -98
- package/common/cpp/audioapi/core/AudioParam.h +20 -12
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +22 -34
- package/common/cpp/audioapi/core/BaseAudioContext.h +19 -15
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
- package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +17 -36
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +2 -9
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +18 -28
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +19 -10
- package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
- package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
- package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +9 -8
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +4 -5
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +31 -53
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +35 -33
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +19 -20
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +38 -36
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +25 -40
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +9 -9
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +3 -3
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +18 -16
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +7 -4
- package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -30
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
- package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +13 -22
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
- package/common/cpp/audioapi/core/utils/Constants.h +5 -3
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +29 -34
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +14 -16
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +3 -9
- package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +13 -25
- package/common/cpp/audioapi/dsp/Convolver.h +26 -24
- package/common/cpp/audioapi/dsp/FFT.cpp +1 -1
- package/common/cpp/audioapi/dsp/FFT.h +5 -13
- package/common/cpp/audioapi/dsp/VectorMath.cpp +9 -43
- package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
- package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
- package/common/cpp/audioapi/dsp/Windows.h +24 -23
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +44 -39
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
- package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
- package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +11 -21
- package/common/cpp/audioapi/jsi/JsiPromise.h +55 -46
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
- package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
- package/common/cpp/audioapi/utils/AudioArray.h +3 -11
- package/common/cpp/audioapi/utils/AudioBus.cpp +51 -149
- package/common/cpp/audioapi/utils/AudioBus.h +15 -15
- package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
- package/common/cpp/test/src/AudioParamTest.cpp +3 -2
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +14 -35
- package/common/cpp/test/src/ConstantSourceTest.cpp +4 -6
- package/common/cpp/test/src/GainTest.cpp +3 -4
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
- package/common/cpp/test/src/OscillatorTest.cpp +1 -0
- package/common/cpp/test/src/StereoPannerTest.cpp +5 -8
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +10 -27
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +7 -6
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +16 -28
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +13 -6
- package/ios/audioapi/ios/AudioAPIModule.h +4 -6
- package/ios/audioapi/ios/AudioAPIModule.mm +31 -46
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +24 -33
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +4 -6
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +3 -5
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +1 -2
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +21 -33
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +17 -37
- package/ios/audioapi/ios/system/AudioEngine.h +2 -4
- package/ios/audioapi/ios/system/AudioEngine.mm +7 -19
- package/ios/audioapi/ios/system/AudioSessionManager.h +2 -4
- package/ios/audioapi/ios/system/AudioSessionManager.mm +17 -32
- package/ios/audioapi/ios/system/LockScreenManager.mm +73 -105
- package/ios/audioapi/ios/system/NotificationManager.mm +43 -68
- package/package.json +2 -2
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include <audioapi/utils/AudioBus.h>
|
|
6
6
|
#include <gtest/gtest.h>
|
|
7
7
|
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
8
9
|
|
|
9
10
|
using namespace audioapi;
|
|
10
11
|
|
|
@@ -23,8 +24,7 @@ class ConstantSourceTest : public ::testing::Test {
|
|
|
23
24
|
|
|
24
25
|
class TestableConstantSourceNode : public ConstantSourceNode {
|
|
25
26
|
public:
|
|
26
|
-
explicit TestableConstantSourceNode(BaseAudioContext *context)
|
|
27
|
-
: ConstantSourceNode(context) {}
|
|
27
|
+
explicit TestableConstantSourceNode(BaseAudioContext *context) : ConstantSourceNode(context) {}
|
|
28
28
|
|
|
29
29
|
void setOffsetParam(float value) {
|
|
30
30
|
getOffsetParam()->setValue(value);
|
|
@@ -45,10 +45,8 @@ TEST_F(ConstantSourceTest, ConstantSourceCanBeCreated) {
|
|
|
45
45
|
TEST_F(ConstantSourceTest, ConstantSourceOutputsConstantValue) {
|
|
46
46
|
static constexpr int FRAMES_TO_PROCESS = 4;
|
|
47
47
|
|
|
48
|
-
auto bus =
|
|
49
|
-
|
|
50
|
-
auto constantSource =
|
|
51
|
-
std::make_shared<TestableConstantSourceNode>(context.get());
|
|
48
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
49
|
+
auto constantSource = std::make_shared<TestableConstantSourceNode>(context.get());
|
|
52
50
|
constantSource->start(context->getCurrentTime());
|
|
53
51
|
auto resultBus = constantSource->processNode(bus, FRAMES_TO_PROCESS);
|
|
54
52
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include <audioapi/utils/AudioBus.h>
|
|
6
6
|
#include <gtest/gtest.h>
|
|
7
7
|
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
8
9
|
|
|
9
10
|
using namespace audioapi;
|
|
10
11
|
|
|
@@ -47,8 +48,7 @@ TEST_F(GainTest, GainModulatesVolumeCorrectly) {
|
|
|
47
48
|
auto gainNode = std::make_shared<TestableGainNode>(context.get());
|
|
48
49
|
gainNode->setGainParam(GAIN_VALUE);
|
|
49
50
|
|
|
50
|
-
auto bus =
|
|
51
|
-
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
51
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
52
52
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
53
53
|
bus->getChannel(0)->getData()[i] = i + 1;
|
|
54
54
|
}
|
|
@@ -65,8 +65,7 @@ TEST_F(GainTest, GainModulatesVolumeCorrectlyMultiChannel) {
|
|
|
65
65
|
auto gainNode = std::make_shared<TestableGainNode>(context.get());
|
|
66
66
|
gainNode->setGainParam(GAIN_VALUE);
|
|
67
67
|
|
|
68
|
-
auto bus =
|
|
69
|
-
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
68
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
70
69
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
71
70
|
bus->getChannel(0)->getData()[i] = i + 1;
|
|
72
71
|
bus->getChannel(1)->getData()[i] = -i - 1;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include <gmock/gmock.h>
|
|
4
3
|
#include <audioapi/events/IAudioEventHandlerRegistry.h>
|
|
5
|
-
#include <
|
|
6
|
-
#include <string>
|
|
4
|
+
#include <gmock/gmock.h>
|
|
7
5
|
#include <memory>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <unordered_map>
|
|
8
8
|
|
|
9
9
|
using namespace audioapi;
|
|
10
10
|
|
|
@@ -12,13 +12,21 @@ using EventMap = std::unordered_map<std::string, EventValue>;
|
|
|
12
12
|
|
|
13
13
|
class MockAudioEventHandlerRegistry : public IAudioEventHandlerRegistry {
|
|
14
14
|
public:
|
|
15
|
-
MOCK_METHOD(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
MOCK_METHOD(
|
|
16
|
+
uint64_t,
|
|
17
|
+
registerHandler,
|
|
18
|
+
(const std::string &eventName, const std::shared_ptr<facebook::jsi::Function> &handler),
|
|
19
|
+
(override));
|
|
20
|
+
MOCK_METHOD(
|
|
21
|
+
void,
|
|
22
|
+
unregisterHandler,
|
|
23
|
+
(const std::string &eventName, uint64_t listenerId),
|
|
24
|
+
(override));
|
|
19
25
|
|
|
20
|
-
MOCK_METHOD2(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
MOCK_METHOD2(
|
|
27
|
+
invokeHandlerWithEventBody,
|
|
28
|
+
void(const std::string &eventName, const EventMap &body));
|
|
29
|
+
MOCK_METHOD3(
|
|
30
|
+
invokeHandlerWithEventBody,
|
|
31
|
+
void(const std::string &eventName, uint64_t listenerId, const EventMap &body));
|
|
24
32
|
};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include <audioapi/utils/AudioBus.h>
|
|
6
6
|
#include <gtest/gtest.h>
|
|
7
7
|
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
8
9
|
|
|
9
10
|
using namespace audioapi;
|
|
10
11
|
|
|
@@ -23,8 +24,7 @@ class StereoPannerTest : public ::testing::Test {
|
|
|
23
24
|
|
|
24
25
|
class TestableStereoPannerNode : public StereoPannerNode {
|
|
25
26
|
public:
|
|
26
|
-
explicit TestableStereoPannerNode(BaseAudioContext *context)
|
|
27
|
-
: StereoPannerNode(context) {}
|
|
27
|
+
explicit TestableStereoPannerNode(BaseAudioContext *context) : StereoPannerNode(context) {}
|
|
28
28
|
|
|
29
29
|
void setPanParam(float value) {
|
|
30
30
|
getPanParam()->setValue(value);
|
|
@@ -48,8 +48,7 @@ TEST_F(StereoPannerTest, PanModulatesInputMonoCorrectly) {
|
|
|
48
48
|
auto panNode = std::make_shared<TestableStereoPannerNode>(context.get());
|
|
49
49
|
panNode->setPanParam(PAN_VALUE);
|
|
50
50
|
|
|
51
|
-
auto bus =
|
|
52
|
-
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
51
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 1, sampleRate);
|
|
53
52
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
54
53
|
(*bus->getChannelByType(AudioBus::ChannelLeft))[i] = i + 1;
|
|
55
54
|
}
|
|
@@ -76,8 +75,7 @@ TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithNegativePan) {
|
|
|
76
75
|
auto panNode = std::make_shared<TestableStereoPannerNode>(context.get());
|
|
77
76
|
panNode->setPanParam(PAN_VALUE);
|
|
78
77
|
|
|
79
|
-
auto bus =
|
|
80
|
-
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
78
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
81
79
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
82
80
|
(*bus->getChannelByType(AudioBus::ChannelLeft))[i] = i + 1;
|
|
83
81
|
(*bus->getChannelByType(AudioBus::ChannelRight))[i] = i + 1;
|
|
@@ -105,8 +103,7 @@ TEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithPositivePan) {
|
|
|
105
103
|
auto panNode = std::make_shared<TestableStereoPannerNode>(context.get());
|
|
106
104
|
panNode->setPanParam(PAN_VALUE);
|
|
107
105
|
|
|
108
|
-
auto bus =
|
|
109
|
-
std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
106
|
+
auto bus = std::make_shared<audioapi::AudioBus>(FRAMES_TO_PROCESS, 2, sampleRate);
|
|
110
107
|
for (size_t i = 0; i < bus->getSize(); ++i) {
|
|
111
108
|
(*bus->getChannelByType(AudioBus::ChannelLeft))[i] = i + 1;
|
|
112
109
|
(*bus->getChannelByType(AudioBus::ChannelRight))[i] = i + 1;
|
|
@@ -86,32 +86,22 @@ void getFrequencyResponse(
|
|
|
86
86
|
phase_response[k] = std::nanf("");
|
|
87
87
|
} else {
|
|
88
88
|
double omega = -PI * normalizedFreq[k];
|
|
89
|
-
std::complex<double> z =
|
|
90
|
-
std::complex<double>(std::cos(omega), std::sin(omega));
|
|
89
|
+
std::complex<double> z = std::complex<double>(std::cos(omega), std::sin(omega));
|
|
91
90
|
std::complex<double> numerator = b0 + (b1 + b2 * z) * z;
|
|
92
|
-
std::complex<double> denominator =
|
|
93
|
-
std::complex<double>(1, 0) + (a1 + a2 * z) * z;
|
|
91
|
+
std::complex<double> denominator = std::complex<double>(1, 0) + (a1 + a2 * z) * z;
|
|
94
92
|
std::complex<double> response = numerator / denominator;
|
|
95
93
|
mag_response[k] = static_cast<float>(abs(response));
|
|
96
|
-
phase_response[k] =
|
|
97
|
-
static_cast<float>(std::atan2(imag(response), real(response)));
|
|
94
|
+
phase_response[k] = static_cast<float>(std::atan2(imag(response), real(response)));
|
|
98
95
|
}
|
|
99
96
|
}
|
|
100
97
|
}
|
|
101
98
|
|
|
102
|
-
BiquadCoefficients
|
|
103
|
-
|
|
104
|
-
double b1,
|
|
105
|
-
double b2,
|
|
106
|
-
double a0,
|
|
107
|
-
double a1,
|
|
108
|
-
double a2) {
|
|
99
|
+
BiquadCoefficients
|
|
100
|
+
normalizeCoefficients(double b0, double b1, double b2, double a0, double a1, double a2) {
|
|
109
101
|
return BiquadCoefficients{b0 / a0, b1 / a0, b2 / a0, a1 / a0, a2 / a0};
|
|
110
102
|
}
|
|
111
103
|
|
|
112
|
-
BiquadCoefficients calculateLowpassCoefficients(
|
|
113
|
-
double cutoff,
|
|
114
|
-
double resonance) {
|
|
104
|
+
BiquadCoefficients calculateLowpassCoefficients(double cutoff, double resonance) {
|
|
115
105
|
// Limit cutoff to 0 to 1.
|
|
116
106
|
cutoff = std::clamp(cutoff, 0.0, 1.0);
|
|
117
107
|
|
|
@@ -144,9 +134,7 @@ BiquadCoefficients calculateLowpassCoefficients(
|
|
|
144
134
|
}
|
|
145
135
|
}
|
|
146
136
|
|
|
147
|
-
BiquadCoefficients calculateHighpassCoefficients(
|
|
148
|
-
double cutoff,
|
|
149
|
-
double resonance) {
|
|
137
|
+
BiquadCoefficients calculateHighpassCoefficients(double cutoff, double resonance) {
|
|
150
138
|
// Limit cutoff to 0 to 1.
|
|
151
139
|
cutoff = std::clamp(cutoff, 0.0, 1.0);
|
|
152
140
|
|
|
@@ -180,9 +168,7 @@ BiquadCoefficients calculateHighpassCoefficients(
|
|
|
180
168
|
}
|
|
181
169
|
}
|
|
182
170
|
|
|
183
|
-
BiquadCoefficients calculateLowshelfCoefficients(
|
|
184
|
-
double frequency,
|
|
185
|
-
double db_gain) {
|
|
171
|
+
BiquadCoefficients calculateLowshelfCoefficients(double frequency, double db_gain) {
|
|
186
172
|
// Clip frequencies to between 0 and 1, inclusive.
|
|
187
173
|
frequency = std::clamp(frequency, 0.0, 1.0);
|
|
188
174
|
|
|
@@ -214,9 +200,7 @@ BiquadCoefficients calculateLowshelfCoefficients(
|
|
|
214
200
|
}
|
|
215
201
|
}
|
|
216
202
|
|
|
217
|
-
BiquadCoefficients calculateHighshelfCoefficients(
|
|
218
|
-
double frequency,
|
|
219
|
-
double db_gain) {
|
|
203
|
+
BiquadCoefficients calculateHighshelfCoefficients(double frequency, double db_gain) {
|
|
220
204
|
// Clip frequencies to between 0 and 1, inclusive.
|
|
221
205
|
frequency = std::clamp(frequency, 0.0, 1.0);
|
|
222
206
|
|
|
@@ -248,8 +232,7 @@ BiquadCoefficients calculateHighshelfCoefficients(
|
|
|
248
232
|
}
|
|
249
233
|
}
|
|
250
234
|
|
|
251
|
-
BiquadCoefficients
|
|
252
|
-
calculatePeakingCoefficients(double frequency, double q, double db_gain) {
|
|
235
|
+
BiquadCoefficients calculatePeakingCoefficients(double frequency, double q, double db_gain) {
|
|
253
236
|
// Clip frequencies to between 0 and 1, inclusive.
|
|
254
237
|
frequency = std::clamp(frequency, 0.0, 1.0);
|
|
255
238
|
|
|
@@ -44,13 +44,14 @@ struct BiquadCoefficients {
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
void getFrequencyResponse(
|
|
47
|
-
const BiquadCoefficients &coeffs,
|
|
48
|
-
std::span<const float> frequency,
|
|
49
|
-
std::span<float> mag_response,
|
|
50
|
-
std::span<float> phase_response,
|
|
51
|
-
float nyquistFrequency);
|
|
47
|
+
const BiquadCoefficients &coeffs,
|
|
48
|
+
std::span<const float> frequency,
|
|
49
|
+
std::span<float> mag_response,
|
|
50
|
+
std::span<float> phase_response,
|
|
51
|
+
float nyquistFrequency);
|
|
52
52
|
|
|
53
|
-
BiquadCoefficients
|
|
53
|
+
BiquadCoefficients
|
|
54
|
+
normalizeCoefficients(double b0, double b1, double b2, double a0, double a1, double a2);
|
|
54
55
|
|
|
55
56
|
BiquadCoefficients calculateLowpassCoefficients(double cutoff, double Q);
|
|
56
57
|
BiquadCoefficients calculateHighpassCoefficients(double cutoff, double Q);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#include <test/src/biquad/BiquadFilterChromium.h>
|
|
2
2
|
#include <test/src/biquad/BiquadFilterTest.h>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <vector>
|
|
3
5
|
|
|
4
6
|
namespace audioapi {
|
|
5
7
|
|
|
@@ -18,8 +20,7 @@ void BiquadFilterTest::testLowpass(float frequency, float Q) {
|
|
|
18
20
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
19
21
|
|
|
20
22
|
node->setLowpassCoefficients(normalizedFrequency, Q);
|
|
21
|
-
expectCoefficientsNear(
|
|
22
|
-
node, calculateLowpassCoefficients(normalizedFrequency, Q));
|
|
23
|
+
expectCoefficientsNear(node, calculateLowpassCoefficients(normalizedFrequency, Q));
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
void BiquadFilterTest::testHighpass(float frequency, float Q) {
|
|
@@ -27,8 +28,7 @@ void BiquadFilterTest::testHighpass(float frequency, float Q) {
|
|
|
27
28
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
28
29
|
|
|
29
30
|
node->setHighpassCoefficients(normalizedFrequency, Q);
|
|
30
|
-
expectCoefficientsNear(
|
|
31
|
-
node, calculateHighpassCoefficients(normalizedFrequency, Q));
|
|
31
|
+
expectCoefficientsNear(node, calculateHighpassCoefficients(normalizedFrequency, Q));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
void BiquadFilterTest::testBandpass(float frequency, float Q) {
|
|
@@ -36,8 +36,7 @@ void BiquadFilterTest::testBandpass(float frequency, float Q) {
|
|
|
36
36
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
37
37
|
|
|
38
38
|
node->setBandpassCoefficients(normalizedFrequency, Q);
|
|
39
|
-
expectCoefficientsNear(
|
|
40
|
-
node, calculateBandpassCoefficients(normalizedFrequency, Q));
|
|
39
|
+
expectCoefficientsNear(node, calculateBandpassCoefficients(normalizedFrequency, Q));
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
void BiquadFilterTest::testNotch(float frequency, float Q) {
|
|
@@ -45,8 +44,7 @@ void BiquadFilterTest::testNotch(float frequency, float Q) {
|
|
|
45
44
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
46
45
|
|
|
47
46
|
node->setNotchCoefficients(normalizedFrequency, Q);
|
|
48
|
-
expectCoefficientsNear(
|
|
49
|
-
node, calculateNotchCoefficients(normalizedFrequency, Q));
|
|
47
|
+
expectCoefficientsNear(node, calculateNotchCoefficients(normalizedFrequency, Q));
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
void BiquadFilterTest::testAllpass(float frequency, float Q) {
|
|
@@ -54,8 +52,7 @@ void BiquadFilterTest::testAllpass(float frequency, float Q) {
|
|
|
54
52
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
55
53
|
|
|
56
54
|
node->setAllpassCoefficients(normalizedFrequency, Q);
|
|
57
|
-
expectCoefficientsNear(
|
|
58
|
-
node, calculateAllpassCoefficients(normalizedFrequency, Q));
|
|
55
|
+
expectCoefficientsNear(node, calculateAllpassCoefficients(normalizedFrequency, Q));
|
|
59
56
|
}
|
|
60
57
|
|
|
61
58
|
void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
|
|
@@ -63,8 +60,7 @@ void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
|
|
|
63
60
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
64
61
|
|
|
65
62
|
node->setPeakingCoefficients(normalizedFrequency, Q, gain);
|
|
66
|
-
expectCoefficientsNear(
|
|
67
|
-
node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
|
|
63
|
+
expectCoefficientsNear(node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
|
|
68
64
|
}
|
|
69
65
|
|
|
70
66
|
void BiquadFilterTest::testLowshelf(float frequency, float gain) {
|
|
@@ -72,8 +68,7 @@ void BiquadFilterTest::testLowshelf(float frequency, float gain) {
|
|
|
72
68
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
73
69
|
|
|
74
70
|
node->setLowshelfCoefficients(normalizedFrequency, gain);
|
|
75
|
-
expectCoefficientsNear(
|
|
76
|
-
node, calculateLowshelfCoefficients(normalizedFrequency, gain));
|
|
71
|
+
expectCoefficientsNear(node, calculateLowshelfCoefficients(normalizedFrequency, gain));
|
|
77
72
|
}
|
|
78
73
|
|
|
79
74
|
void BiquadFilterTest::testHighshelf(float frequency, float gain) {
|
|
@@ -81,17 +76,16 @@ void BiquadFilterTest::testHighshelf(float frequency, float gain) {
|
|
|
81
76
|
float normalizedFrequency = frequency / nyquistFrequency;
|
|
82
77
|
|
|
83
78
|
node->setHighshelfCoefficients(normalizedFrequency, gain);
|
|
84
|
-
expectCoefficientsNear(
|
|
85
|
-
node, calculateHighshelfCoefficients(normalizedFrequency, gain));
|
|
79
|
+
expectCoefficientsNear(node, calculateHighshelfCoefficients(normalizedFrequency, gain));
|
|
86
80
|
}
|
|
87
81
|
|
|
88
82
|
INSTANTIATE_TEST_SUITE_P(
|
|
89
83
|
Frequencies,
|
|
90
84
|
BiquadFilterFrequencyTest,
|
|
91
85
|
::testing::Values(
|
|
92
|
-
0.0f,
|
|
93
|
-
10.0f,
|
|
94
|
-
350.0f,
|
|
86
|
+
0.0f, // 0 Hz - the filter should block all input signal
|
|
87
|
+
10.0f, // very low frequency
|
|
88
|
+
350.0f, // default
|
|
95
89
|
nyquistFrequency - 0.0001f, // frequency near Nyquist
|
|
96
90
|
nyquistFrequency)); // maximal frequency
|
|
97
91
|
|
|
@@ -255,25 +249,19 @@ TEST_F(BiquadFilterTest, GetFrequencyResponse) {
|
|
|
255
249
|
phaseResponseNode.data(),
|
|
256
250
|
TestFrequencies.size());
|
|
257
251
|
getFrequencyResponse(
|
|
258
|
-
coeffs,
|
|
259
|
-
TestFrequencies,
|
|
260
|
-
magResponseExpected,
|
|
261
|
-
phaseResponseExpected,
|
|
262
|
-
nyquistFrequency);
|
|
252
|
+
coeffs, TestFrequencies, magResponseExpected, phaseResponseExpected, nyquistFrequency);
|
|
263
253
|
|
|
264
254
|
for (size_t i = 0; i < TestFrequencies.size(); ++i) {
|
|
265
255
|
float f = TestFrequencies[i];
|
|
266
256
|
if (std::isnan(magResponseExpected[i])) {
|
|
267
|
-
EXPECT_TRUE(std::isnan(magResponseNode[i]))
|
|
268
|
-
<< "Expected NaN at frequency " << f;
|
|
257
|
+
EXPECT_TRUE(std::isnan(magResponseNode[i])) << "Expected NaN at frequency " << f;
|
|
269
258
|
} else {
|
|
270
259
|
EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)
|
|
271
260
|
<< "Magnitude mismatch at " << f << " Hz";
|
|
272
261
|
}
|
|
273
262
|
|
|
274
263
|
if (std::isnan(phaseResponseExpected[i])) {
|
|
275
|
-
EXPECT_TRUE(std::isnan(phaseResponseNode[i]))
|
|
276
|
-
<< "Expected NaN at frequency " << f;
|
|
264
|
+
EXPECT_TRUE(std::isnan(phaseResponseNode[i])) << "Expected NaN at frequency " << f;
|
|
277
265
|
} else {
|
|
278
266
|
EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)
|
|
279
267
|
<< "Phase mismatch at " << f << " Hz";
|
|
@@ -19,10 +19,13 @@ class BiquadFilterTest : public ::testing::Test {
|
|
|
19
19
|
|
|
20
20
|
void SetUp() override {
|
|
21
21
|
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
22
|
-
context = std::make_unique<OfflineAudioContext>(
|
|
22
|
+
context = std::make_unique<OfflineAudioContext>(
|
|
23
|
+
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
void expectCoefficientsNear(
|
|
26
|
+
void expectCoefficientsNear(
|
|
27
|
+
const std::shared_ptr<BiquadFilterNode> &node,
|
|
28
|
+
const BiquadCoefficients &expected);
|
|
26
29
|
void testLowpass(float frequency, float Q);
|
|
27
30
|
void testHighpass(float frequency, float Q);
|
|
28
31
|
void testBandpass(float frequency, float Q);
|
|
@@ -33,8 +36,12 @@ class BiquadFilterTest : public ::testing::Test {
|
|
|
33
36
|
void testHighshelf(float frequency, float gain);
|
|
34
37
|
};
|
|
35
38
|
|
|
36
|
-
class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest,
|
|
37
|
-
|
|
38
|
-
class
|
|
39
|
-
|
|
39
|
+
class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest,
|
|
40
|
+
public ::testing::WithParamInterface<float> {};
|
|
41
|
+
class BiquadFilterQTestRestTypes : public BiquadFilterTest,
|
|
42
|
+
public ::testing::WithParamInterface<float> {};
|
|
43
|
+
class BiquadFilterFrequencyTest : public BiquadFilterTest,
|
|
44
|
+
public ::testing::WithParamInterface<float> {};
|
|
45
|
+
class BiquadFilterGainTest : public BiquadFilterTest,
|
|
46
|
+
public ::testing::WithParamInterface<float> {};
|
|
40
47
|
} // namespace audioapi
|
|
@@ -13,12 +13,11 @@
|
|
|
13
13
|
@class AudioSessionManager;
|
|
14
14
|
@class LockScreenManager;
|
|
15
15
|
|
|
16
|
-
@interface AudioAPIModule
|
|
17
|
-
: RCTEventEmitter
|
|
16
|
+
@interface AudioAPIModule : RCTEventEmitter
|
|
18
17
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
19
|
-
|
|
18
|
+
<NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
|
|
20
19
|
#else
|
|
21
|
-
|
|
20
|
+
<RCTBridgeModule>
|
|
22
21
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
23
22
|
|
|
24
23
|
@property (nonatomic, strong) AudioEngine *audioEngine;
|
|
@@ -26,7 +25,6 @@
|
|
|
26
25
|
@property (nonatomic, strong) AudioSessionManager *audioSessionManager;
|
|
27
26
|
@property (nonatomic, strong) LockScreenManager *lockScreenManager;
|
|
28
27
|
|
|
29
|
-
- (void)invokeHandlerWithEventName:(NSString *)eventName
|
|
30
|
-
eventBody:(NSDictionary *)eventBody;
|
|
28
|
+
- (void)invokeHandlerWithEventName:(NSString *)eventName eventBody:(NSDictionary *)eventBody;
|
|
31
29
|
|
|
32
30
|
@end
|
|
@@ -62,15 +62,11 @@ RCT_EXPORT_MODULE(AudioAPIModule);
|
|
|
62
62
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
63
63
|
{
|
|
64
64
|
self.audioSessionManager = [[AudioSessionManager alloc] init];
|
|
65
|
-
self.audioEngine = [[AudioEngine alloc]
|
|
66
|
-
|
|
67
|
-
self.
|
|
68
|
-
[[LockScreenManager alloc] initWithAudioAPIModule:self];
|
|
69
|
-
self.notificationManager =
|
|
70
|
-
[[NotificationManager alloc] initWithAudioAPIModule:self];
|
|
65
|
+
self.audioEngine = [[AudioEngine alloc] initWithAudioSessionManager:self.audioSessionManager];
|
|
66
|
+
self.lockScreenManager = [[LockScreenManager alloc] initWithAudioAPIModule:self];
|
|
67
|
+
self.notificationManager = [[NotificationManager alloc] initWithAudioAPIModule:self];
|
|
71
68
|
|
|
72
|
-
auto jsiRuntime =
|
|
73
|
-
reinterpret_cast<facebook::jsi::Runtime *>(self.bridge.runtime);
|
|
69
|
+
auto jsiRuntime = reinterpret_cast<facebook::jsi::Runtime *>(self.bridge.runtime);
|
|
74
70
|
|
|
75
71
|
#if defined(RCT_NEW_ARCH_ENABLED)
|
|
76
72
|
auto jsCallInvoker = _callInvoker.callInvoker;
|
|
@@ -80,12 +76,10 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
80
76
|
|
|
81
77
|
assert(jsiRuntime != nullptr);
|
|
82
78
|
|
|
83
|
-
_eventHandler =
|
|
84
|
-
std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);
|
|
79
|
+
_eventHandler = std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);
|
|
85
80
|
|
|
86
81
|
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
87
|
-
WorkletsModule *workletsModule =
|
|
88
|
-
[_moduleRegistry moduleForName:"WorkletsModule"];
|
|
82
|
+
WorkletsModule *workletsModule = [_moduleRegistry moduleForName:"WorkletsModule"];
|
|
89
83
|
|
|
90
84
|
if (!workletsModule) {
|
|
91
85
|
NSLog(@"WorkletsModule not found in module registry");
|
|
@@ -109,8 +103,7 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
109
103
|
audioapi::AudioAPIModuleInstaller::injectJSIBindings(
|
|
110
104
|
jsiRuntime, jsCallInvoker, _eventHandler, uiWorkletRuntime);
|
|
111
105
|
#else
|
|
112
|
-
audioapi::AudioAPIModuleInstaller::injectJSIBindings(
|
|
113
|
-
jsiRuntime, jsCallInvoker, _eventHandler);
|
|
106
|
+
audioapi::AudioAPIModuleInstaller::injectJSIBindings(jsiRuntime, jsCallInvoker, _eventHandler);
|
|
114
107
|
#endif
|
|
115
108
|
|
|
116
109
|
NSLog(@"Successfully installed JSI bindings for react-native-audio-api!");
|
|
@@ -126,22 +119,21 @@ RCT_EXPORT_METHOD(
|
|
|
126
119
|
setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
|
|
127
120
|
resolve reject : (RCTPromiseRejectBlock)reject)
|
|
128
121
|
{
|
|
129
|
-
dispatch_async(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
});
|
|
122
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
123
|
+
if (!self.audioSessionManager.shouldManageSession) {
|
|
124
|
+
[self.audioSessionManager setShouldManageSession:true];
|
|
125
|
+
}
|
|
126
|
+
if ([self.audioSessionManager setActive:enabled]) {
|
|
127
|
+
resolve(@"true");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
resolve(@"false");
|
|
131
|
+
});
|
|
140
132
|
}
|
|
141
133
|
|
|
142
134
|
RCT_EXPORT_METHOD(
|
|
143
|
-
setAudioSessionOptions : (NSString *)category mode : (NSString *)
|
|
144
|
-
|
|
135
|
+
setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
|
|
136
|
+
options allowHaptics : (BOOL)allowHaptics)
|
|
145
137
|
{
|
|
146
138
|
if (!self.audioSessionManager.shouldManageSession) {
|
|
147
139
|
[self.audioSessionManager setShouldManageSession:true];
|
|
@@ -162,8 +154,7 @@ RCT_EXPORT_METHOD(resetLockScreenInfo)
|
|
|
162
154
|
[self.lockScreenManager resetLockScreenInfo];
|
|
163
155
|
}
|
|
164
156
|
|
|
165
|
-
RCT_EXPORT_METHOD(
|
|
166
|
-
enableRemoteCommand : (NSString *)name enabled : (BOOL)enabled)
|
|
157
|
+
RCT_EXPORT_METHOD(enableRemoteCommand : (NSString *)name enabled : (BOOL)enabled)
|
|
167
158
|
{
|
|
168
159
|
[self.lockScreenManager enableRemoteCommand:name enabled:enabled];
|
|
169
160
|
}
|
|
@@ -187,31 +178,27 @@ RCT_EXPORT_METHOD(
|
|
|
187
178
|
requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
188
179
|
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
189
180
|
{
|
|
190
|
-
dispatch_async(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
reject:reject];
|
|
194
|
-
});
|
|
181
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
182
|
+
[self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
|
|
183
|
+
});
|
|
195
184
|
}
|
|
196
185
|
|
|
197
186
|
RCT_EXPORT_METHOD(
|
|
198
187
|
checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
199
188
|
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
200
189
|
{
|
|
201
|
-
dispatch_async(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
reject:reject];
|
|
205
|
-
});
|
|
190
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
191
|
+
[self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
|
|
192
|
+
});
|
|
206
193
|
}
|
|
207
194
|
|
|
208
195
|
RCT_EXPORT_METHOD(
|
|
209
196
|
getDevicesInfo : (nonnull RCTPromiseResolveBlock)
|
|
210
197
|
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
211
198
|
{
|
|
212
|
-
dispatch_async(
|
|
213
|
-
|
|
214
|
-
|
|
199
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
200
|
+
[self.audioSessionManager getDevicesInfo:resolve reject:reject];
|
|
201
|
+
});
|
|
215
202
|
}
|
|
216
203
|
|
|
217
204
|
RCT_EXPORT_METHOD(disableSessionManagement)
|
|
@@ -227,8 +214,7 @@ RCT_EXPORT_METHOD(disableSessionManagement)
|
|
|
227
214
|
}
|
|
228
215
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
229
216
|
|
|
230
|
-
- (void)invokeHandlerWithEventName:(NSString *)eventName
|
|
231
|
-
eventBody:(NSDictionary *)eventBody
|
|
217
|
+
- (void)invokeHandlerWithEventName:(NSString *)eventName eventBody:(NSDictionary *)eventBody
|
|
232
218
|
{
|
|
233
219
|
auto name = [eventName UTF8String];
|
|
234
220
|
|
|
@@ -262,8 +248,7 @@ RCT_EXPORT_METHOD(disableSessionManagement)
|
|
|
262
248
|
|
|
263
249
|
- (dispatch_queue_t)methodQueue
|
|
264
250
|
{
|
|
265
|
-
return dispatch_queue_create(
|
|
266
|
-
"swmansion.audioapi.Queue", DISPATCH_QUEUE_SERIAL);
|
|
251
|
+
return dispatch_queue_create("swmansion.audioapi.Queue", DISPATCH_QUEUE_SERIAL);
|
|
267
252
|
}
|
|
268
253
|
|
|
269
254
|
@end
|
|
@@ -13,45 +13,36 @@ IOSAudioPlayer::IOSAudioPlayer(
|
|
|
13
13
|
const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
|
|
14
14
|
float sampleRate,
|
|
15
15
|
int channelCount)
|
|
16
|
-
: renderAudio_(renderAudio),
|
|
17
|
-
channelCount_(channelCount),
|
|
18
|
-
audioBus_(0),
|
|
19
|
-
isRunning_(false)
|
|
16
|
+
: renderAudio_(renderAudio), channelCount_(channelCount), audioBus_(0), isRunning_(false)
|
|
20
17
|
{
|
|
21
|
-
RenderAudioBlock renderAudioBlock =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
processedFrames += framesToProcess;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
18
|
+
RenderAudioBlock renderAudioBlock = ^(AudioBufferList *outputData, int numFrames) {
|
|
19
|
+
int processedFrames = 0;
|
|
20
|
+
|
|
21
|
+
while (processedFrames < numFrames) {
|
|
22
|
+
int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
23
|
+
|
|
24
|
+
if (isRunning_.load()) {
|
|
25
|
+
renderAudio_(audioBus_, framesToProcess);
|
|
26
|
+
} else {
|
|
27
|
+
audioBus_->zero();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
for (int channel = 0; channel < channelCount_; channel += 1) {
|
|
31
|
+
float *outputChannel = (float *)outputData->mBuffers[channel].mData;
|
|
32
|
+
auto *inputChannel = audioBus_->getChannel(channel)->getData();
|
|
33
|
+
|
|
34
|
+
memcpy(outputChannel + processedFrames, inputChannel, framesToProcess * sizeof(float));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
processedFrames += framesToProcess;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
48
40
|
|
|
49
41
|
audioPlayer_ = [[NativeAudioPlayer alloc] initWithRenderAudio:renderAudioBlock
|
|
50
42
|
sampleRate:sampleRate
|
|
51
43
|
channelCount:channelCount_];
|
|
52
44
|
|
|
53
|
-
audioBus_ = std::make_shared<AudioBus>(
|
|
54
|
-
RENDER_QUANTUM_SIZE, channelCount_, sampleRate);
|
|
45
|
+
audioBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate);
|
|
55
46
|
}
|
|
56
47
|
|
|
57
48
|
IOSAudioPlayer::~IOSAudioPlayer()
|