react-native-audio-api 0.8.3 → 0.9.0-nightly-96a5bcd-20251007
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 +129 -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 +107 -0
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h +28 -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 -90
- 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/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 +50 -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/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 +8 -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/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 +11 -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/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 +27 -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 +17 -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/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 +77 -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
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/react-native-audio-api)
|
|
6
6
|
[](https://www.npmjs.com/package/react-native-audio-api?activeTab=versions)
|
|
7
|
+
<br />
|
|
7
8
|
[](https://github.com/software-mansion/react-native-audio-api/actions/workflows/ci.yml)
|
|
8
|
-
[](https://github.com/software-mansion/react-native-audio-api/actions/workflows/npm-publish-nightly.yml)
|
|
9
9
|
[](https://github.com/software-mansion/react-native-audio-api/actions/workflows/tests.yml)
|
|
10
10
|
|
|
11
11
|
`react-native-audio-api` provides system for controlling audio in React Native environment compatible with Web Audio API specification,
|
|
@@ -17,55 +17,56 @@ check out the [Getting Started](https://docs.swmansion.com/react-native-audio-ap
|
|
|
17
17
|
|
|
18
18
|
## Roadmap
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
**Sound synthesis and system audio** 🐣 <br />
|
|
22
|
-
Access to devices audio engines and threads, basic nodes for sound synthesis, simple effects and audio graph implementation
|
|
23
|
-
<br />
|
|
20
|
+
### Planned
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
**Graph Processing** 🛎️ <br />
|
|
27
|
-
Support for multi-channel audio processing, audio-graph route optimizations, improved react-native layer for managing audio nodes
|
|
28
|
-
<br />
|
|
22
|
+
### <img src="https://img.shields.io/badge/Coming_in-0.9.0-orange" />
|
|
29
23
|
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
Support for local and remote audio file resources: MP3, WAV, FLAC.
|
|
33
|
-
<br />
|
|
24
|
+
- **JS Audio Worklets V1 🐎**<br />
|
|
25
|
+
Receive events and data callbacks from audio thread to synchronize with UI on UI thread.
|
|
34
26
|
|
|
35
|
-
|
|
36
|
-
**Analyser Node** 🌊 <br />
|
|
37
|
-
Ability to draw, animate or simply debug audio data in time or frequency domain.
|
|
38
|
-
<br />
|
|
27
|
+
### <img src="https://img.shields.io/badge/Coming_in-x.x.x-orange" />
|
|
39
28
|
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
Ability to modify playback speed without affecting pitch of the sound
|
|
43
|
-
<br />
|
|
29
|
+
- **Convolver Node 🐐**<br />
|
|
30
|
+
Realistic reverb and spatial effects in the browser by applying impulse responses. It makes audio sound like it’s being played in real spaces, from small rooms to cathedrals, or through hardware like amps and speakers
|
|
44
31
|
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
Full control of system audio settings, remote controls, lock screen integration and most importantly configurable background modes
|
|
32
|
+
- **Decoding and utility modules 🔧**<br />
|
|
33
|
+
Decode and modify audio data without the need to create AudioContext first through a set of utility classes
|
|
48
34
|
|
|
49
|
-
|
|
50
|
-
|
|
35
|
+
- **DynamicCompressorNode 〽️**<br />
|
|
36
|
+
Reduce the volume of loud sounds and boost quieter nodes to balance the audio signal, avoid clipping or distorted sounds
|
|
51
37
|
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet <br />
|
|
38
|
+
- **Audio tag 🏷️**<br />
|
|
39
|
+
Simple ability to play and buffer audio, with all of the most commonly used functions, same as on the web, without the need to create and manipulate an audio graph.
|
|
55
40
|
|
|
56
|
-
|
|
57
|
-
|
|
41
|
+
- **MIDI support 🎸**<br />
|
|
42
|
+
Complementary lib for react-native-audio-api, that will allow to communicate with MIDI devices or read/write MIDI files.
|
|
58
43
|
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
Ability to decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph. <br />
|
|
44
|
+
- **Spatial Audio 🛢️**<br />
|
|
45
|
+
manipulate audio in 3D space
|
|
62
46
|
|
|
63
|
-
|
|
64
|
-
|
|
47
|
+
- **Noise Cancellation 🦇**<br />
|
|
48
|
+
System-based active noise and echo cancellation support
|
|
65
49
|
|
|
66
|
-
- **JS Audio Worklets
|
|
67
|
-
|
|
68
|
-
|
|
50
|
+
- **JS Audio Worklets V2 🐎**<br />
|
|
51
|
+
Customize the process pipeline with JS functions running on audio thread.
|
|
52
|
+
|
|
53
|
+
### <a href="https://github.com/software-mansion/react-native-audio-api/releases/tag/0.8.0"><img src="https://img.shields.io/badge/Released_in-0.8.0-green" /></a>
|
|
54
|
+
|
|
55
|
+
- **Decoding support for m4a/mp4/aac/ogg/opus 📁** <br />
|
|
56
|
+
Decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph.
|
|
57
|
+
|
|
58
|
+
- **HLS streaming support** 🌊 <br />
|
|
59
|
+
Stream audio from HLS sources, allowing for playback of live audio streams or pre-recorded audio files.
|
|
60
|
+
|
|
61
|
+
### <a href="https://github.com/software-mansion/react-native-audio-api/releases/tag/0.7.0"><img src="https://img.shields.io/badge/Released_in-0.7.0-green" /></a>
|
|
62
|
+
|
|
63
|
+
- **Microphone support 🎙️** <br />
|
|
64
|
+
Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet.
|
|
65
|
+
|
|
66
|
+
- **Custom Audio Processor ⚙️** <br />
|
|
67
|
+
Write your own processing AudioNode.
|
|
68
|
+
|
|
69
|
+
See more in [Changelog](./ghdocs/changelog.md)
|
|
69
70
|
|
|
70
71
|
## Web Audio API Specification Coverage
|
|
71
72
|
|
package/RNAudioAPI.podspec
CHANGED
|
@@ -4,7 +4,7 @@ package_json = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
|
4
4
|
|
|
5
5
|
$new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
|
|
6
6
|
|
|
7
|
-
folly_flags = "-
|
|
7
|
+
folly_flags = "-DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32"
|
|
8
8
|
fabric_flags = $new_arch_enabled ? '-DRCT_NEW_ARCH_ENABLED' : ''
|
|
9
9
|
version_flag = "-DAUDIOAPI_VERSION=#{package_json['version']}"
|
|
10
10
|
|
|
@@ -20,12 +20,12 @@ Pod::Spec.new do |s|
|
|
|
20
20
|
s.source = { :git => "https://github.com/software-mansion/react-native-audio-api.git", :tag => "#{s.version}" }
|
|
21
21
|
|
|
22
22
|
s.subspec "audioapi" do |ss|
|
|
23
|
-
ss.source_files = "common/cpp/audioapi/**/*.{cpp,c,h}"
|
|
23
|
+
ss.source_files = "common/cpp/audioapi/**/*.{cpp,c,h,hpp}"
|
|
24
24
|
ss.header_dir = "audioapi"
|
|
25
25
|
ss.header_mappings_dir = "common/cpp/audioapi"
|
|
26
26
|
|
|
27
27
|
ss.subspec "ios" do |sss|
|
|
28
|
-
sss.source_files = "ios/audioapi/**/*.{mm,h,m}"
|
|
28
|
+
sss.source_files = "ios/audioapi/**/*.{mm,h,m,hpp}"
|
|
29
29
|
sss.header_dir = "audioapi"
|
|
30
30
|
sss.header_mappings_dir = "ios/audioapi"
|
|
31
31
|
end
|
|
@@ -42,16 +42,18 @@ Pod::Spec.new do |s|
|
|
|
42
42
|
# Assumes Pods dir is nested under ios project dir
|
|
43
43
|
ios_dir = File.join(Pod::Config.instance.project_pods_root, '..')
|
|
44
44
|
rn_audio_dir_relative = Pathname.new(__dir__).relative_path_from(ios_dir).to_s
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
|
|
46
|
+
external_dir_relative = "common/cpp/audioapi/external"
|
|
47
|
+
lib_dir = "$(PROJECT_DIR)/#{rn_audio_dir_relative}/#{external_dir_relative}/$(PLATFORM_NAME)"
|
|
48
|
+
|
|
49
|
+
external_dir = File.join(__dir__, "common/cpp/audioapi/external")
|
|
50
|
+
|
|
48
51
|
s.ios.vendored_frameworks = [
|
|
49
52
|
'common/cpp/audioapi/external/libavcodec.xcframework',
|
|
50
53
|
'common/cpp/audioapi/external/libavformat.xcframework',
|
|
51
54
|
'common/cpp/audioapi/external/libavutil.xcframework',
|
|
52
55
|
'common/cpp/audioapi/external/libswresample.xcframework'
|
|
53
56
|
]
|
|
54
|
-
|
|
55
57
|
s.pod_target_xcconfig = {
|
|
56
58
|
"USE_HEADERMAP" => "YES",
|
|
57
59
|
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
|
|
@@ -59,12 +61,15 @@ s.pod_target_xcconfig = {
|
|
|
59
61
|
"HEADER_SEARCH_PATHS" => %W[
|
|
60
62
|
$(PODS_TARGET_SRCROOT)/common/cpp
|
|
61
63
|
$(PODS_TARGET_SRCROOT)/ios
|
|
62
|
-
$(
|
|
63
|
-
$(
|
|
64
|
-
$(PODS_TARGET_SRCROOT)/#{
|
|
65
|
-
$(PODS_TARGET_SRCROOT)/
|
|
64
|
+
$(PODS_ROOT)/Headers/Public/RNWorklets
|
|
65
|
+
$(PODS_ROOT)/Headers/Private/React-Core
|
|
66
|
+
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include
|
|
67
|
+
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/opus
|
|
68
|
+
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/vorbis
|
|
69
|
+
$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/ffmpeg_include
|
|
66
70
|
].join(" "),
|
|
67
|
-
'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
|
|
71
|
+
'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}",
|
|
72
|
+
'OTHER_CPLUSPLUSFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
|
|
68
73
|
}
|
|
69
74
|
|
|
70
75
|
s.user_target_xcconfig = {
|
package/android/build.gradle
CHANGED
|
@@ -65,6 +65,15 @@ def resolveReactNativeDirectory() {
|
|
|
65
65
|
)
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
def resolveReactNativeWorkletsDirectory() {
|
|
69
|
+
def rnWorklets = rootProject.subprojects.find { it.name == 'react-native-worklets' }
|
|
70
|
+
if (rnWorklets != null) {
|
|
71
|
+
return rnWorklets.projectDir
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
68
77
|
def toPlatformFileString(String path) {
|
|
69
78
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
|
70
79
|
path = path.replace(File.separatorChar, '/' as char)
|
|
@@ -82,6 +91,8 @@ static def supportsNamespace() {
|
|
|
82
91
|
}
|
|
83
92
|
|
|
84
93
|
def reactNativeRootDir = resolveReactNativeDirectory()
|
|
94
|
+
def reactNativeWorkletsRootDir = resolveReactNativeWorkletsDirectory()
|
|
95
|
+
def isWorkletsAvailable = reactNativeWorkletsRootDir != null
|
|
85
96
|
|
|
86
97
|
def reactProperties = new Properties()
|
|
87
98
|
file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
|
|
@@ -112,17 +123,30 @@ android {
|
|
|
112
123
|
defaultConfig {
|
|
113
124
|
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
|
|
114
125
|
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
|
|
126
|
+
|
|
115
127
|
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
128
|
+
buildConfigField "boolean", "RN_AUDIO_API_ENABLE_WORKLETS", "${isWorkletsAvailable}"
|
|
129
|
+
|
|
130
|
+
|
|
116
131
|
|
|
117
132
|
externalNativeBuild {
|
|
118
133
|
cmake {
|
|
119
134
|
abiFilters (*reactNativeArchitectures())
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
135
|
+
|
|
136
|
+
def cmakeArgs = [
|
|
137
|
+
"-DANDROID_STL=c++_shared",
|
|
138
|
+
"-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
|
|
139
|
+
"-DANDROID_TOOLCHAIN=clang",
|
|
140
|
+
"-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}",
|
|
141
|
+
"-DRN_AUDIO_API_WORKLETS_ENABLED=${isWorkletsAvailable}",
|
|
124
142
|
"-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}",
|
|
125
143
|
"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
if (isWorkletsAvailable) {
|
|
147
|
+
cmakeArgs << "-DREACT_NATIVE_WORKLETS_DIR=${toPlatformFileString(reactNativeWorkletsRootDir.path)}"
|
|
148
|
+
}
|
|
149
|
+
arguments = cmakeArgs
|
|
126
150
|
}
|
|
127
151
|
}
|
|
128
152
|
}
|
|
@@ -225,8 +249,24 @@ dependencies {
|
|
|
225
249
|
implementation 'com.facebook.fbjni:fbjni:0.6.0'
|
|
226
250
|
implementation 'com.google.oboe:oboe:1.9.3'
|
|
227
251
|
implementation 'androidx.media:media:1.7.0'
|
|
252
|
+
|
|
253
|
+
if (isWorkletsAvailable) {
|
|
254
|
+
implementation(rootProject.subprojects.find { it.name == 'react-native-worklets' })
|
|
255
|
+
}
|
|
228
256
|
}
|
|
229
257
|
|
|
258
|
+
if (isWorkletsAvailable) {
|
|
259
|
+
// Ensure worklets is built before react-native-audio-api
|
|
260
|
+
def rnWorkletsProject = rootProject.subprojects.find { it.name == 'react-native-worklets' }
|
|
261
|
+
evaluationDependsOn(rnWorkletsProject.path)
|
|
262
|
+
|
|
263
|
+
afterEvaluate {
|
|
264
|
+
tasks.getByName("buildCMakeDebug").dependsOn(rnWorkletsProject.tasks.getByName("mergeDebugNativeLibs"))
|
|
265
|
+
tasks.getByName("buildCMakeRelWithDebInfo").dependsOn(rnWorkletsProject.tasks.getByName("mergeReleaseNativeLibs"))
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
|
|
230
270
|
def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask {
|
|
231
271
|
// If you change the minimal React Native version remember to update Compatibility Table in docs
|
|
232
272
|
def minimalReactNativeVersion = 76
|
|
@@ -27,6 +27,12 @@ find_package(ReactAndroid REQUIRED CONFIG)
|
|
|
27
27
|
find_package(fbjni REQUIRED CONFIG)
|
|
28
28
|
find_package(oboe REQUIRED CONFIG)
|
|
29
29
|
|
|
30
|
+
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
|
|
31
|
+
set(BUILD_TYPE "debug")
|
|
32
|
+
else()
|
|
33
|
+
set(BUILD_TYPE "release")
|
|
34
|
+
endif()
|
|
35
|
+
|
|
30
36
|
target_include_directories(
|
|
31
37
|
react-native-audio-api
|
|
32
38
|
PRIVATE
|
|
@@ -48,10 +54,69 @@ set(LINK_LIBRARIES
|
|
|
48
54
|
oboe::oboe
|
|
49
55
|
)
|
|
50
56
|
|
|
57
|
+
set(INCLUDE_LIBRARIES
|
|
58
|
+
"${COMMON_CPP_DIR}"
|
|
59
|
+
"${ANDROID_CPP_DIR}"
|
|
60
|
+
"${INCLUDE_DIR}"
|
|
61
|
+
"${INCLUDE_DIR}/opus"
|
|
62
|
+
"${INCLUDE_DIR}/vorbis"
|
|
63
|
+
"${REACT_NATIVE_DIR}/ReactCommon"
|
|
64
|
+
"${REACT_NATIVE_DIR}/ReactCommon/jsiexecutor"
|
|
65
|
+
"${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
|
|
66
|
+
"${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if(RN_AUDIO_API_WORKLETS_ENABLED)
|
|
70
|
+
# Import the worklets library (similar to how Reanimated does it)
|
|
71
|
+
add_library(worklets SHARED IMPORTED)
|
|
72
|
+
set_target_properties(
|
|
73
|
+
worklets
|
|
74
|
+
PROPERTIES
|
|
75
|
+
IMPORTED_LOCATION
|
|
76
|
+
"${REACT_NATIVE_WORKLETS_DIR}/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so"
|
|
77
|
+
)
|
|
78
|
+
list(APPEND INCLUDE_LIBRARIES
|
|
79
|
+
"${REACT_NATIVE_WORKLETS_DIR}/../Common/cpp"
|
|
80
|
+
"${REACT_NATIVE_WORKLETS_DIR}/src/main/cpp"
|
|
81
|
+
)
|
|
82
|
+
list(APPEND LINK_LIBRARIES worklets)
|
|
83
|
+
endif()
|
|
84
|
+
|
|
85
|
+
target_include_directories(
|
|
86
|
+
react-native-audio-api
|
|
87
|
+
PRIVATE
|
|
88
|
+
${INCLUDE_LIBRARIES}
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
92
|
+
set(RN_VERSION_LINK_LIBRARIES
|
|
93
|
+
ReactAndroid::reactnative
|
|
94
|
+
)
|
|
95
|
+
else()
|
|
96
|
+
set(RN_VERSION_LINK_LIBRARIES
|
|
97
|
+
ReactAndroid::folly_runtime
|
|
98
|
+
ReactAndroid::react_nativemodule_core
|
|
99
|
+
ReactAndroid::glog
|
|
100
|
+
ReactAndroid::reactnativejni
|
|
101
|
+
)
|
|
102
|
+
endif()
|
|
103
|
+
|
|
51
104
|
set(RN_VERSION_LINK_LIBRARIES
|
|
52
105
|
ReactAndroid::reactnative
|
|
53
106
|
)
|
|
54
107
|
|
|
108
|
+
if(RN_AUDIO_API_WORKLETS_ENABLED)
|
|
109
|
+
target_compile_definitions(
|
|
110
|
+
react-native-audio-api
|
|
111
|
+
PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=1
|
|
112
|
+
)
|
|
113
|
+
else()
|
|
114
|
+
target_compile_definitions(
|
|
115
|
+
react-native-audio-api
|
|
116
|
+
PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=0
|
|
117
|
+
)
|
|
118
|
+
endif()
|
|
119
|
+
|
|
55
120
|
target_link_libraries(react-native-audio-api
|
|
56
121
|
${LINK_LIBRARIES}
|
|
57
122
|
${RN_VERSION_LINK_LIBRARIES}
|
|
@@ -6,10 +6,16 @@ using namespace facebook::jni;
|
|
|
6
6
|
|
|
7
7
|
AudioAPIModule::AudioAPIModule(
|
|
8
8
|
jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
|
|
9
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
10
|
+
std::weak_ptr<WorkletsModuleProxy> weakWorkletsModuleProxy,
|
|
11
|
+
#endif
|
|
9
12
|
jsi::Runtime *jsiRuntime,
|
|
10
13
|
const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker)
|
|
11
14
|
: javaPart_(make_global(jThis)),
|
|
12
15
|
jsiRuntime_(jsiRuntime),
|
|
16
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
17
|
+
weakWorkletsModuleProxy_(weakWorkletsModuleProxy),
|
|
18
|
+
#endif
|
|
13
19
|
jsCallInvoker_(jsCallInvoker) {
|
|
14
20
|
audioEventHandlerRegistry_ =
|
|
15
21
|
std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);
|
|
@@ -17,12 +23,25 @@ AudioAPIModule::AudioAPIModule(
|
|
|
17
23
|
|
|
18
24
|
jni::local_ref<AudioAPIModule::jhybriddata> AudioAPIModule::initHybrid(
|
|
19
25
|
jni::alias_ref<jhybridobject> jThis,
|
|
26
|
+
jni::alias_ref<jni::JObject> jWorkletsModule,
|
|
20
27
|
jlong jsContext,
|
|
21
28
|
jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
|
|
22
29
|
jsCallInvokerHolder) {
|
|
23
30
|
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
|
|
24
31
|
auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
|
|
32
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
33
|
+
if (jWorkletsModule) {
|
|
34
|
+
auto castedModule =
|
|
35
|
+
jni::static_ref_cast<WorkletsModule::javaobject>(jWorkletsModule);
|
|
36
|
+
auto workletsModuleProxy = castedModule->cthis()->getWorkletsModuleProxy();
|
|
37
|
+
return makeCxxInstance(
|
|
38
|
+
jThis, workletsModuleProxy, rnRuntime, jsCallInvoker);
|
|
39
|
+
}
|
|
40
|
+
throw std::runtime_error(
|
|
41
|
+
"Worklets module is required but not provided from Java/Kotlin side");
|
|
42
|
+
#else
|
|
25
43
|
return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
|
|
44
|
+
#endif
|
|
26
45
|
}
|
|
27
46
|
|
|
28
47
|
void AudioAPIModule::registerNatives() {
|
|
@@ -36,8 +55,17 @@ void AudioAPIModule::registerNatives() {
|
|
|
36
55
|
}
|
|
37
56
|
|
|
38
57
|
void AudioAPIModule::injectJSIBindings() {
|
|
58
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
59
|
+
auto uiWorkletRuntime =
|
|
60
|
+
weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();
|
|
61
|
+
#else
|
|
62
|
+
auto uiWorkletRuntime = nullptr;
|
|
63
|
+
#endif
|
|
39
64
|
AudioAPIModuleInstaller::injectJSIBindings(
|
|
40
|
-
jsiRuntime_,
|
|
65
|
+
jsiRuntime_,
|
|
66
|
+
jsCallInvoker_,
|
|
67
|
+
audioEventHandlerRegistry_,
|
|
68
|
+
uiWorkletRuntime);
|
|
41
69
|
}
|
|
42
70
|
|
|
43
71
|
void AudioAPIModule::invokeHandlerWithEventNameAndEventBody(
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#include <fbjni/fbjni.h>
|
|
8
8
|
#include <react/jni/CxxModuleWrapper.h>
|
|
9
9
|
#include <react/jni/JMessageQueueThread.h>
|
|
10
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
10
11
|
#include <memory>
|
|
11
12
|
#include <utility>
|
|
12
13
|
#include <unordered_map>
|
|
@@ -15,6 +16,7 @@ namespace audioapi {
|
|
|
15
16
|
|
|
16
17
|
using namespace facebook;
|
|
17
18
|
using namespace react;
|
|
19
|
+
using namespace worklets;
|
|
18
20
|
|
|
19
21
|
class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
|
|
20
22
|
public:
|
|
@@ -23,6 +25,7 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
|
|
|
23
25
|
|
|
24
26
|
static jni::local_ref<AudioAPIModule::jhybriddata> initHybrid(
|
|
25
27
|
jni::alias_ref<jhybridobject> jThis,
|
|
28
|
+
jni::alias_ref<jni::JObject> jWorkletsModule, // it will be null if RN_AUDIO_API_ENABLE_WORKLETS is false
|
|
26
29
|
jlong jsContext,
|
|
27
30
|
jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
|
|
28
31
|
jsCallInvokerHolder);
|
|
@@ -37,13 +40,24 @@ class AudioAPIModule : public jni::HybridClass<AudioAPIModule> {
|
|
|
37
40
|
|
|
38
41
|
jni::global_ref<AudioAPIModule::javaobject> javaPart_;
|
|
39
42
|
jsi::Runtime *jsiRuntime_;
|
|
43
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
44
|
+
std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy_;
|
|
45
|
+
#endif
|
|
40
46
|
std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;
|
|
41
47
|
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
42
48
|
|
|
49
|
+
#if RN_AUDIO_API_ENABLE_WORKLETS
|
|
43
50
|
explicit AudioAPIModule(
|
|
44
51
|
jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
|
|
52
|
+
std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy,
|
|
45
53
|
jsi::Runtime *jsiRuntime,
|
|
46
54
|
const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);
|
|
55
|
+
#else
|
|
56
|
+
explicit AudioAPIModule(
|
|
57
|
+
jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,
|
|
58
|
+
jsi::Runtime *jsiRuntime,
|
|
59
|
+
const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);
|
|
60
|
+
#endif
|
|
47
61
|
};
|
|
48
62
|
|
|
49
63
|
} // namespace audioapi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#include <audioapi/android/core/AndroidAudioRecorder.h>
|
|
2
|
-
#include <audioapi/core/Constants.h>
|
|
3
2
|
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
3
|
+
#include <audioapi/core/utils/Constants.h>
|
|
4
4
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
5
5
|
#include <audioapi/utils/AudioArray.h>
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
@@ -25,9 +25,13 @@ AndroidAudioRecorder::AndroidAudioRecorder(
|
|
|
25
25
|
->setDataCallback(this)
|
|
26
26
|
->setSampleRate(static_cast<int>(sampleRate))
|
|
27
27
|
->openStream(mStream_);
|
|
28
|
+
|
|
29
|
+
nativeAudioRecorder_ = jni::make_global(NativeAudioRecorder::create());
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
AndroidAudioRecorder::~AndroidAudioRecorder() {
|
|
33
|
+
nativeAudioRecorder_.release();
|
|
34
|
+
|
|
31
35
|
if (mStream_) {
|
|
32
36
|
mStream_->requestStop();
|
|
33
37
|
mStream_->close();
|
|
@@ -41,6 +45,7 @@ void AndroidAudioRecorder::start() {
|
|
|
41
45
|
}
|
|
42
46
|
|
|
43
47
|
if (mStream_) {
|
|
48
|
+
nativeAudioRecorder_->start();
|
|
44
49
|
mStream_->requestStart();
|
|
45
50
|
}
|
|
46
51
|
|
|
@@ -55,6 +60,7 @@ void AndroidAudioRecorder::stop() {
|
|
|
55
60
|
isRunning_.store(false);
|
|
56
61
|
|
|
57
62
|
if (mStream_) {
|
|
63
|
+
nativeAudioRecorder_->stop();
|
|
58
64
|
mStream_->requestStop();
|
|
59
65
|
}
|
|
60
66
|
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
#include <functional>
|
|
7
7
|
#include <memory>
|
|
8
8
|
|
|
9
|
+
#include <audioapi/android/core/NativeAudioRecorder.hpp>
|
|
10
|
+
|
|
9
11
|
namespace audioapi {
|
|
10
12
|
|
|
11
13
|
using namespace oboe;
|
|
@@ -16,7 +18,8 @@ class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorde
|
|
|
16
18
|
public:
|
|
17
19
|
AndroidAudioRecorder(float sampleRate,
|
|
18
20
|
int bufferLength,
|
|
19
|
-
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry
|
|
21
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry
|
|
22
|
+
);
|
|
20
23
|
|
|
21
24
|
~AndroidAudioRecorder() override;
|
|
22
25
|
|
|
@@ -30,6 +33,8 @@ class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorde
|
|
|
30
33
|
|
|
31
34
|
private:
|
|
32
35
|
std::shared_ptr<AudioStream> mStream_;
|
|
36
|
+
|
|
37
|
+
facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
|
|
33
38
|
};
|
|
34
39
|
|
|
35
40
|
} // namespace audioapi
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#include <android/log.h>
|
|
2
2
|
#include <audioapi/android/core/AudioPlayer.h>
|
|
3
3
|
#include <audioapi/core/AudioContext.h>
|
|
4
|
-
#include <audioapi/core/Constants.h>
|
|
4
|
+
#include <audioapi/core/utils/Constants.h>
|
|
5
5
|
#include <audioapi/utils/AudioArray.h>
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
7
7
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
#include <fbjni/fbjni.h>
|
|
5
|
+
#include <react/jni/CxxModuleWrapper.h>
|
|
6
|
+
#include <react/jni/JMessageQueueThread.h>
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <utility>
|
|
9
|
+
#include <unordered_map>
|
|
10
|
+
|
|
11
|
+
namespace audioapi {
|
|
12
|
+
|
|
13
|
+
using namespace facebook;
|
|
14
|
+
using namespace react;
|
|
15
|
+
|
|
16
|
+
class NativeAudioRecorder : public jni::JavaClass<NativeAudioRecorder> {
|
|
17
|
+
public:
|
|
18
|
+
static auto constexpr kJavaDescriptor =
|
|
19
|
+
"Lcom/swmansion/audioapi/core/NativeAudioRecorder;";
|
|
20
|
+
|
|
21
|
+
static jni::local_ref<NativeAudioRecorder> create() {
|
|
22
|
+
return newInstance();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void start() {
|
|
26
|
+
static const auto method = javaClassStatic()->getMethod<void()>("start");
|
|
27
|
+
method(self());
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void stop() {
|
|
31
|
+
static const auto method = javaClassStatic()->getMethod<void()>("stop");
|
|
32
|
+
method(self());
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
} // namespace audioapi
|