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
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#include <audioapi/android/AudioAPIModule.h>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <string>
|
|
4
|
+
#include <unordered_map>
|
|
2
5
|
|
|
3
6
|
namespace audioapi {
|
|
4
7
|
|
|
@@ -25,20 +28,16 @@ jni::local_ref<AudioAPIModule::jhybriddata> AudioAPIModule::initHybrid(
|
|
|
25
28
|
jni::alias_ref<jhybridobject> jThis,
|
|
26
29
|
jni::alias_ref<jni::JObject> jWorkletsModule,
|
|
27
30
|
jlong jsContext,
|
|
28
|
-
jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
|
|
29
|
-
jsCallInvokerHolder) {
|
|
31
|
+
jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder) {
|
|
30
32
|
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
|
|
31
33
|
auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
|
|
32
34
|
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
33
35
|
if (jWorkletsModule) {
|
|
34
|
-
auto castedModule =
|
|
35
|
-
jni::static_ref_cast<WorkletsModule::javaobject>(jWorkletsModule);
|
|
36
|
+
auto castedModule = jni::static_ref_cast<WorkletsModule::javaobject>(jWorkletsModule);
|
|
36
37
|
auto workletsModuleProxy = castedModule->cthis()->getWorkletsModuleProxy();
|
|
37
|
-
return makeCxxInstance(
|
|
38
|
-
jThis, workletsModuleProxy, rnRuntime, jsCallInvoker);
|
|
38
|
+
return makeCxxInstance(jThis, workletsModuleProxy, rnRuntime, jsCallInvoker);
|
|
39
39
|
}
|
|
40
|
-
throw std::runtime_error(
|
|
41
|
-
"Worklets module is required but not provided from Java/Kotlin side");
|
|
40
|
+
throw std::runtime_error("Worklets module is required but not provided from Java/Kotlin side");
|
|
42
41
|
#else
|
|
43
42
|
return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
|
|
44
43
|
#endif
|
|
@@ -57,16 +56,12 @@ void AudioAPIModule::registerNatives() {
|
|
|
57
56
|
|
|
58
57
|
void AudioAPIModule::injectJSIBindings() {
|
|
59
58
|
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
60
|
-
auto uiWorkletRuntime =
|
|
61
|
-
weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();
|
|
59
|
+
auto uiWorkletRuntime = weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();
|
|
62
60
|
#else
|
|
63
61
|
auto uiWorkletRuntime = nullptr;
|
|
64
62
|
#endif
|
|
65
63
|
AudioAPIModuleInstaller::injectJSIBindings(
|
|
66
|
-
jsiRuntime_,
|
|
67
|
-
jsCallInvoker_,
|
|
68
|
-
audioEventHandlerRegistry_,
|
|
69
|
-
uiWorkletRuntime);
|
|
64
|
+
jsiRuntime_, jsCallInvoker_, audioEventHandlerRegistry_, uiWorkletRuntime);
|
|
70
65
|
}
|
|
71
66
|
|
|
72
67
|
void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
|
|
@@ -98,8 +93,7 @@ void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
|
|
|
98
93
|
}
|
|
99
94
|
|
|
100
95
|
if (audioEventHandlerRegistry_ != nullptr) {
|
|
101
|
-
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
102
|
-
eventName->toStdString(), body);
|
|
96
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(eventName->toStdString(), body);
|
|
103
97
|
}
|
|
104
98
|
}
|
|
105
99
|
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
8
8
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
9
9
|
|
|
10
|
+
#include <memory>
|
|
11
|
+
|
|
10
12
|
namespace audioapi {
|
|
11
13
|
|
|
12
14
|
AndroidAudioRecorder::AndroidAudioRecorder(
|
|
@@ -45,8 +47,7 @@ void AndroidAudioRecorder::start() {
|
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
if (mStream_) {
|
|
48
|
-
jni::ThreadScope::WithClassLoader(
|
|
49
|
-
[this]() { nativeAudioRecorder_->start(); });
|
|
50
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->start(); });
|
|
50
51
|
mStream_->requestStart();
|
|
51
52
|
}
|
|
52
53
|
|
|
@@ -61,8 +62,7 @@ void AndroidAudioRecorder::stop() {
|
|
|
61
62
|
isRunning_.store(false);
|
|
62
63
|
|
|
63
64
|
if (mStream_) {
|
|
64
|
-
jni::ThreadScope::WithClassLoader(
|
|
65
|
-
[this]() { nativeAudioRecorder_->stop(); });
|
|
65
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
|
|
66
66
|
mStream_->requestStop();
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
7
7
|
#include <jni.h>
|
|
8
8
|
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <memory>
|
|
11
|
+
|
|
9
12
|
namespace audioapi {
|
|
10
13
|
|
|
11
14
|
AudioPlayer::AudioPlayer(
|
|
12
15
|
const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
|
|
13
16
|
float sampleRate,
|
|
14
17
|
int channelCount)
|
|
15
|
-
: renderAudio_(renderAudio),
|
|
16
|
-
sampleRate_(sampleRate),
|
|
17
|
-
channelCount_(channelCount) {
|
|
18
|
+
: renderAudio_(renderAudio), sampleRate_(sampleRate), channelCount_(channelCount) {
|
|
18
19
|
isInitialized_ = openAudioStream();
|
|
19
20
|
|
|
20
21
|
nativeAudioPlayer_ = jni::make_global(NativeAudioPlayer::create());
|
|
@@ -36,22 +37,17 @@ bool AudioPlayer::openAudioStream() {
|
|
|
36
37
|
auto result = builder.openStream(mStream_);
|
|
37
38
|
if (result != oboe::Result::OK || mStream_ == nullptr) {
|
|
38
39
|
__android_log_print(
|
|
39
|
-
ANDROID_LOG_ERROR,
|
|
40
|
-
"AudioPlayer",
|
|
41
|
-
"Failed to open stream: %s",
|
|
42
|
-
oboe::convertToText(result));
|
|
40
|
+
ANDROID_LOG_ERROR, "AudioPlayer", "Failed to open stream: %s", oboe::convertToText(result));
|
|
43
41
|
return false;
|
|
44
42
|
}
|
|
45
43
|
|
|
46
|
-
mBus_ = std::make_shared<AudioBus>(
|
|
47
|
-
RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
|
|
44
|
+
mBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
|
|
48
45
|
return true;
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
bool AudioPlayer::start() {
|
|
52
49
|
if (mStream_) {
|
|
53
|
-
jni::ThreadScope::WithClassLoader(
|
|
54
|
-
[this]() { nativeAudioPlayer_->start(); });
|
|
50
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->start(); });
|
|
55
51
|
auto result = mStream_->requestStart();
|
|
56
52
|
return result == oboe::Result::OK;
|
|
57
53
|
}
|
|
@@ -94,10 +90,8 @@ bool AudioPlayer::isRunning() const {
|
|
|
94
90
|
return mStream_ && mStream_->getState() == oboe::StreamState::Started;
|
|
95
91
|
}
|
|
96
92
|
|
|
97
|
-
DataCallbackResult
|
|
98
|
-
|
|
99
|
-
void *audioData,
|
|
100
|
-
int32_t numFrames) {
|
|
93
|
+
DataCallbackResult
|
|
94
|
+
AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
|
|
101
95
|
if (!isInitialized_) {
|
|
102
96
|
return DataCallbackResult::Continue;
|
|
103
97
|
}
|
|
@@ -108,8 +102,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
|
|
|
108
102
|
assert(buffer != nullptr);
|
|
109
103
|
|
|
110
104
|
while (processedFrames < numFrames) {
|
|
111
|
-
int framesToProcess =
|
|
112
|
-
std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
105
|
+
int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
113
106
|
renderAudio_(mBus_, framesToProcess);
|
|
114
107
|
|
|
115
108
|
// TODO: optimize this with SIMD?
|
|
@@ -126,9 +119,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
|
|
|
126
119
|
return DataCallbackResult::Continue;
|
|
127
120
|
}
|
|
128
121
|
|
|
129
|
-
void AudioPlayer::onErrorAfterClose(
|
|
130
|
-
oboe::AudioStream *stream,
|
|
131
|
-
oboe::Result error) {
|
|
122
|
+
void AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
|
|
132
123
|
if (error == oboe::Result::ErrorDisconnected) {
|
|
133
124
|
cleanup();
|
|
134
125
|
if (openAudioStream()) {
|
|
@@ -15,14 +15,16 @@
|
|
|
15
15
|
#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
|
|
16
16
|
#endif
|
|
17
17
|
|
|
18
|
+
#include <memory>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
18
22
|
namespace audioapi {
|
|
19
23
|
|
|
20
24
|
// Decoding audio in fixed-size chunks because total frame count can't be
|
|
21
25
|
// determined in advance. Note: ma_decoder_get_length_in_pcm_frames() always
|
|
22
26
|
// returns 0 for Vorbis decoders.
|
|
23
|
-
std::vector<float> AudioDecoder::readAllPcmFrames(
|
|
24
|
-
ma_decoder &decoder,
|
|
25
|
-
int outputChannels) {
|
|
27
|
+
std::vector<float> AudioDecoder::readAllPcmFrames(ma_decoder &decoder, int outputChannels) {
|
|
26
28
|
std::vector<float> buffer;
|
|
27
29
|
std::vector<float> temp(CHUNK_SIZE * outputChannels);
|
|
28
30
|
ma_uint64 outFramesRead = 0;
|
|
@@ -30,16 +32,12 @@ std::vector<float> AudioDecoder::readAllPcmFrames(
|
|
|
30
32
|
#ifndef AUDIO_API_TEST_SUITE
|
|
31
33
|
while (true) {
|
|
32
34
|
ma_uint64 tempFramesDecoded = 0;
|
|
33
|
-
ma_decoder_read_pcm_frames(
|
|
34
|
-
&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);
|
|
35
|
+
ma_decoder_read_pcm_frames(&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);
|
|
35
36
|
if (tempFramesDecoded == 0) {
|
|
36
37
|
break;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
buffer.insert(
|
|
40
|
-
buffer.end(),
|
|
41
|
-
temp.data(),
|
|
42
|
-
temp.data() + tempFramesDecoded * outputChannels);
|
|
40
|
+
buffer.insert(buffer.end(), temp.data(), temp.data() + tempFramesDecoded * outputChannels);
|
|
43
41
|
outFramesRead += tempFramesDecoded;
|
|
44
42
|
}
|
|
45
43
|
|
|
@@ -59,8 +57,7 @@ std::shared_ptr<AudioBuffer> AudioDecoder::makeAudioBufferFromFloatBuffer(
|
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
auto outputFrames = buffer.size() / outputChannels;
|
|
62
|
-
auto audioBus = std::make_shared<AudioBus>(
|
|
63
|
-
outputFrames, outputChannels, outputSampleRate);
|
|
60
|
+
auto audioBus = std::make_shared<AudioBus>(outputFrames, outputChannels, outputSampleRate);
|
|
64
61
|
|
|
65
62
|
for (int ch = 0; ch < outputChannels; ++ch) {
|
|
66
63
|
auto channelData = audioBus->getChannel(ch)->getData();
|
|
@@ -76,27 +73,21 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(
|
|
|
76
73
|
float sampleRate) {
|
|
77
74
|
#ifndef AUDIO_API_TEST_SUITE
|
|
78
75
|
if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
|
|
79
|
-
auto buffer =
|
|
80
|
-
ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
|
|
76
|
+
auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
|
|
81
77
|
if (buffer == nullptr) {
|
|
82
78
|
__android_log_print(
|
|
83
|
-
ANDROID_LOG_ERROR,
|
|
84
|
-
"AudioDecoder",
|
|
85
|
-
"Failed to decode with FFmpeg: %s",
|
|
86
|
-
path.c_str());
|
|
79
|
+
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg: %s", path.c_str());
|
|
87
80
|
return nullptr;
|
|
88
81
|
}
|
|
89
82
|
return buffer;
|
|
90
83
|
}
|
|
91
84
|
ma_decoder decoder;
|
|
92
|
-
ma_decoder_config config =
|
|
93
|
-
ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
85
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
94
86
|
ma_decoding_backend_vtable *customBackends[] = {
|
|
95
87
|
ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
96
88
|
|
|
97
89
|
config.ppCustomBackendVTables = customBackends;
|
|
98
|
-
config.customBackendCount =
|
|
99
|
-
sizeof(customBackends) / sizeof(customBackends[0]);
|
|
90
|
+
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
100
91
|
|
|
101
92
|
if (ma_decoder_init_file(path.c_str(), &config, &decoder) != MA_SUCCESS) {
|
|
102
93
|
__android_log_print(
|
|
@@ -113,46 +104,36 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(
|
|
|
113
104
|
|
|
114
105
|
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
115
106
|
ma_decoder_uninit(&decoder);
|
|
116
|
-
return makeAudioBufferFromFloatBuffer(
|
|
117
|
-
buffer, outputSampleRate, outputChannels);
|
|
107
|
+
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
118
108
|
#else
|
|
119
109
|
return nullptr;
|
|
120
110
|
#endif
|
|
121
111
|
}
|
|
122
112
|
|
|
123
|
-
std::shared_ptr<AudioBuffer>
|
|
124
|
-
|
|
125
|
-
size_t size,
|
|
126
|
-
float sampleRate) {
|
|
113
|
+
std::shared_ptr<AudioBuffer>
|
|
114
|
+
AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate) {
|
|
127
115
|
#ifndef AUDIO_API_TEST_SUITE
|
|
128
116
|
const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
|
|
129
|
-
if (format == AudioFormat::MP4 || format == AudioFormat::M4A ||
|
|
130
|
-
|
|
131
|
-
auto buffer = ffmpegdecoder::decodeWithMemoryBlock(
|
|
132
|
-
data, size, static_cast<int>(sampleRate));
|
|
117
|
+
if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
|
|
118
|
+
auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));
|
|
133
119
|
if (buffer == nullptr) {
|
|
134
|
-
__android_log_print(
|
|
135
|
-
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg");
|
|
120
|
+
__android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg");
|
|
136
121
|
return nullptr;
|
|
137
122
|
}
|
|
138
123
|
return buffer;
|
|
139
124
|
}
|
|
140
125
|
ma_decoder decoder;
|
|
141
|
-
ma_decoder_config config =
|
|
142
|
-
ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
126
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
143
127
|
|
|
144
128
|
ma_decoding_backend_vtable *customBackends[] = {
|
|
145
129
|
ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
146
130
|
|
|
147
131
|
config.ppCustomBackendVTables = customBackends;
|
|
148
|
-
config.customBackendCount =
|
|
149
|
-
sizeof(customBackends) / sizeof(customBackends[0]);
|
|
132
|
+
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
150
133
|
|
|
151
134
|
if (ma_decoder_init_memory(data, size, &config, &decoder) != MA_SUCCESS) {
|
|
152
135
|
__android_log_print(
|
|
153
|
-
ANDROID_LOG_ERROR,
|
|
154
|
-
"AudioDecoder",
|
|
155
|
-
"Failed to initialize decoder for memory block");
|
|
136
|
+
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to initialize decoder for memory block");
|
|
156
137
|
ma_decoder_uninit(&decoder);
|
|
157
138
|
return nullptr;
|
|
158
139
|
}
|
|
@@ -162,8 +143,7 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithMemoryBlock(
|
|
|
162
143
|
|
|
163
144
|
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
164
145
|
ma_decoder_uninit(&decoder);
|
|
165
|
-
return makeAudioBufferFromFloatBuffer(
|
|
166
|
-
buffer, outputSampleRate, outputChannels);
|
|
146
|
+
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
167
147
|
#else
|
|
168
148
|
return nullptr;
|
|
169
149
|
#endif
|
|
@@ -176,11 +156,9 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithPCMInBase64(
|
|
|
176
156
|
bool interleaved) {
|
|
177
157
|
auto decodedData = base64_decode(data, false);
|
|
178
158
|
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
179
|
-
size_t numFramesDecoded =
|
|
180
|
-
decodedData.size() / (inputChannelCount * sizeof(int16_t));
|
|
159
|
+
size_t numFramesDecoded = decodedData.size() / (inputChannelCount * sizeof(int16_t));
|
|
181
160
|
|
|
182
|
-
auto audioBus = std::make_shared<AudioBus>(
|
|
183
|
-
numFramesDecoded, inputChannelCount, inputSampleRate);
|
|
161
|
+
auto audioBus = std::make_shared<AudioBus>(numFramesDecoded, inputChannelCount, inputSampleRate);
|
|
184
162
|
|
|
185
163
|
for (int ch = 0; ch < inputChannelCount; ++ch) {
|
|
186
164
|
auto channelData = audioBus->getChannel(ch)->getData();
|
|
@@ -30,8 +30,7 @@ class AudioAPIModuleInstaller {
|
|
|
30
30
|
static void injectJSIBindings(
|
|
31
31
|
jsi::Runtime *jsiRuntime,
|
|
32
32
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
33
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
34
|
-
&audioEventHandlerRegistry,
|
|
33
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
35
34
|
std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr) {
|
|
36
35
|
auto createAudioContext = getCreateAudioContextFunction(
|
|
37
36
|
jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
|
|
@@ -39,30 +38,22 @@ class AudioAPIModuleInstaller {
|
|
|
39
38
|
getCreateAudioRecorderFunction(jsiRuntime, audioEventHandlerRegistry);
|
|
40
39
|
auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(
|
|
41
40
|
jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);
|
|
42
|
-
auto createAudioDecoder =
|
|
43
|
-
|
|
44
|
-
auto createAudioStretcher =
|
|
45
|
-
getCreateAudioStretcherFunction(jsiRuntime, jsCallInvoker);
|
|
41
|
+
auto createAudioDecoder = getCreateAudioDecoderFunction(jsiRuntime, jsCallInvoker);
|
|
42
|
+
auto createAudioStretcher = getCreateAudioStretcherFunction(jsiRuntime, jsCallInvoker);
|
|
46
43
|
|
|
47
|
-
jsiRuntime->global().setProperty(
|
|
48
|
-
|
|
49
|
-
jsiRuntime->global().setProperty(
|
|
50
|
-
*jsiRuntime, "createAudioRecorder", createAudioRecorder);
|
|
44
|
+
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioContext", createAudioContext);
|
|
45
|
+
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioRecorder", createAudioRecorder);
|
|
51
46
|
jsiRuntime->global().setProperty(
|
|
52
47
|
*jsiRuntime, "createOfflineAudioContext", createOfflineAudioContext);
|
|
53
|
-
jsiRuntime->global().setProperty(
|
|
54
|
-
|
|
55
|
-
jsiRuntime->global().setProperty(
|
|
56
|
-
*jsiRuntime, "createAudioStretcher", createAudioStretcher);
|
|
48
|
+
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioDecoder", createAudioDecoder);
|
|
49
|
+
jsiRuntime->global().setProperty(*jsiRuntime, "createAudioStretcher", createAudioStretcher);
|
|
57
50
|
|
|
58
51
|
auto audioEventHandlerRegistryHostObject =
|
|
59
|
-
std::make_shared<AudioEventHandlerRegistryHostObject>(
|
|
60
|
-
audioEventHandlerRegistry);
|
|
52
|
+
std::make_shared<AudioEventHandlerRegistryHostObject>(audioEventHandlerRegistry);
|
|
61
53
|
jsiRuntime->global().setProperty(
|
|
62
54
|
*jsiRuntime,
|
|
63
55
|
"AudioEventEmitter",
|
|
64
|
-
jsi::Object::createFromHostObject(
|
|
65
|
-
*jsiRuntime, audioEventHandlerRegistryHostObject));
|
|
56
|
+
jsi::Object::createFromHostObject(*jsiRuntime, audioEventHandlerRegistryHostObject));
|
|
66
57
|
}
|
|
67
58
|
|
|
68
59
|
static void closeAllContexts() {
|
|
@@ -74,7 +65,7 @@ class AudioAPIModuleInstaller {
|
|
|
74
65
|
}
|
|
75
66
|
|
|
76
67
|
it = contexts_.erase(it);
|
|
77
|
-
|
|
68
|
+
--it;
|
|
78
69
|
}
|
|
79
70
|
}
|
|
80
71
|
|
|
@@ -82,8 +73,7 @@ class AudioAPIModuleInstaller {
|
|
|
82
73
|
static jsi::Function getCreateAudioContextFunction(
|
|
83
74
|
jsi::Runtime *jsiRuntime,
|
|
84
75
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
85
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
86
|
-
&audioEventHandlerRegistry,
|
|
76
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
87
77
|
const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
|
|
88
78
|
return jsi::Function::createFromHostFunction(
|
|
89
79
|
*jsiRuntime,
|
|
@@ -97,35 +87,29 @@ class AudioAPIModuleInstaller {
|
|
|
97
87
|
std::shared_ptr<AudioContext> audioContext;
|
|
98
88
|
auto sampleRate = static_cast<float>(args[0].getNumber());
|
|
99
89
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
#endif
|
|
90
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
91
|
+
auto runtimeRegistry = RuntimeRegistry{
|
|
92
|
+
.uiRuntime = uiRuntime,
|
|
93
|
+
.audioRuntime = worklets::extractWorkletRuntime(runtime, args[1])};
|
|
94
|
+
#else
|
|
95
|
+
auto runtimeRegistry = RuntimeRegistry{};
|
|
96
|
+
#endif
|
|
108
97
|
|
|
109
98
|
audioContext = std::make_shared<AudioContext>(
|
|
110
|
-
sampleRate,
|
|
111
|
-
audioEventHandlerRegistry,
|
|
112
|
-
runtimeRegistry);
|
|
99
|
+
sampleRate, audioEventHandlerRegistry, runtimeRegistry);
|
|
113
100
|
AudioAPIModuleInstaller::contexts_.push_back(audioContext);
|
|
114
101
|
|
|
115
102
|
auto audioContextHostObject =
|
|
116
|
-
std::make_shared<AudioContextHostObject>(
|
|
117
|
-
audioContext, &runtime, jsCallInvoker);
|
|
103
|
+
std::make_shared<AudioContextHostObject>(audioContext, &runtime, jsCallInvoker);
|
|
118
104
|
|
|
119
|
-
return jsi::Object::createFromHostObject(
|
|
120
|
-
runtime, audioContextHostObject);
|
|
105
|
+
return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
|
|
121
106
|
});
|
|
122
107
|
}
|
|
123
108
|
|
|
124
109
|
static jsi::Function getCreateOfflineAudioContextFunction(
|
|
125
110
|
jsi::Runtime *jsiRuntime,
|
|
126
111
|
const std::shared_ptr<react::CallInvoker> &jsCallInvoker,
|
|
127
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
128
|
-
&audioEventHandlerRegistry,
|
|
112
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
129
113
|
const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {
|
|
130
114
|
return jsi::Function::createFromHostFunction(
|
|
131
115
|
*jsiRuntime,
|
|
@@ -140,35 +124,27 @@ class AudioAPIModuleInstaller {
|
|
|
140
124
|
auto length = static_cast<size_t>(args[1].getNumber());
|
|
141
125
|
auto sampleRate = static_cast<float>(args[2].getNumber());
|
|
142
126
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
auto audioContextHostObject =
|
|
160
|
-
std::make_shared<OfflineAudioContextHostObject>(
|
|
161
|
-
offlineAudioContext, &runtime, jsCallInvoker);
|
|
162
|
-
|
|
163
|
-
return jsi::Object::createFromHostObject(
|
|
164
|
-
runtime, audioContextHostObject);
|
|
127
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
128
|
+
auto runtimeRegistry = RuntimeRegistry{
|
|
129
|
+
.uiRuntime = uiRuntime,
|
|
130
|
+
.audioRuntime = worklets::extractWorkletRuntime(runtime, args[3])};
|
|
131
|
+
#else
|
|
132
|
+
auto runtimeRegistry = RuntimeRegistry{};
|
|
133
|
+
#endif
|
|
134
|
+
|
|
135
|
+
auto offlineAudioContext = std::make_shared<OfflineAudioContext>(
|
|
136
|
+
numberOfChannels, length, sampleRate, audioEventHandlerRegistry, runtimeRegistry);
|
|
137
|
+
|
|
138
|
+
auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(
|
|
139
|
+
offlineAudioContext, &runtime, jsCallInvoker);
|
|
140
|
+
|
|
141
|
+
return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
|
|
165
142
|
});
|
|
166
143
|
}
|
|
167
144
|
|
|
168
145
|
static jsi::Function getCreateAudioRecorderFunction(
|
|
169
146
|
jsi::Runtime *jsiRuntime,
|
|
170
|
-
const std::shared_ptr<AudioEventHandlerRegistry>
|
|
171
|
-
&audioEventHandlerRegistry) {
|
|
147
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry) {
|
|
172
148
|
return jsi::Function::createFromHostFunction(
|
|
173
149
|
*jsiRuntime,
|
|
174
150
|
jsi::PropNameID::forAscii(*jsiRuntime, "createAudioRecorder"),
|
|
@@ -180,18 +156,15 @@ class AudioAPIModuleInstaller {
|
|
|
180
156
|
size_t count) -> jsi::Value {
|
|
181
157
|
auto options = args[0].getObject(runtime);
|
|
182
158
|
|
|
183
|
-
auto sampleRate =
|
|
184
|
-
options.getProperty(runtime, "sampleRate").getNumber());
|
|
185
|
-
auto bufferLength =
|
|
186
|
-
options.getProperty(runtime, "bufferLengthInSamples")
|
|
187
|
-
.getNumber());
|
|
159
|
+
auto sampleRate =
|
|
160
|
+
static_cast<float>(options.getProperty(runtime, "sampleRate").getNumber());
|
|
161
|
+
auto bufferLength =
|
|
162
|
+
static_cast<int>(options.getProperty(runtime, "bufferLengthInSamples").getNumber());
|
|
188
163
|
|
|
189
|
-
auto audioRecorderHostObject =
|
|
190
|
-
|
|
191
|
-
audioEventHandlerRegistry, sampleRate, bufferLength);
|
|
164
|
+
auto audioRecorderHostObject = std::make_shared<AudioRecorderHostObject>(
|
|
165
|
+
audioEventHandlerRegistry, sampleRate, bufferLength);
|
|
192
166
|
|
|
193
|
-
auto jsiObject = jsi::Object::createFromHostObject(
|
|
194
|
-
runtime, audioRecorderHostObject);
|
|
167
|
+
auto jsiObject = jsi::Object::createFromHostObject(runtime, audioRecorderHostObject);
|
|
195
168
|
jsiObject.setExternalMemoryPressure(
|
|
196
169
|
runtime, sizeof(float) * bufferLength); // rough estimate of underlying buffer
|
|
197
170
|
|
|
@@ -213,8 +186,7 @@ class AudioAPIModuleInstaller {
|
|
|
213
186
|
size_t count) -> jsi::Value {
|
|
214
187
|
auto audioDecoderHostObject =
|
|
215
188
|
std::make_shared<AudioDecoderHostObject>(&runtime, jsCallInvoker);
|
|
216
|
-
return jsi::Object::createFromHostObject(
|
|
217
|
-
runtime, audioDecoderHostObject);
|
|
189
|
+
return jsi::Object::createFromHostObject(runtime, audioDecoderHostObject);
|
|
218
190
|
});
|
|
219
191
|
}
|
|
220
192
|
|
|
@@ -231,10 +203,8 @@ class AudioAPIModuleInstaller {
|
|
|
231
203
|
const jsi::Value *args,
|
|
232
204
|
size_t count) -> jsi::Value {
|
|
233
205
|
auto audioStretcherHostObject =
|
|
234
|
-
std::make_shared<AudioStretcherHostObject>(
|
|
235
|
-
|
|
236
|
-
return jsi::Object::createFromHostObject(
|
|
237
|
-
runtime, audioStretcherHostObject);
|
|
206
|
+
std::make_shared<AudioStretcherHostObject>(&runtime, jsCallInvoker);
|
|
207
|
+
return jsi::Object::createFromHostObject(runtime, audioStretcherHostObject);
|
|
238
208
|
});
|
|
239
209
|
}
|
|
240
210
|
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#include <audioapi/HostObjects/AudioContextHostObject.h>
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/AudioContext.h>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <utility>
|
|
4
6
|
|
|
5
7
|
namespace audioapi {
|
|
6
8
|
|
|
@@ -17,38 +19,35 @@ AudioContextHostObject::AudioContextHostObject(
|
|
|
17
19
|
|
|
18
20
|
JSI_HOST_FUNCTION_IMPL(AudioContextHostObject, close) {
|
|
19
21
|
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
20
|
-
auto promise = promiseVendor_->createAsyncPromise(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
22
|
+
auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {
|
|
23
|
+
return [audioContext](jsi::Runtime &runtime) {
|
|
24
|
+
audioContext->close();
|
|
25
|
+
return jsi::Value::undefined();
|
|
26
|
+
};
|
|
27
|
+
});
|
|
27
28
|
|
|
28
29
|
return promise;
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
JSI_HOST_FUNCTION_IMPL(AudioContextHostObject, resume) {
|
|
32
33
|
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
33
|
-
auto promise = promiseVendor_->createAsyncPromise(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
});
|
|
34
|
+
auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {
|
|
35
|
+
auto result = audioContext->resume();
|
|
36
|
+
return [result](jsi::Runtime &runtime) {
|
|
37
|
+
return jsi::Value(result);
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
40
|
return promise;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
JSI_HOST_FUNCTION_IMPL(AudioContextHostObject, suspend) {
|
|
44
44
|
auto audioContext = std::static_pointer_cast<AudioContext>(context_);
|
|
45
|
-
auto promise = promiseVendor_->createAsyncPromise(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
});
|
|
45
|
+
auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {
|
|
46
|
+
auto result = audioContext->suspend();
|
|
47
|
+
return [result](jsi::Runtime &runtime) {
|
|
48
|
+
return jsi::Value(result);
|
|
49
|
+
};
|
|
50
|
+
});
|
|
52
51
|
|
|
53
52
|
return promise;
|
|
54
53
|
}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
#include <audioapi/HostObjects/AudioParamHostObject.h>
|
|
4
4
|
#include <audioapi/core/AudioNode.h>
|
|
5
|
+
#include <memory>
|
|
5
6
|
|
|
6
7
|
namespace audioapi {
|
|
7
8
|
|
|
8
|
-
AudioNodeHostObject::AudioNodeHostObject(const std::shared_ptr<AudioNode> &node)
|
|
9
|
-
: node_(node) {
|
|
9
|
+
AudioNodeHostObject::AudioNodeHostObject(const std::shared_ptr<AudioNode> &node) : node_(node) {
|
|
10
10
|
addGetters(
|
|
11
11
|
JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, numberOfInputs),
|
|
12
12
|
JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, numberOfOutputs),
|
|
@@ -36,8 +36,7 @@ JSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, channelCountMode) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
JSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, channelInterpretation) {
|
|
39
|
-
return jsi::String::createFromUtf8(
|
|
40
|
-
runtime, node_->getChannelInterpretation());
|
|
39
|
+
return jsi::String::createFromUtf8(runtime, node_->getChannelInterpretation());
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
JSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {
|