react-native-audio-api 0.8.3 → 0.9.0-nightly-7ecb495-20251008
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/cpp/audioapi/android/core/{AudioDecoder.cpp → utils/AudioDecoder.cpp} +79 -75
- 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 +154 -38
- 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 +262 -6
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +26 -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/HostObjects/utils/AudioDecoderHostObject.cpp +133 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +28 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +58 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.h +26 -0
- package/common/cpp/audioapi/core/AudioContext.cpp +3 -4
- 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 -38
- package/common/cpp/audioapi/core/BaseAudioContext.h +17 -16
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +4 -5
- 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/types/AudioFormat.h +16 -0
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +36 -91
- package/common/cpp/audioapi/core/{AudioParamEventQueue.cpp → utils/AudioParamEventQueue.cpp} +13 -7
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +75 -0
- package/common/cpp/audioapi/core/utils/AudioStretcher.h +30 -0
- package/common/cpp/audioapi/core/{Constants.h → utils/Constants.h} +9 -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/libs/ffmpeg/FFmpegDecoding.cpp +241 -282
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h +57 -19
- 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 +13 -4
- 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/ios/audioapi/ios/core/utils/AudioDecoder.mm +160 -0
- package/lib/commonjs/api.js +57 -3
- 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/AudioDecoder.js +48 -0
- package/lib/commonjs/core/AudioDecoder.js.map +1 -0
- package/lib/commonjs/core/AudioScheduledSourceNode.js +4 -4
- package/lib/commonjs/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioStretcher.js +31 -0
- package/lib/commonjs/core/AudioStretcher.js.map +1 -0
- package/lib/commonjs/core/BaseAudioContext.js +76 -28
- 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 +9 -3
- 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/AudioDecoder.js +42 -0
- package/lib/module/core/AudioDecoder.js.map +1 -0
- package/lib/module/core/AudioScheduledSourceNode.js +4 -4
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
- package/lib/module/core/AudioStretcher.js +26 -0
- package/lib/module/core/AudioStretcher.js.map +1 -0
- package/lib/module/core/BaseAudioContext.js +76 -28
- 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 +13 -5
- 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/AudioDecoder.d.ts +4 -0
- package/lib/typescript/core/AudioDecoder.d.ts.map +1 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +1 -1
- package/lib/typescript/core/AudioStretcher.d.ts +3 -0
- package/lib/typescript/core/AudioStretcher.d.ts.map +1 -0
- package/lib/typescript/core/BaseAudioContext.d.ts +21 -16
- 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 +31 -6
- 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 +22 -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/AudioDecoder.ts +78 -0
- package/src/core/AudioScheduledSourceNode.ts +5 -5
- package/src/core/AudioStretcher.ts +43 -0
- package/src/core/BaseAudioContext.ts +174 -41
- 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 +85 -11
- 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/core/AudioDecoder.mm +0 -156
- 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
|
@@ -2,16 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/types/ContextState.h>
|
|
4
4
|
#include <audioapi/core/types/OscillatorType.h>
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
6
|
+
#include <cassert>
|
|
7
|
+
#include <complex>
|
|
8
|
+
#include <cstddef>
|
|
7
9
|
#include <functional>
|
|
8
10
|
#include <memory>
|
|
9
11
|
#include <string>
|
|
10
12
|
#include <utility>
|
|
11
13
|
#include <vector>
|
|
12
|
-
#include <complex>
|
|
13
|
-
#include <cstddef>
|
|
14
|
-
#include <cassert>
|
|
15
14
|
|
|
16
15
|
namespace audioapi {
|
|
17
16
|
|
|
@@ -20,22 +19,25 @@ class GainNode;
|
|
|
20
19
|
class AudioBuffer;
|
|
21
20
|
class PeriodicWave;
|
|
22
21
|
class OscillatorNode;
|
|
22
|
+
class ConstantSourceNode;
|
|
23
23
|
class StereoPannerNode;
|
|
24
24
|
class AudioNodeManager;
|
|
25
25
|
class BiquadFilterNode;
|
|
26
26
|
class AudioDestinationNode;
|
|
27
27
|
class AudioBufferSourceNode;
|
|
28
28
|
class AudioBufferQueueSourceNode;
|
|
29
|
-
class AudioDecoder;
|
|
30
29
|
class AnalyserNode;
|
|
31
30
|
class AudioEventHandlerRegistry;
|
|
32
31
|
class IAudioEventHandlerRegistry;
|
|
33
32
|
class RecorderAdapterNode;
|
|
33
|
+
class WorkletSourceNode;
|
|
34
|
+
class WorkletNode;
|
|
35
|
+
class WorkletProcessingNode;
|
|
34
36
|
class StreamerNode;
|
|
35
37
|
|
|
36
38
|
class BaseAudioContext {
|
|
37
39
|
public:
|
|
38
|
-
explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
40
|
+
explicit BaseAudioContext(const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
|
|
39
41
|
virtual ~BaseAudioContext() = default;
|
|
40
42
|
|
|
41
43
|
std::string getState();
|
|
@@ -45,13 +47,17 @@ class BaseAudioContext {
|
|
|
45
47
|
std::shared_ptr<AudioDestinationNode> getDestination();
|
|
46
48
|
|
|
47
49
|
std::shared_ptr<RecorderAdapterNode> createRecorderAdapter();
|
|
50
|
+
std::shared_ptr<WorkletSourceNode> createWorkletSourceNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
|
|
51
|
+
std::shared_ptr<WorkletNode> createWorkletNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime, size_t bufferLength, size_t inputChannelCount);
|
|
52
|
+
std::shared_ptr<WorkletProcessingNode> createWorkletProcessingNode(std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet, std::weak_ptr<worklets::WorkletRuntime> runtime);
|
|
48
53
|
std::shared_ptr<OscillatorNode> createOscillator();
|
|
54
|
+
std::shared_ptr<ConstantSourceNode> createConstantSource();
|
|
49
55
|
std::shared_ptr<StreamerNode> createStreamer();
|
|
50
56
|
std::shared_ptr<GainNode> createGain();
|
|
51
57
|
std::shared_ptr<StereoPannerNode> createStereoPanner();
|
|
52
58
|
std::shared_ptr<BiquadFilterNode> createBiquadFilter();
|
|
53
59
|
std::shared_ptr<AudioBufferSourceNode> createBufferSource(bool pitchCorrection);
|
|
54
|
-
std::shared_ptr<AudioBufferQueueSourceNode> createBufferQueueSource();
|
|
60
|
+
std::shared_ptr<AudioBufferQueueSourceNode> createBufferQueueSource(bool pitchCorrection);
|
|
55
61
|
static std::shared_ptr<AudioBuffer>
|
|
56
62
|
createBuffer(int numberOfChannels, size_t length, float sampleRate);
|
|
57
63
|
std::shared_ptr<PeriodicWave> createPeriodicWave(
|
|
@@ -60,10 +66,6 @@ class BaseAudioContext {
|
|
|
60
66
|
int length);
|
|
61
67
|
std::shared_ptr<AnalyserNode> createAnalyser();
|
|
62
68
|
|
|
63
|
-
std::shared_ptr<AudioBuffer> decodeAudioDataSource(const std::string &path);
|
|
64
|
-
std::shared_ptr<AudioBuffer> decodeAudioData(const void *data, size_t size);
|
|
65
|
-
std::shared_ptr<AudioBuffer> decodeWithPCMInBase64(const std::string &data, float playbackSpeed);
|
|
66
|
-
|
|
67
69
|
std::shared_ptr<PeriodicWave> getBasicWaveForm(OscillatorType type);
|
|
68
70
|
[[nodiscard]] float getNyquistFrequency() const;
|
|
69
71
|
AudioNodeManager *getNodeManager();
|
|
@@ -77,9 +79,7 @@ class BaseAudioContext {
|
|
|
77
79
|
|
|
78
80
|
std::shared_ptr<AudioDestinationNode> destination_;
|
|
79
81
|
// init in AudioContext or OfflineContext constructor
|
|
80
|
-
|
|
81
|
-
// init in AudioContext or OfflineContext constructor
|
|
82
|
-
float sampleRate_ {};
|
|
82
|
+
float sampleRate_{};
|
|
83
83
|
ContextState state_ = ContextState::RUNNING;
|
|
84
84
|
std::shared_ptr<AudioNodeManager> nodeManager_;
|
|
85
85
|
|
|
@@ -89,10 +89,11 @@ class BaseAudioContext {
|
|
|
89
89
|
std::shared_ptr<PeriodicWave> cachedSawtoothWave_ = nullptr;
|
|
90
90
|
std::shared_ptr<PeriodicWave> cachedTriangleWave_ = nullptr;
|
|
91
91
|
|
|
92
|
-
virtual bool isDriverRunning() const = 0;
|
|
92
|
+
[[nodiscard]] virtual bool isDriverRunning() const = 0;
|
|
93
93
|
|
|
94
94
|
public:
|
|
95
95
|
std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
96
|
+
RuntimeRegistry runtimeRegistry_;
|
|
96
97
|
};
|
|
97
98
|
|
|
98
99
|
} // namespace audioapi
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#include "OfflineAudioContext.h"
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/AudioContext.h>
|
|
4
|
-
#include <audioapi/core/Constants.h>
|
|
5
4
|
#include <audioapi/core/destinations/AudioDestinationNode.h>
|
|
6
5
|
#include <audioapi/core/sources/AudioBuffer.h>
|
|
7
|
-
#include <audioapi/core/utils/AudioDecoder.h>
|
|
8
6
|
#include <audioapi/core/utils/AudioNodeManager.h>
|
|
7
|
+
#include <audioapi/core/utils/Constants.h>
|
|
9
8
|
#include <audioapi/core/utils/Locker.h>
|
|
10
9
|
#include <audioapi/utils/AudioArray.h>
|
|
11
10
|
#include <audioapi/utils/AudioBus.h>
|
|
@@ -23,13 +22,13 @@ OfflineAudioContext::OfflineAudioContext(
|
|
|
23
22
|
size_t length,
|
|
24
23
|
float sampleRate,
|
|
25
24
|
const std::shared_ptr<IAudioEventHandlerRegistry>
|
|
26
|
-
&audioEventHandlerRegistry
|
|
27
|
-
|
|
25
|
+
&audioEventHandlerRegistry,
|
|
26
|
+
const RuntimeRegistry &runtimeRegistry)
|
|
27
|
+
: BaseAudioContext(audioEventHandlerRegistry, runtimeRegistry),
|
|
28
28
|
length_(length),
|
|
29
29
|
numberOfChannels_(numberOfChannels),
|
|
30
30
|
currentSampleFrame_(0) {
|
|
31
31
|
sampleRate_ = sampleRate;
|
|
32
|
-
audioDecoder_ = std::make_shared<AudioDecoder>(sampleRate_);
|
|
33
32
|
resultBus_ = std::make_shared<AudioBus>(
|
|
34
33
|
static_cast<int>(length_), numberOfChannels_, sampleRate_);
|
|
35
34
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include "BaseAudioContext.h"
|
|
4
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
4
5
|
|
|
5
6
|
#include <mutex>
|
|
6
7
|
#include <map>
|
|
@@ -14,7 +15,7 @@ using OfflineAudioContextResultCallback = std::function<void(std::shared_ptr<Aud
|
|
|
14
15
|
|
|
15
16
|
class OfflineAudioContext : public BaseAudioContext {
|
|
16
17
|
public:
|
|
17
|
-
explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
18
|
+
explicit OfflineAudioContext(int numberOfChannels, size_t length, float sampleRate, const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry, const RuntimeRegistry &runtimeRegistry);
|
|
18
19
|
~OfflineAudioContext() override;
|
|
19
20
|
|
|
20
21
|
void resume();
|
|
@@ -143,7 +143,7 @@ void AnalyserNode::getByteTimeDomainData(uint8_t *data, int length) {
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
std::shared_ptr<AudioBus> AnalyserNode::processNode(
|
|
147
147
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
148
148
|
int framesToProcess) {
|
|
149
149
|
// Analyser should behave like a sniffer node, it should not modify the
|
|
@@ -156,6 +156,8 @@ void AnalyserNode::processNode(
|
|
|
156
156
|
downMixBus_->getChannel(0)->getData(), framesToProcess, true);
|
|
157
157
|
|
|
158
158
|
shouldDoFFTAnalysis_ = true;
|
|
159
|
+
|
|
160
|
+
return processingBus;
|
|
159
161
|
}
|
|
160
162
|
|
|
161
163
|
void AnalyserNode::doFFTAnalysis() {
|
|
@@ -39,7 +39,7 @@ class AnalyserNode : public AudioNode {
|
|
|
39
39
|
void getByteTimeDomainData(uint8_t *data, int length);
|
|
40
40
|
|
|
41
41
|
protected:
|
|
42
|
-
|
|
42
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
43
43
|
|
|
44
44
|
private:
|
|
45
45
|
int fftSize_;
|
|
@@ -24,7 +24,7 @@ class AudioDestinationNode : public AudioNode {
|
|
|
24
24
|
protected:
|
|
25
25
|
// DestinationNode is triggered by AudioContext using renderAudio
|
|
26
26
|
// processNode function is not necessary and is never called.
|
|
27
|
-
|
|
27
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int) final { return processingBus; };
|
|
28
28
|
|
|
29
29
|
private:
|
|
30
30
|
std::size_t currentSampleFrame_;
|
|
@@ -353,7 +353,7 @@ void BiquadFilterNode::applyFilter() {
|
|
|
353
353
|
}
|
|
354
354
|
}
|
|
355
355
|
|
|
356
|
-
|
|
356
|
+
std::shared_ptr<AudioBus> BiquadFilterNode::processNode(
|
|
357
357
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
358
358
|
int framesToProcess) {
|
|
359
359
|
int numChannels = processingBus->getNumberOfChannels();
|
|
@@ -393,6 +393,8 @@ void BiquadFilterNode::processNode(
|
|
|
393
393
|
x2_ = x2;
|
|
394
394
|
y1_ = y1;
|
|
395
395
|
y2_ = y2;
|
|
396
|
+
|
|
397
|
+
return processingBus;
|
|
396
398
|
}
|
|
397
399
|
|
|
398
400
|
} // namespace audioapi
|
|
@@ -16,7 +16,7 @@ std::shared_ptr<AudioParam> GainNode::getGainParam() const {
|
|
|
16
16
|
return gainParam_;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
std::shared_ptr<AudioBus> GainNode::processNode(
|
|
20
20
|
const std::shared_ptr<AudioBus> &processingBus,
|
|
21
21
|
int framesToProcess) {
|
|
22
22
|
double time = context_->getCurrentTime();
|
|
@@ -28,6 +28,8 @@ void GainNode::processNode(
|
|
|
28
28
|
processingBus->getChannel(i)->getData(),
|
|
29
29
|
framesToProcess);
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
return processingBus;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
} // namespace audioapi
|
|
@@ -16,7 +16,7 @@ class GainNode : public AudioNode {
|
|
|
16
16
|
[[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;
|
|
17
17
|
|
|
18
18
|
protected:
|
|
19
|
-
|
|
19
|
+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
|
|
20
20
|
|
|
21
21
|
private:
|
|
22
22
|
std::shared_ptr<AudioParam> gainParam_;
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
#include <audioapi/core/Constants.h>
|
|
30
29
|
#include <audioapi/core/effects/PeriodicWave.h>
|
|
30
|
+
#include <audioapi/core/utils/Constants.h>
|
|
31
31
|
#include <audioapi/dsp/VectorMath.h>
|
|
32
32
|
|
|
33
33
|
constexpr unsigned NumberOfOctaveBands = 3;
|
|
@@ -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>
|