react-native-audio-api 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -39
- package/RNAudioAPI.podspec +17 -12
- package/android/build.gradle +44 -4
- package/android/src/main/cpp/audioapi/CMakeLists.txt +65 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +29 -1
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +14 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +7 -1
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +6 -1
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +1 -1
- package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +36 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +11 -1
- package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +24 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +15 -2
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +53 -18
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +57 -0
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.h +6 -46
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +70 -6
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h +10 -66
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +105 -0
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +17 -91
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +362 -6
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +29 -241
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +70 -0
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +6 -50
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +18 -0
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +18 -0
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +148 -0
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h +37 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +92 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +29 -0
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +20 -0
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h +19 -0
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +21 -0
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +21 -0
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +41 -0
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +28 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +69 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +33 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +73 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +29 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +94 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +46 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +60 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +25 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +152 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +37 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +52 -0
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h +25 -0
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +19 -0
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +21 -0
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +55 -0
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +27 -0
- package/common/cpp/audioapi/HostObjects/{RecorderAdapterNodeHostObject.h → sources/RecorderAdapterNodeHostObject.h} +1 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +22 -0
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +28 -0
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +18 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +3 -2
- package/common/cpp/audioapi/core/AudioContext.h +2 -1
- package/common/cpp/audioapi/core/AudioNode.cpp +3 -3
- package/common/cpp/audioapi/core/AudioNode.h +2 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/AudioParam.h +1 -1
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +47 -3
- package/common/cpp/audioapi/core/BaseAudioContext.h +13 -4
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -3
- package/common/cpp/audioapi/core/OfflineAudioContext.h +2 -1
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +3 -1
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +1 -1
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +1 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +3 -1
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +1 -1
- package/common/cpp/audioapi/core/effects/GainNode.cpp +3 -1
- package/common/cpp/audioapi/core/effects/GainNode.h +1 -1
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +1 -1
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +18 -13
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +1 -1
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +89 -0
- package/common/cpp/audioapi/core/effects/WorkletNode.h +65 -0
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +91 -0
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +52 -0
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +1 -1
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +2 -2
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +47 -10
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +18 -3
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +98 -14
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +9 -3
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +37 -44
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +7 -9
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +1 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +1 -1
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +53 -0
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +26 -0
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +7 -2
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +1 -1
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +3 -1
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +1 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +9 -1
- package/common/cpp/audioapi/core/sources/StreamerNode.h +1 -9
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +84 -0
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +47 -0
- package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +13 -7
- package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +5 -0
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +52 -0
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +9 -0
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +73 -0
- package/common/cpp/audioapi/dsp/Windows.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +1 -1
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +2 -1
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +14 -1
- package/common/cpp/audioapi/jsi/JsiHostObject.h +6 -12
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +49 -0
- package/common/cpp/audioapi/jsi/JsiPromise.h +29 -1
- package/common/cpp/audioapi/utils/AudioBus.cpp +1 -1
- package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -0
- package/common/cpp/test/AudioParamTest.cpp +204 -0
- package/common/cpp/test/CMakeLists.txt +12 -3
- package/common/cpp/test/GainTest.cpp +11 -10
- package/common/cpp/test/OscillatorTest.cpp +2 -1
- package/common/cpp/test/StereoPannerTest.cpp +129 -0
- package/ios/audioapi/ios/AudioAPIModule.mm +32 -5
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +1 -1
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +1 -1
- package/lib/commonjs/api.js +36 -2
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +8 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js +1 -6
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferSourceNode.js +15 -0
- package/lib/commonjs/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +10 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +66 -11
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/ConstantSourceNode.js +17 -0
- package/lib/commonjs/core/ConstantSourceNode.js.map +1 -0
- package/lib/commonjs/core/OfflineAudioContext.js +11 -2
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/core/OscillatorNode.js +6 -0
- package/lib/commonjs/core/OscillatorNode.js.map +1 -1
- package/lib/commonjs/core/WorkletNode.js +11 -0
- package/lib/commonjs/core/WorkletNode.js.map +1 -0
- package/lib/commonjs/core/WorkletProcessingNode.js +11 -0
- package/lib/commonjs/core/WorkletProcessingNode.js.map +1 -0
- package/lib/commonjs/core/WorkletSourceNode.js +11 -0
- package/lib/commonjs/core/WorkletSourceNode.js.map +1 -0
- package/lib/commonjs/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
- package/lib/commonjs/hooks/useSystemVolume.js.map +1 -0
- package/lib/commonjs/utils/index.js +9 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +4 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js +1 -1
- package/lib/commonjs/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/web-core/ConstantSourceNode.js +17 -0
- package/lib/commonjs/web-core/ConstantSourceNode.js.map +1 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js +4 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/api.js +6 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -0
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +7 -7
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js +1 -6
- package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferSourceNode.js +15 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
- package/lib/module/core/AudioContext.js +10 -1
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioScheduledSourceNode.js +4 -4
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +66 -11
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/ConstantSourceNode.js +11 -0
- package/lib/module/core/ConstantSourceNode.js.map +1 -0
- package/lib/module/core/OfflineAudioContext.js +11 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/core/OscillatorNode.js +6 -0
- package/lib/module/core/OscillatorNode.js.map +1 -1
- package/lib/module/core/WorkletNode.js +5 -0
- package/lib/module/core/WorkletNode.js.map +1 -0
- package/lib/module/core/WorkletProcessingNode.js +5 -0
- package/lib/module/core/WorkletProcessingNode.js.map +1 -0
- package/lib/module/core/WorkletSourceNode.js +5 -0
- package/lib/module/core/WorkletSourceNode.js.map +1 -0
- package/lib/module/hooks/{useSytemVolume.js → useSystemVolume.js} +1 -1
- package/lib/module/hooks/useSystemVolume.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +4 -0
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js +1 -1
- package/lib/module/web-core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/web-core/ConstantSourceNode.js +11 -0
- package/lib/module/web-core/ConstantSourceNode.js.map +1 -0
- package/lib/module/web-core/OfflineAudioContext.js +4 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +8 -4
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -0
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +2 -2
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
- package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +4 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts +1 -0
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +19 -11
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/ConstantSourceNode.d.ts +9 -0
- package/lib/typescript/core/ConstantSourceNode.d.ts.map +1 -0
- package/lib/typescript/core/OfflineAudioContext.d.ts +1 -0
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/OscillatorNode.d.ts +3 -0
- package/lib/typescript/core/OscillatorNode.d.ts.map +1 -1
- package/lib/typescript/core/WorkletNode.d.ts +4 -0
- package/lib/typescript/core/WorkletNode.d.ts.map +1 -0
- package/lib/typescript/core/WorkletProcessingNode.d.ts +4 -0
- package/lib/typescript/core/WorkletProcessingNode.d.ts.map +1 -0
- package/lib/typescript/core/WorkletSourceNode.d.ts +4 -0
- package/lib/typescript/core/WorkletSourceNode.d.ts.map +1 -0
- package/lib/typescript/events/types.d.ts +2 -0
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/hooks/{useSytemVolume.d.ts → useSystemVolume.d.ts} +1 -1
- package/lib/typescript/hooks/useSystemVolume.d.ts.map +1 -0
- package/lib/typescript/interfaces.d.ts +21 -3
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +2 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +8 -0
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioBufferSourceNode.d.ts +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +4 -2
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioScheduledSourceNode.d.ts +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/ConstantSourceNode.d.ts +8 -0
- package/lib/typescript/web-core/ConstantSourceNode.d.ts.map +1 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +4 -2
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/api.ts +12 -3
- package/src/api.web.ts +1 -0
- package/src/core/AudioBufferBaseSourceNode.ts +9 -9
- package/src/core/AudioBufferQueueSourceNode.ts +1 -9
- package/src/core/AudioBufferSourceNode.ts +28 -0
- package/src/core/AudioContext.ts +12 -1
- package/src/core/AudioScheduledSourceNode.ts +5 -5
- package/src/core/BaseAudioContext.ts +149 -13
- package/src/core/ConstantSourceNode.ts +13 -0
- package/src/core/OfflineAudioContext.ts +18 -2
- package/src/core/OscillatorNode.ts +11 -0
- package/src/core/WorkletNode.ts +3 -0
- package/src/core/WorkletProcessingNode.ts +3 -0
- package/src/core/WorkletSourceNode.ts +3 -0
- package/src/events/types.ts +2 -0
- package/src/interfaces.ts +59 -5
- package/src/types.ts +3 -1
- package/src/utils/index.ts +21 -0
- package/src/web-core/AudioBufferSourceNode.tsx +1 -1
- package/src/web-core/AudioContext.tsx +7 -2
- package/src/web-core/AudioScheduledSourceNode.tsx +1 -1
- package/src/web-core/BaseAudioContext.tsx +2 -0
- package/src/web-core/ConstantSourceNode.tsx +12 -0
- package/src/web-core/OfflineAudioContext.tsx +7 -2
- package/common/cpp/audioapi/HostObjects/AnalyserNodeHostObject.h +0 -149
- package/common/cpp/audioapi/HostObjects/AudioBufferBaseSourceNodeHostObject.h +0 -76
- package/common/cpp/audioapi/HostObjects/AudioBufferHostObject.h +0 -120
- package/common/cpp/audioapi/HostObjects/AudioBufferQueueSourceNodeHostObject.h +0 -67
- package/common/cpp/audioapi/HostObjects/AudioBufferSourceNodeHostObject.h +0 -142
- package/common/cpp/audioapi/HostObjects/AudioRecorderHostObject.h +0 -86
- package/common/cpp/audioapi/HostObjects/AudioScheduledSourceNodeHostObject.h +0 -56
- package/common/cpp/audioapi/HostObjects/BiquadFilterNodeHostObject.h +0 -89
- package/common/cpp/audioapi/HostObjects/GainNodeHostObject.h +0 -27
- package/common/cpp/audioapi/HostObjects/OscillatorNodeHostObject.h +0 -65
- package/common/cpp/audioapi/HostObjects/StereoPannerNodeHostObject.h +0 -29
- package/common/cpp/audioapi/HostObjects/StreamerNodeHostObject.h +0 -30
- package/common/cpp/audioapi/events/AudioEventHandlerRegistryHostObject.h +0 -48
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.h +0 -7
- package/ios/audioapi/ios/events/IOSAudioEventHandlerRegistry.mm +0 -12
- package/lib/commonjs/hooks/useSytemVolume.js.map +0 -1
- package/lib/module/hooks/useSytemVolume.js.map +0 -1
- package/lib/typescript/hooks/useSytemVolume.d.ts.map +0 -1
- /package/common/cpp/audioapi/HostObjects/{AudioDestinationNodeHostObject.h → destinations/AudioDestinationNodeHostObject.h} +0 -0
- /package/common/cpp/audioapi/HostObjects/{PeriodicWaveHostObject.h → effects/PeriodicWaveHostObject.h} +0 -0
- /package/common/cpp/audioapi/core/{AudioParamEventQueue.h → utils/AudioParamEventQueue.h} +0 -0
- /package/src/hooks/{useSytemVolume.ts → useSystemVolume.ts} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#include <audioapi/core/BaseAudioContext.h>
|
|
2
|
-
#include <audioapi/core/Constants.h>
|
|
3
2
|
#include <audioapi/core/effects/StereoPannerNode.h>
|
|
3
|
+
#include <audioapi/core/utils/Constants.h>
|
|
4
4
|
#include <audioapi/utils/AudioArray.h>
|
|
5
5
|
#include <audioapi/utils/AudioBus.h>
|
|
6
6
|
|
|
@@ -19,18 +19,20 @@ std::shared_ptr<AudioParam> StereoPannerNode::getPanParam() const {
|
|
|
19
19
|
return panParam_;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
std::shared_ptr<AudioBus> StereoPannerNode::processNode(
|
|
23
23
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
24
24
|
int framesToProcess) {
|
|
25
25
|
double time = context_->getCurrentTime();
|
|
26
26
|
double deltaTime = 1.0 / context_->getSampleRate();
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
AudioArray *right = processingBus->getChannelByType(AudioBus::ChannelRight);
|
|
28
|
+
auto *inputLeft = processingBus->getChannelByType(AudioBus::ChannelLeft);
|
|
30
29
|
auto panParamValues = panParam_->processARateParam(framesToProcess, time)
|
|
31
30
|
->getChannel(0)
|
|
32
31
|
->getData();
|
|
33
32
|
|
|
33
|
+
auto *outputLeft = audioBus_->getChannelByType(AudioBus::ChannelLeft);
|
|
34
|
+
auto *outputRight = audioBus_->getChannelByType(AudioBus::ChannelRight);
|
|
35
|
+
|
|
34
36
|
// Input is mono
|
|
35
37
|
if (processingBus->getNumberOfChannels() == 1) {
|
|
36
38
|
for (int i = 0; i < framesToProcess; i++) {
|
|
@@ -40,13 +42,14 @@ void StereoPannerNode::processNode(
|
|
|
40
42
|
auto gainL = static_cast<float>(cos(x * PI / 2));
|
|
41
43
|
auto gainR = static_cast<float>(sin(x * PI / 2));
|
|
42
44
|
|
|
43
|
-
float input = (*
|
|
45
|
+
float input = (*inputLeft)[i];
|
|
44
46
|
|
|
45
|
-
(*
|
|
46
|
-
(*
|
|
47
|
+
(*outputLeft)[i] = input * gainL;
|
|
48
|
+
(*outputRight)[i] = input * gainR;
|
|
47
49
|
time += deltaTime;
|
|
48
50
|
}
|
|
49
51
|
} else { // Input is stereo
|
|
52
|
+
auto *inputRight = processingBus->getChannelByType(AudioBus::ChannelRight);
|
|
50
53
|
for (int i = 0; i < framesToProcess; i++) {
|
|
51
54
|
auto pan = std::clamp(panParamValues[i], -1.0f, 1.0f);
|
|
52
55
|
auto x = (pan <= 0 ? pan + 1 : pan);
|
|
@@ -54,20 +57,22 @@ void StereoPannerNode::processNode(
|
|
|
54
57
|
auto gainL = static_cast<float>(cos(x * PI / 2));
|
|
55
58
|
auto gainR = static_cast<float>(sin(x * PI / 2));
|
|
56
59
|
|
|
57
|
-
float inputL = (*
|
|
58
|
-
float inputR = (*
|
|
60
|
+
float inputL = (*inputLeft)[i];
|
|
61
|
+
float inputR = (*inputRight)[i];
|
|
59
62
|
|
|
60
63
|
if (pan <= 0) {
|
|
61
|
-
(*
|
|
62
|
-
(*
|
|
64
|
+
(*outputLeft)[i] = inputL + inputR * gainL;
|
|
65
|
+
(*outputRight)[i] = inputR * gainR;
|
|
63
66
|
} else {
|
|
64
|
-
(*
|
|
65
|
-
(*
|
|
67
|
+
(*outputLeft)[i] = inputL * gainL;
|
|
68
|
+
(*outputRight)[i] = inputR + inputL * gainR;
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
time += deltaTime;
|
|
69
72
|
}
|
|
70
73
|
}
|
|
74
|
+
|
|
75
|
+
return audioBus_;
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
} // namespace audioapi
|
|
@@ -18,7 +18,7 @@ class StereoPannerNode : public AudioNode {
|
|
|
18
18
|
[[nodiscard]] std::shared_ptr<AudioParam> getPanParam() const;
|
|
19
19
|
|
|
20
20
|
protected:
|
|
21
|
-
|
|
21
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
22
22
|
|
|
23
23
|
private:
|
|
24
24
|
std::shared_ptr<AudioParam> panParam_;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#include <audioapi/core/effects/WorkletNode.h>
|
|
2
|
+
|
|
3
|
+
namespace audioapi {
|
|
4
|
+
|
|
5
|
+
WorkletNode::WorkletNode(
|
|
6
|
+
BaseAudioContext *context,
|
|
7
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
8
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
9
|
+
size_t bufferLength,
|
|
10
|
+
size_t inputChannelCount)
|
|
11
|
+
: AudioNode(context),
|
|
12
|
+
buffRealLength_(bufferLength * sizeof(float)),
|
|
13
|
+
bufferLength_(bufferLength),
|
|
14
|
+
workletRunner_(runtime),
|
|
15
|
+
shareableWorklet_(worklet),
|
|
16
|
+
inputChannelCount_(inputChannelCount),
|
|
17
|
+
curBuffIndex_(0) {
|
|
18
|
+
buffs_.reserve(inputChannelCount_);
|
|
19
|
+
for (size_t i = 0; i < inputChannelCount_; ++i) {
|
|
20
|
+
buffs_.emplace_back(new uint8_t[buffRealLength_]);
|
|
21
|
+
}
|
|
22
|
+
isInitialized_ = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
WorkletNode::~WorkletNode() {
|
|
26
|
+
for (auto &buff : buffs_) {
|
|
27
|
+
delete[] buff;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
std::shared_ptr<AudioBus> WorkletNode::processNode(
|
|
32
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
33
|
+
int framesToProcess) {
|
|
34
|
+
size_t processed = 0;
|
|
35
|
+
size_t channelCount_ = std::min(
|
|
36
|
+
inputChannelCount_,
|
|
37
|
+
static_cast<size_t>(processingBus->getNumberOfChannels()));
|
|
38
|
+
while (processed < framesToProcess) {
|
|
39
|
+
size_t framesToWorkletInvoke = bufferLength_ - curBuffIndex_;
|
|
40
|
+
size_t needsToProcess = framesToProcess - processed;
|
|
41
|
+
size_t shouldProcess = std::min(framesToWorkletInvoke, needsToProcess);
|
|
42
|
+
|
|
43
|
+
for (size_t ch = 0; ch < channelCount_; ch++) {
|
|
44
|
+
/// here we copy
|
|
45
|
+
/// to uint8_t* [curBuffIndex_, curBuffIndex_ + shouldProcess]
|
|
46
|
+
/// from float* [processed, processed + shouldProcess]
|
|
47
|
+
/// so as the we need to copy shouldProcess * sizeof(float) bytes
|
|
48
|
+
auto channelData = processingBus->getChannel(ch)->getData();
|
|
49
|
+
std::memcpy(
|
|
50
|
+
/* dest */ buffs_[ch] + curBuffIndex_ * sizeof(float),
|
|
51
|
+
/* src */ reinterpret_cast<const uint8_t *>(channelData + processed),
|
|
52
|
+
/* size */ shouldProcess * sizeof(float));
|
|
53
|
+
}
|
|
54
|
+
processed += shouldProcess;
|
|
55
|
+
curBuffIndex_ += shouldProcess;
|
|
56
|
+
|
|
57
|
+
/// If we filled the entire buffer, we need to execute the worklet
|
|
58
|
+
if (curBuffIndex_ == bufferLength_) {
|
|
59
|
+
// Reset buffer index, channel buffers and execute worklet
|
|
60
|
+
curBuffIndex_ = 0;
|
|
61
|
+
workletRunner_.executeOnRuntimeGuardedSync(
|
|
62
|
+
[this, channelCount_](jsi::Runtime &uiRuntimeRaw) {
|
|
63
|
+
/// Arguments preparation
|
|
64
|
+
auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);
|
|
65
|
+
for (size_t ch = 0; ch < channelCount_; ch++) {
|
|
66
|
+
uint8_t *buffPtr = buffs_[ch];
|
|
67
|
+
buffs_[ch] = new uint8_t[buffRealLength_];
|
|
68
|
+
auto sharedAudioArray =
|
|
69
|
+
std::make_shared<AudioArrayBuffer>(buffPtr, buffRealLength_);
|
|
70
|
+
auto arrayBuffer =
|
|
71
|
+
jsi::ArrayBuffer(uiRuntimeRaw, std::move(sharedAudioArray));
|
|
72
|
+
jsArray.setValueAtIndex(uiRuntimeRaw, ch, std::move(arrayBuffer));
|
|
73
|
+
}
|
|
74
|
+
jsArray.setExternalMemoryPressure(
|
|
75
|
+
uiRuntimeRaw, channelCount_ * buffRealLength_);
|
|
76
|
+
|
|
77
|
+
workletRunner_.executeWorklet(
|
|
78
|
+
shareableWorklet_,
|
|
79
|
+
std::move(jsArray),
|
|
80
|
+
jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));
|
|
81
|
+
return jsi::Value::undefined();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return processingBus;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
#include <jsi/jsi.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
6
|
+
#include <audioapi/core/AudioNode.h>
|
|
7
|
+
#include <audioapi/core/BaseAudioContext.h>
|
|
8
|
+
#include <audioapi/utils/AudioBus.h>
|
|
9
|
+
#include <audioapi/utils/AudioArray.h>
|
|
10
|
+
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
11
|
+
|
|
12
|
+
#include <memory>
|
|
13
|
+
#include <vector>
|
|
14
|
+
|
|
15
|
+
namespace audioapi {
|
|
16
|
+
|
|
17
|
+
#if RN_AUDIO_API_TEST
|
|
18
|
+
class WorkletNode : public AudioNode {
|
|
19
|
+
public:
|
|
20
|
+
explicit WorkletNode(
|
|
21
|
+
BaseAudioContext *context,
|
|
22
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
23
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
24
|
+
size_t bufferLength,
|
|
25
|
+
size_t inputChannelCount
|
|
26
|
+
) : AudioNode(context) {}
|
|
27
|
+
|
|
28
|
+
protected:
|
|
29
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override { return processingBus; }
|
|
30
|
+
};
|
|
31
|
+
#else
|
|
32
|
+
|
|
33
|
+
using namespace facebook;
|
|
34
|
+
|
|
35
|
+
class WorkletNode : public AudioNode {
|
|
36
|
+
public:
|
|
37
|
+
explicit WorkletNode(
|
|
38
|
+
BaseAudioContext *context,
|
|
39
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
40
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime,
|
|
41
|
+
size_t bufferLength,
|
|
42
|
+
size_t inputChannelCount
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
~WorkletNode() override;
|
|
46
|
+
|
|
47
|
+
protected:
|
|
48
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
private:
|
|
52
|
+
WorkletsRunner workletRunner_;
|
|
53
|
+
std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
|
|
54
|
+
std::vector<uint8_t*> buffs_;
|
|
55
|
+
|
|
56
|
+
/// @brief Length of the byte buffer that will be passed to the AudioArrayBuffer
|
|
57
|
+
size_t buffRealLength_;
|
|
58
|
+
size_t bufferLength_;
|
|
59
|
+
size_t inputChannelCount_;
|
|
60
|
+
size_t curBuffIndex_;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
#endif // RN_AUDIO_API_TEST
|
|
64
|
+
|
|
65
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#include <audioapi/core/effects/WorkletProcessingNode.h>
|
|
2
|
+
#include <audioapi/core/utils/Constants.h>
|
|
3
|
+
|
|
4
|
+
namespace audioapi {
|
|
5
|
+
|
|
6
|
+
WorkletProcessingNode::WorkletProcessingNode(
|
|
7
|
+
BaseAudioContext *context,
|
|
8
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
9
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime)
|
|
10
|
+
: AudioNode(context), workletRunner_(runtime), shareableWorklet_(worklet) {
|
|
11
|
+
isInitialized_ = true;
|
|
12
|
+
|
|
13
|
+
// Pre-allocate buffers for max 128 frames and 2 channels (stereo)
|
|
14
|
+
size_t maxChannelCount = 2;
|
|
15
|
+
inputBuffsHandles_.resize(maxChannelCount);
|
|
16
|
+
outputBuffsHandles_.resize(maxChannelCount);
|
|
17
|
+
|
|
18
|
+
for (size_t i = 0; i < maxChannelCount; ++i) {
|
|
19
|
+
auto inputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
|
|
20
|
+
inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
|
|
21
|
+
inputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
|
|
22
|
+
|
|
23
|
+
auto outputBuff = new uint8_t[RENDER_QUANTUM_SIZE * sizeof(float)];
|
|
24
|
+
outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(
|
|
25
|
+
outputBuff, RENDER_QUANTUM_SIZE * sizeof(float));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
std::shared_ptr<AudioBus> WorkletProcessingNode::processNode(
|
|
30
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
31
|
+
int framesToProcess) {
|
|
32
|
+
size_t channelCount = std::min(
|
|
33
|
+
static_cast<size_t>(2), // Fixed to stereo for now
|
|
34
|
+
static_cast<size_t>(processingBus->getNumberOfChannels()));
|
|
35
|
+
|
|
36
|
+
// Copy input data to pre-allocated input buffers
|
|
37
|
+
for (size_t ch = 0; ch < channelCount; ch++) {
|
|
38
|
+
auto channelData = processingBus->getChannel(ch)->getData();
|
|
39
|
+
std::memcpy(
|
|
40
|
+
/* dest */ inputBuffsHandles_[ch]->data(),
|
|
41
|
+
/* src */ reinterpret_cast<const uint8_t *>(channelData),
|
|
42
|
+
/* size */ framesToProcess * sizeof(float));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Execute the worklet
|
|
46
|
+
auto result = workletRunner_.executeOnRuntimeGuardedSync(
|
|
47
|
+
[this, channelCount, framesToProcess](jsi::Runtime &rt) {
|
|
48
|
+
auto inputJsArray = jsi::Array(rt, channelCount);
|
|
49
|
+
auto outputJsArray = jsi::Array(rt, channelCount);
|
|
50
|
+
|
|
51
|
+
for (size_t ch = 0; ch < channelCount; ch++) {
|
|
52
|
+
// Create input array buffer
|
|
53
|
+
auto inputArrayBuffer = jsi::ArrayBuffer(rt, inputBuffsHandles_[ch]);
|
|
54
|
+
inputJsArray.setValueAtIndex(rt, ch, inputArrayBuffer);
|
|
55
|
+
|
|
56
|
+
// Create output array buffer
|
|
57
|
+
auto outputArrayBuffer =
|
|
58
|
+
jsi::ArrayBuffer(rt, outputBuffsHandles_[ch]);
|
|
59
|
+
outputJsArray.setValueAtIndex(rt, ch, outputArrayBuffer);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return workletRunner_
|
|
63
|
+
.executeWorklet(
|
|
64
|
+
shareableWorklet_,
|
|
65
|
+
inputJsArray,
|
|
66
|
+
outputJsArray,
|
|
67
|
+
jsi::Value(rt, static_cast<int>(framesToProcess)),
|
|
68
|
+
jsi::Value(rt, this->context_->getCurrentTime()))
|
|
69
|
+
.value_or(jsi::Value::undefined());
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Copy processed output data back to the processing bus or zero on failure
|
|
73
|
+
for (size_t ch = 0; ch < channelCount; ch++) {
|
|
74
|
+
auto channelData = processingBus->getChannel(ch)->getData();
|
|
75
|
+
|
|
76
|
+
if (result.has_value()) {
|
|
77
|
+
// Copy processed output data
|
|
78
|
+
std::memcpy(
|
|
79
|
+
/* dest */ reinterpret_cast<uint8_t *>(channelData),
|
|
80
|
+
/* src */ outputBuffsHandles_[ch]->data(),
|
|
81
|
+
/* size */ framesToProcess * sizeof(float));
|
|
82
|
+
} else {
|
|
83
|
+
// Zero the output on worklet execution failure
|
|
84
|
+
std::memset(channelData, 0, framesToProcess * sizeof(float));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return processingBus;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <jsi/jsi.h>
|
|
4
|
+
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
5
|
+
#include <audioapi/core/AudioNode.h>
|
|
6
|
+
#include <audioapi/core/BaseAudioContext.h>
|
|
7
|
+
#include <audioapi/utils/AudioBus.h>
|
|
8
|
+
#include <audioapi/utils/AudioArray.h>
|
|
9
|
+
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
10
|
+
|
|
11
|
+
#include <memory>
|
|
12
|
+
#include <vector>
|
|
13
|
+
|
|
14
|
+
namespace audioapi {
|
|
15
|
+
|
|
16
|
+
#if RN_AUDIO_API_TEST
|
|
17
|
+
class WorkletProcessingNode : public AudioNode {
|
|
18
|
+
public:
|
|
19
|
+
explicit WorkletProcessingNode(
|
|
20
|
+
BaseAudioContext *context,
|
|
21
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
22
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime
|
|
23
|
+
) : AudioNode(context) {}
|
|
24
|
+
|
|
25
|
+
protected:
|
|
26
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override { return processingBus; }
|
|
27
|
+
};
|
|
28
|
+
#else
|
|
29
|
+
|
|
30
|
+
using namespace facebook;
|
|
31
|
+
|
|
32
|
+
class WorkletProcessingNode : public AudioNode {
|
|
33
|
+
public:
|
|
34
|
+
explicit WorkletProcessingNode(
|
|
35
|
+
BaseAudioContext *context,
|
|
36
|
+
std::shared_ptr<worklets::SerializableWorklet> &worklet,
|
|
37
|
+
std::weak_ptr<worklets::WorkletRuntime> runtime
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
protected:
|
|
41
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
42
|
+
|
|
43
|
+
private:
|
|
44
|
+
WorkletsRunner workletRunner_;
|
|
45
|
+
std::shared_ptr<worklets::SerializableWorklet> shareableWorklet_;
|
|
46
|
+
std::vector<std::shared_ptr<AudioArrayBuffer>> inputBuffsHandles_;
|
|
47
|
+
std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
#endif // RN_AUDIO_API_TEST
|
|
51
|
+
|
|
52
|
+
} // namespace audioapi
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#include <audioapi/HostObjects/AudioBufferHostObject.h>
|
|
1
|
+
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
2
2
|
#include <audioapi/core/inputs/AudioRecorder.h>
|
|
3
3
|
#include <audioapi/core/sources/AudioBuffer.h>
|
|
4
4
|
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
#include <audioapi/core/AudioParam.h>
|
|
2
2
|
#include <audioapi/core/BaseAudioContext.h>
|
|
3
|
-
#include <audioapi/core/Constants.h>
|
|
4
3
|
#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
|
|
4
|
+
#include <audioapi/core/utils/Constants.h>
|
|
5
5
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
6
6
|
#include <audioapi/utils/AudioArray.h>
|
|
7
7
|
#include <audioapi/utils/AudioBus.h>
|
|
8
8
|
|
|
9
9
|
namespace audioapi {
|
|
10
|
-
AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(
|
|
11
|
-
|
|
10
|
+
AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(
|
|
11
|
+
BaseAudioContext *context,
|
|
12
|
+
bool pitchCorrection)
|
|
13
|
+
: AudioScheduledSourceNode(context),
|
|
14
|
+
pitchCorrection_(pitchCorrection),
|
|
15
|
+
vReadIndex_(0.0) {
|
|
12
16
|
onPositionChangedInterval_ = static_cast<int>(context->getSampleRate() * 0.1);
|
|
13
17
|
|
|
14
18
|
detuneParam_ = std::make_shared<AudioParam>(
|
|
@@ -24,12 +28,7 @@ AudioBufferBaseSourceNode::AudioBufferBaseSourceNode(BaseAudioContext *context)
|
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
AudioBufferBaseSourceNode::~AudioBufferBaseSourceNode() {
|
|
27
|
-
|
|
28
|
-
context_->audioEventHandlerRegistry_ != nullptr) {
|
|
29
|
-
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
30
|
-
"positionChanged", onPositionChangedCallbackId_);
|
|
31
|
-
onPositionChangedCallbackId_ = 0;
|
|
32
|
-
}
|
|
31
|
+
clearOnPositionChangedCallback();
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {
|
|
@@ -62,7 +61,7 @@ void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
|
|
|
62
61
|
context_->getSampleRate() * static_cast<float>(interval) / 1000);
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
int AudioBufferBaseSourceNode::getOnPositionChangedInterval() {
|
|
64
|
+
int AudioBufferBaseSourceNode::getOnPositionChangedInterval() const {
|
|
66
65
|
return onPositionChangedInterval_;
|
|
67
66
|
}
|
|
68
67
|
|
|
@@ -125,7 +124,45 @@ void AudioBufferBaseSourceNode::processWithPitchCorrection(
|
|
|
125
124
|
if (detune != 0.0f) {
|
|
126
125
|
stretch_->setTransposeSemitones(detune);
|
|
127
126
|
}
|
|
127
|
+
|
|
128
128
|
sendOnPositionChangedEvent();
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
void AudioBufferBaseSourceNode::processWithoutPitchCorrection(
|
|
132
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
133
|
+
int framesToProcess) {
|
|
134
|
+
size_t startOffset = 0;
|
|
135
|
+
size_t offsetLength = 0;
|
|
136
|
+
|
|
137
|
+
auto computedPlaybackRate = getComputedPlaybackRateValue(framesToProcess);
|
|
138
|
+
updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
|
|
139
|
+
|
|
140
|
+
if (computedPlaybackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {
|
|
141
|
+
processingBus->zero();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (std::fabs(computedPlaybackRate) == 1.0) {
|
|
146
|
+
processWithoutInterpolation(
|
|
147
|
+
processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
148
|
+
} else {
|
|
149
|
+
processWithInterpolation(
|
|
150
|
+
processingBus, startOffset, offsetLength, computedPlaybackRate);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
sendOnPositionChangedEvent();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
float AudioBufferBaseSourceNode::getComputedPlaybackRateValue(
|
|
157
|
+
int framesToProcess) {
|
|
158
|
+
auto time = context_->getCurrentTime();
|
|
159
|
+
|
|
160
|
+
auto playbackRate =
|
|
161
|
+
playbackRateParam_->processKRateParam(framesToProcess, time);
|
|
162
|
+
auto detune = std::pow(
|
|
163
|
+
2.0f, detuneParam_->processKRateParam(framesToProcess, time) / 1200.0f);
|
|
164
|
+
|
|
165
|
+
return playbackRate * detune;
|
|
166
|
+
}
|
|
167
|
+
|
|
131
168
|
} // namespace audioapi
|
|
@@ -14,8 +14,8 @@ class AudioParam;
|
|
|
14
14
|
|
|
15
15
|
class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
16
16
|
public:
|
|
17
|
-
explicit AudioBufferBaseSourceNode(BaseAudioContext *context);
|
|
18
|
-
|
|
17
|
+
explicit AudioBufferBaseSourceNode(BaseAudioContext *context, bool pitchCorrection);
|
|
18
|
+
~AudioBufferBaseSourceNode() override;
|
|
19
19
|
|
|
20
20
|
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
21
21
|
[[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
|
|
@@ -23,9 +23,12 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
|
23
23
|
void clearOnPositionChangedCallback();
|
|
24
24
|
void setOnPositionChangedCallbackId(uint64_t callbackId);
|
|
25
25
|
void setOnPositionChangedInterval(int interval);
|
|
26
|
-
[[nodiscard]] int getOnPositionChangedInterval();
|
|
26
|
+
[[nodiscard]] int getOnPositionChangedInterval() const;
|
|
27
27
|
|
|
28
28
|
protected:
|
|
29
|
+
// pitch correction
|
|
30
|
+
bool pitchCorrection_;
|
|
31
|
+
|
|
29
32
|
std::mutex bufferLock_;
|
|
30
33
|
|
|
31
34
|
// pitch correction
|
|
@@ -47,13 +50,25 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
|
47
50
|
virtual double getCurrentPosition() const = 0;
|
|
48
51
|
|
|
49
52
|
void sendOnPositionChangedEvent();
|
|
53
|
+
|
|
50
54
|
void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
|
|
51
55
|
int framesToProcess);
|
|
56
|
+
void processWithoutPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
|
|
57
|
+
int framesToProcess);
|
|
58
|
+
|
|
59
|
+
float getComputedPlaybackRateValue(int framesToProcess);
|
|
60
|
+
|
|
52
61
|
virtual void processWithoutInterpolation(
|
|
53
62
|
const std::shared_ptr<AudioBus>& processingBus,
|
|
54
63
|
size_t startOffset,
|
|
55
64
|
size_t offsetLength,
|
|
56
65
|
float playbackRate) = 0;
|
|
66
|
+
|
|
67
|
+
virtual void processWithInterpolation(
|
|
68
|
+
const std::shared_ptr<AudioBus>& processingBus,
|
|
69
|
+
size_t startOffset,
|
|
70
|
+
size_t offsetLength,
|
|
71
|
+
float playbackRate) = 0;
|
|
57
72
|
};
|
|
58
73
|
|
|
59
74
|
} // namespace audioapi
|