react-native-audio-api 0.11.0-alpha.0 → 0.11.0-alpha.10
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 +13 -11
- package/RNAudioAPI.podspec +25 -18
- package/android/build.gradle +41 -5
- package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
- package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +353 -74
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +32 -19
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +15 -15
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +170 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +46 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +46 -58
- package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
- package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
- package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +366 -304
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +49 -91
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +56 -0
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +114 -0
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +154 -95
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +10 -16
- package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +2 -1
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +189 -14
- package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioPlayer.kt +10 -8
- package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +10 -8
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -2
- package/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt +128 -0
- package/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt +116 -0
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +115 -107
- package/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt +2 -1
- package/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt +47 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt +191 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +669 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +33 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt +303 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +45 -0
- package/android/src/main/java/com/swmansion/audioapi/system/notification/SimpleNotification.kt +119 -0
- package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
- package/android/src/oldarch/NativeAudioAPIModuleSpec.java +100 -76
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
- package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
- package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
- package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
- package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
- package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
- package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
- package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
- package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
- package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
- package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +109 -44
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -2
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
- package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
- package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
- package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
- package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
- package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
- package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
- package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
- package/common/cpp/audioapi/core/AudioContext.h +6 -3
- package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
- package/common/cpp/audioapi/core/AudioNode.h +19 -8
- package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
- package/common/cpp/audioapi/core/AudioParam.h +20 -12
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
- package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
- package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
- package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
- package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
- package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
- package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +96 -74
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +44 -15
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
- package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
- package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
- package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
- package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
- package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
- package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
- package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
- package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
- package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
- package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
- package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
- package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
- package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +39 -108
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +47 -46
- package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
- package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
- package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
- package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
- package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
- package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
- package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +105 -87
- package/common/cpp/audioapi/core/sources/StreamerNode.h +67 -33
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
- package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
- package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
- package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
- package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
- package/common/cpp/audioapi/core/utils/AudioFileWriter.h +44 -0
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
- package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
- package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
- package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
- package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +52 -0
- package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
- package/common/cpp/audioapi/core/utils/Constants.h +7 -3
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
- package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
- package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
- package/common/cpp/audioapi/dsp/Convolver.h +47 -0
- package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
- package/common/cpp/audioapi/dsp/FFT.h +19 -3
- package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
- package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
- package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
- package/common/cpp/audioapi/dsp/Windows.h +24 -23
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
- package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
- package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
- package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
- package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
- package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
- package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
- package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
- package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
- package/common/cpp/audioapi/utils/AlignedAllocator.hpp +53 -0
- package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
- package/common/cpp/audioapi/utils/AudioArray.h +3 -11
- package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
- package/common/cpp/audioapi/utils/AudioBus.h +17 -14
- package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
- package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
- package/common/cpp/audioapi/utils/Benchmark.hpp +50 -47
- package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
- package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
- package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +12 -9
- package/common/cpp/audioapi/utils/MoveOnlyFunction.hpp +17 -15
- package/common/cpp/audioapi/utils/Result.hpp +323 -0
- package/common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp +22 -28
- package/common/cpp/audioapi/utils/SpscChannel.hpp +329 -305
- package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -20
- package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
- package/common/cpp/test/CMakeLists.txt +15 -15
- package/common/cpp/test/src/AudioParamTest.cpp +4 -3
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
- package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
- package/common/cpp/test/src/DelayTest.cpp +108 -0
- package/common/cpp/test/src/GainTest.cpp +4 -5
- package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
- package/common/cpp/test/src/OscillatorTest.cpp +2 -1
- package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
- package/ios/audioapi/ios/AudioAPIModule.h +4 -3
- package/ios/audioapi/ios/AudioAPIModule.mm +148 -34
- package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
- package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +28 -11
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +280 -45
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +74 -6
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -4
- package/ios/audioapi/ios/core/utils/FileOptions.h +33 -0
- package/ios/audioapi/ios/core/utils/FileOptions.mm +195 -0
- package/ios/audioapi/ios/core/utils/IOSFileWriter.h +53 -0
- package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +185 -0
- package/ios/audioapi/ios/system/AudioEngine.h +21 -16
- package/ios/audioapi/ios/system/AudioEngine.mm +153 -132
- package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
- package/ios/audioapi/ios/system/AudioSessionManager.mm +277 -203
- package/ios/audioapi/ios/system/NotificationManager.mm +47 -53
- package/ios/audioapi/ios/system/notification/BaseNotification.h +58 -0
- package/ios/audioapi/ios/system/notification/NotificationRegistry.h +70 -0
- package/ios/audioapi/ios/system/notification/NotificationRegistry.mm +172 -0
- package/ios/audioapi/ios/system/notification/PlaybackNotification.h +27 -0
- package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +427 -0
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
- package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
- package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
- package/lib/commonjs/AudioAPIModule/index.js +14 -0
- package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
- package/lib/commonjs/api.js +89 -12
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +35 -14
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
- package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +5 -8
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/AudioNode.js +1 -1
- package/lib/commonjs/core/AudioNode.js.map +1 -1
- package/lib/commonjs/core/AudioParam.js +18 -11
- package/lib/commonjs/core/AudioParam.js.map +1 -1
- package/lib/commonjs/core/AudioRecorder.js +56 -55
- package/lib/commonjs/core/AudioRecorder.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +61 -30
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/ConvolverNode.js +37 -0
- package/lib/commonjs/core/ConvolverNode.js.map +1 -0
- package/lib/commonjs/core/DelayNode.js +17 -0
- package/lib/commonjs/core/DelayNode.js.map +1 -0
- package/lib/commonjs/core/IIRFilterNode.js +19 -0
- package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
- package/lib/commonjs/core/OfflineAudioContext.js +3 -6
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/plugin/withAudioAPI.js +46 -0
- package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +9 -15
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/system/index.js +13 -0
- package/lib/commonjs/system/index.js.map +1 -1
- package/lib/commonjs/system/notification/PlaybackNotificationManager.js +138 -0
- package/lib/commonjs/system/notification/PlaybackNotificationManager.js.map +1 -0
- package/lib/commonjs/system/notification/RecordingNotificationManager.js +185 -0
- package/lib/commonjs/system/notification/RecordingNotificationManager.js.map +1 -0
- package/lib/commonjs/system/notification/SimpleNotificationManager.js +125 -0
- package/lib/commonjs/system/notification/SimpleNotificationManager.js.map +1 -0
- package/lib/commonjs/system/notification/index.js +45 -0
- package/lib/commonjs/system/notification/index.js.map +1 -0
- package/lib/commonjs/system/notification/types.js +6 -0
- package/lib/commonjs/system/notification/types.js.map +1 -0
- package/lib/commonjs/types.js +28 -35
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/filePresets.js +43 -0
- package/lib/commonjs/utils/filePresets.js.map +1 -0
- package/lib/commonjs/utils/index.js +12 -27
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +21 -1
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/ConvolverNode.js +40 -0
- package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
- package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
- package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
- package/lib/commonjs/web-core/DelayNode.js +17 -0
- package/lib/commonjs/web-core/DelayNode.js.map +1 -0
- package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
- package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/web-system/index.js +17 -0
- package/lib/commonjs/web-system/index.js.map +1 -0
- package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js +37 -0
- package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js.map +1 -0
- package/lib/commonjs/web-system/notification/RecordingNotificationManager.js +37 -0
- package/lib/commonjs/web-system/notification/RecordingNotificationManager.js.map +1 -0
- package/lib/commonjs/web-system/notification/index.js +21 -0
- package/lib/commonjs/web-system/notification/index.js.map +1 -0
- package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
- package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
- package/lib/module/AudioAPIModule/globals.d.js +4 -0
- package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
- package/lib/module/AudioAPIModule/index.js +4 -0
- package/lib/module/AudioAPIModule/index.js.map +1 -0
- package/lib/module/api.js +7 -12
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +4 -1
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
- package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
- package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
- package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
- package/lib/module/core/AudioContext.js +5 -8
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioNode.js +1 -1
- package/lib/module/core/AudioNode.js.map +1 -1
- package/lib/module/core/AudioParam.js +18 -11
- package/lib/module/core/AudioParam.js.map +1 -1
- package/lib/module/core/AudioRecorder.js +57 -56
- package/lib/module/core/AudioRecorder.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +63 -32
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/ConvolverNode.js +31 -0
- package/lib/module/core/ConvolverNode.js.map +1 -0
- package/lib/module/core/DelayNode.js +11 -0
- package/lib/module/core/DelayNode.js.map +1 -0
- package/lib/module/core/IIRFilterNode.js +13 -0
- package/lib/module/core/IIRFilterNode.js.map +1 -0
- package/lib/module/core/OfflineAudioContext.js +3 -6
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/plugin/withAudioAPI.js +47 -1
- package/lib/module/plugin/withAudioAPI.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +9 -15
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/system/index.js +1 -0
- package/lib/module/system/index.js.map +1 -1
- package/lib/module/system/notification/PlaybackNotificationManager.js +134 -0
- package/lib/module/system/notification/PlaybackNotificationManager.js.map +1 -0
- package/lib/module/system/notification/RecordingNotificationManager.js +181 -0
- package/lib/module/system/notification/RecordingNotificationManager.js.map +1 -0
- package/lib/module/system/notification/SimpleNotificationManager.js +121 -0
- package/lib/module/system/notification/SimpleNotificationManager.js.map +1 -0
- package/lib/module/system/notification/index.js +7 -0
- package/lib/module/system/notification/index.js.map +1 -0
- package/lib/module/system/notification/types.js +4 -0
- package/lib/module/system/notification/types.js.map +1 -0
- package/lib/module/types.js +27 -34
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/filePresets.js +39 -0
- package/lib/module/utils/filePresets.js.map +1 -0
- package/lib/module/utils/index.js +10 -10
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +21 -1
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/ConvolverNode.js +34 -0
- package/lib/module/web-core/ConvolverNode.js.map +1 -0
- package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
- package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
- package/lib/module/web-core/DelayNode.js +11 -0
- package/lib/module/web-core/DelayNode.js.map +1 -0
- package/lib/module/web-core/IIRFilterNode.js +13 -0
- package/lib/module/web-core/IIRFilterNode.js.map +1 -0
- package/lib/module/web-core/OfflineAudioContext.js +20 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/web-system/index.js +4 -0
- package/lib/module/web-system/index.js.map +1 -0
- package/lib/module/web-system/notification/PlaybackNotificationManager.js +33 -0
- package/lib/module/web-system/notification/PlaybackNotificationManager.js.map +1 -0
- package/lib/module/web-system/notification/RecordingNotificationManager.js +33 -0
- package/lib/module/web-system/notification/RecordingNotificationManager.js.map +1 -0
- package/lib/module/web-system/notification/index.js +5 -0
- package/lib/module/web-system/notification/index.js.map +1 -0
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
- package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
- package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
- package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
- package/lib/typescript/api.d.ts +5 -9
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +4 -1
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
- 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/AudioContext.d.ts +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioNode.d.ts +2 -1
- package/lib/typescript/core/AudioNode.d.ts.map +1 -1
- package/lib/typescript/core/AudioParam.d.ts.map +1 -1
- package/lib/typescript/core/AudioRecorder.d.ts +16 -6
- package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/ConvolverNode.d.ts +12 -0
- package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
- package/lib/typescript/core/DelayNode.d.ts +9 -0
- package/lib/typescript/core/DelayNode.d.ts.map +1 -0
- package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
- package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
- package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
- package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/events/types.d.ts +6 -2
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +36 -34
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
- package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +18 -6
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +5 -5
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/system/index.d.ts +1 -0
- package/lib/typescript/system/index.d.ts.map +1 -1
- package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts +23 -0
- package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts.map +1 -0
- package/lib/typescript/system/notification/RecordingNotificationManager.d.ts +24 -0
- package/lib/typescript/system/notification/RecordingNotificationManager.d.ts.map +1 -0
- package/lib/typescript/system/notification/SimpleNotificationManager.d.ts +21 -0
- package/lib/typescript/system/notification/SimpleNotificationManager.d.ts.map +1 -0
- package/lib/typescript/system/notification/index.d.ts +5 -0
- package/lib/typescript/system/notification/index.d.ts.map +1 -0
- package/lib/typescript/system/notification/types.d.ts +65 -0
- package/lib/typescript/system/notification/types.d.ts.map +1 -0
- package/lib/typescript/system/types.d.ts +0 -16
- package/lib/typescript/system/types.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +58 -45
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/filePresets.d.ts +9 -0
- package/lib/typescript/utils/filePresets.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +1 -8
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +9 -2
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
- package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
- package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
- package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
- package/lib/typescript/web-core/DelayNode.d.ts +8 -0
- package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
- package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
- package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-system/index.d.ts +2 -0
- package/lib/typescript/web-system/index.d.ts.map +1 -0
- package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts +20 -0
- package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts.map +1 -0
- package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts +20 -0
- package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts.map +1 -0
- package/lib/typescript/web-system/notification/index.d.ts +3 -0
- package/lib/typescript/web-system/notification/index.d.ts.map +1 -0
- package/package.json +11 -5
- package/scripts/download-prebuilt-binaries.sh +61 -0
- package/scripts/rnaa_utils.rb +8 -0
- package/scripts/validate-worklets-version.js +27 -0
- package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
- package/src/AudioAPIModule/globals.d.ts +33 -0
- package/src/AudioAPIModule/index.ts +1 -0
- package/src/api.ts +21 -52
- package/src/api.web.ts +8 -2
- package/src/core/AudioBufferBaseSourceNode.ts +8 -0
- package/src/core/AudioBufferQueueSourceNode.ts +8 -2
- package/src/core/AudioContext.ts +5 -8
- package/src/core/AudioNode.ts +4 -3
- package/src/core/AudioParam.ts +18 -11
- package/src/core/AudioRecorder.ts +86 -84
- package/src/core/BaseAudioContext.ts +120 -54
- package/src/core/ConvolverNode.ts +35 -0
- package/src/core/DelayNode.ts +13 -0
- package/src/core/IIRFilterNode.ts +25 -0
- package/src/core/OfflineAudioContext.ts +4 -7
- package/src/events/types.ts +7 -3
- package/src/interfaces.ts +55 -34
- package/src/plugin/withAudioAPI.ts +61 -0
- package/src/specs/NativeAudioAPIModule.ts +26 -9
- package/src/system/AudioManager.ts +13 -32
- package/src/system/index.ts +1 -0
- package/src/system/notification/PlaybackNotificationManager.ts +197 -0
- package/src/system/notification/RecordingNotificationManager.ts +247 -0
- package/src/system/notification/SimpleNotificationManager.ts +175 -0
- package/src/system/notification/index.ts +4 -0
- package/src/system/notification/types.ts +111 -0
- package/src/system/types.ts +0 -18
- package/src/types.ts +61 -46
- package/src/utils/filePresets.ts +47 -0
- package/src/utils/index.ts +13 -19
- package/src/web-core/AudioContext.tsx +40 -1
- package/src/web-core/BaseAudioContext.tsx +11 -1
- package/src/web-core/ConvolverNode.tsx +43 -0
- package/src/web-core/ConvolverNodeOptions.tsx +6 -0
- package/src/web-core/DelayNode.tsx +12 -0
- package/src/web-core/IIRFilterNode.tsx +25 -0
- package/src/web-core/OfflineAudioContext.tsx +39 -0
- package/src/web-system/index.ts +1 -0
- package/src/web-system/notification/PlaybackNotificationManager.ts +64 -0
- package/src/web-system/notification/RecordingNotificationManager.ts +64 -0
- package/src/web-system/notification/index.ts +2 -0
- package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
- package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +0 -325
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +0 -262
- package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +0 -57
- package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -61
- package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
- package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
- package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
- package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
- package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
- package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
- package/ios/audioapi/ios/system/LockScreenManager.h +0 -24
- package/ios/audioapi/ios/system/LockScreenManager.mm +0 -310
- package/lib/commonjs/utils/bitEnums.js +0 -33
- package/lib/commonjs/utils/bitEnums.js.map +0 -1
- package/lib/module/utils/bitEnums.js +0 -27
- package/lib/module/utils/bitEnums.js.map +0 -1
- package/lib/typescript/utils/bitEnums.d.ts +0 -4
- package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
- package/metro-config/index.d.ts +0 -5
- package/metro-config/index.js +0 -41
- package/metro-config/tsconfig.json +0 -3
- package/src/utils/bitEnums.ts +0 -51
- package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
- package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
- package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
- package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
- /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
- /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
|
@@ -1,40 +1,61 @@
|
|
|
1
1
|
#include <android/log.h>
|
|
2
2
|
#include <audioapi/android/core/AndroidAudioRecorder.h>
|
|
3
3
|
#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
|
|
4
|
+
#include <audioapi/android/core/utils/AndroidRecorderCallback.h>
|
|
5
|
+
|
|
6
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
4
7
|
#include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>
|
|
8
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
9
|
+
|
|
5
10
|
#include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
|
|
6
11
|
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
7
12
|
#include <audioapi/core/utils/Constants.h>
|
|
13
|
+
#include <audioapi/core/utils/Locker.h>
|
|
8
14
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
9
15
|
#include <audioapi/utils/AudioArray.h>
|
|
10
16
|
#include <audioapi/utils/AudioBus.h>
|
|
17
|
+
#include <audioapi/utils/AudioFileProperties.h>
|
|
11
18
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
12
19
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
13
20
|
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <string>
|
|
23
|
+
|
|
14
24
|
namespace audioapi {
|
|
15
25
|
|
|
16
26
|
AndroidAudioRecorder::AndroidAudioRecorder(
|
|
17
27
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
18
|
-
: AudioRecorder(audioEventHandlerRegistry)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
->setDirection(Direction::Input)
|
|
23
|
-
->setFormat(AudioFormat::Float)
|
|
24
|
-
->setFormatConversionAllowed(true)
|
|
25
|
-
->setPerformanceMode(PerformanceMode::None)
|
|
26
|
-
->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
|
|
27
|
-
->setDataCallback(this)
|
|
28
|
-
->openStream(mStream_);
|
|
29
|
-
|
|
30
|
-
streamSampleRate_ = mStream_->getSampleRate();
|
|
31
|
-
streamChannelCount_ = mStream_->getChannelCount();
|
|
32
|
-
streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
|
|
33
|
-
|
|
28
|
+
: AudioRecorder(audioEventHandlerRegistry),
|
|
29
|
+
streamSampleRate_(0.0),
|
|
30
|
+
streamChannelCount_(0),
|
|
31
|
+
streamMaxBufferSizeInFrames_(0) {
|
|
34
32
|
nativeAudioRecorder_ = jni::make_global(NativeAudioRecorder::create());
|
|
35
33
|
}
|
|
36
34
|
|
|
35
|
+
/// @brief Destructor ensures that the audio stream and each output type are closed and flushed up remaining data.
|
|
36
|
+
/// TODO: Possibly locks here are not necessary, but we might have an issue with oboe having raw pointer to the
|
|
37
|
+
/// recorder (and player) instances, thus creating race conditions during destruction.
|
|
38
|
+
/// callable from the JS thread only (i hope).
|
|
37
39
|
AndroidAudioRecorder::~AndroidAudioRecorder() {
|
|
40
|
+
{
|
|
41
|
+
std::scoped_lock dtorLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
|
|
42
|
+
|
|
43
|
+
if (usesFileOutput()) {
|
|
44
|
+
fileOutputEnabled_.store(false, std::memory_order_release);
|
|
45
|
+
fileWriter_->closeFile();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (usesCallback()) {
|
|
49
|
+
callbackOutputEnabled_.store(false, std::memory_order_release);
|
|
50
|
+
dataCallback_->cleanup();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (isConnected()) {
|
|
54
|
+
isConnected_.store(false, std::memory_order_release);
|
|
55
|
+
adapterNode_->cleanup();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
38
59
|
nativeAudioRecorder_.release();
|
|
39
60
|
|
|
40
61
|
if (mStream_) {
|
|
@@ -44,114 +65,372 @@ AndroidAudioRecorder::~AndroidAudioRecorder() {
|
|
|
44
65
|
}
|
|
45
66
|
}
|
|
46
67
|
|
|
47
|
-
|
|
68
|
+
/// @brief Creates and opens the Oboe audio input stream for recording.
|
|
69
|
+
/// calculates the "native" or hardware stream parameters for other interfaces
|
|
70
|
+
/// to use.
|
|
71
|
+
/// Callable from the JS thread only.
|
|
72
|
+
/// @returns Success status or Error status with message.
|
|
73
|
+
Result<NoneType, std::string> AndroidAudioRecorder::openAudioStream() {
|
|
74
|
+
if (mStream_) {
|
|
75
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
oboe::AudioStreamBuilder builder;
|
|
79
|
+
builder.setSharingMode(oboe::SharingMode::Exclusive)
|
|
80
|
+
->setDirection(oboe::Direction::Input)
|
|
81
|
+
->setFormat(oboe::AudioFormat::Float)
|
|
82
|
+
->setFormatConversionAllowed(true)
|
|
83
|
+
->setPerformanceMode(oboe::PerformanceMode::None)
|
|
84
|
+
->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)
|
|
85
|
+
->setDataCallback(this)
|
|
86
|
+
->setErrorCallback(this);
|
|
87
|
+
|
|
88
|
+
auto result = builder.openStream(mStream_);
|
|
89
|
+
|
|
90
|
+
if (result != oboe::Result::OK || mStream_ == nullptr) {
|
|
91
|
+
return Result<NoneType, std::string>::Err(
|
|
92
|
+
"Failed to open audio stream: " + std::string(oboe::convertToText(result)));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
streamSampleRate_ = static_cast<float>(mStream_->getSampleRate());
|
|
96
|
+
streamChannelCount_ = mStream_->getChannelCount();
|
|
97
|
+
streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
|
|
98
|
+
|
|
99
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// @brief prepares and starts the audio recording process.
|
|
103
|
+
/// If audio stream is opened correctly, it will set up any output configured
|
|
104
|
+
/// (file writing, callback, adapter node) and start the stream.
|
|
105
|
+
/// This method should be called from the JS thread only.
|
|
106
|
+
/// NOTE: I've noticed some possibly invalid file paths being returned on Android,
|
|
107
|
+
/// RN side requires their "file://" prefix, but sometimes it returned raw path.
|
|
108
|
+
/// Most likely this was due to alpha version mistakes, but in case of problems leaving this here. (ㆆ _ ㆆ)
|
|
109
|
+
/// @returns On success, returns the file URI where the recording is being saved (if file output is enabled).
|
|
110
|
+
Result<std::string, std::string> AndroidAudioRecorder::start() {
|
|
111
|
+
std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
|
|
112
|
+
|
|
48
113
|
if (isRecording()) {
|
|
49
|
-
return;
|
|
114
|
+
return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
auto streamResult = openAudioStream();
|
|
118
|
+
|
|
119
|
+
if (!streamResult.is_ok()) {
|
|
120
|
+
return Result<std::string, std::string>::Err(streamResult.unwrap_err());
|
|
50
121
|
}
|
|
51
122
|
|
|
52
123
|
if (!mStream_ || !nativeAudioRecorder_) {
|
|
53
|
-
|
|
54
|
-
ANDROID_LOG_ERROR,
|
|
55
|
-
"AndroidAudioRecorder",
|
|
56
|
-
"Audio stream is not initialized.\n");
|
|
57
|
-
return;
|
|
124
|
+
return Result<std::string, std::string>::Err("Audio stream is not initialized.");
|
|
58
125
|
}
|
|
59
126
|
|
|
60
127
|
if (usesFileOutput()) {
|
|
61
|
-
|
|
62
|
-
|
|
128
|
+
auto fileResult =
|
|
129
|
+
std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
|
|
130
|
+
->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
131
|
+
|
|
132
|
+
if (!fileResult.is_ok()) {
|
|
133
|
+
return Result<std::string, std::string>::Err(
|
|
134
|
+
"Failed to open file for writing: " + fileResult.unwrap_err());
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
filePath_ = fileResult.unwrap();
|
|
63
138
|
}
|
|
64
139
|
|
|
65
140
|
if (usesCallback()) {
|
|
66
|
-
|
|
141
|
+
std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
|
|
142
|
+
->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
67
143
|
}
|
|
68
144
|
|
|
69
145
|
if (isConnected()) {
|
|
70
|
-
|
|
146
|
+
adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
auto result = mStream_->requestStart();
|
|
150
|
+
|
|
151
|
+
if (result != oboe::Result::OK) {
|
|
152
|
+
return Result<std::string, std::string>::Err(
|
|
153
|
+
"Failed to start stream: " + std::string(oboe::convertToText(result)));
|
|
71
154
|
}
|
|
72
155
|
|
|
73
|
-
nativeAudioRecorder_->start();
|
|
74
|
-
|
|
75
|
-
|
|
156
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->start(); });
|
|
157
|
+
|
|
158
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
159
|
+
return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
|
|
76
160
|
}
|
|
77
161
|
|
|
78
|
-
|
|
162
|
+
/// @brief Stops the audio stream and finalizes any output (file writing, callback, adapter node).
|
|
163
|
+
/// This method should be called from the JS thread only.
|
|
164
|
+
/// @returns On success, returns the file URI, size in MB and duration in seconds of the recorded file (if file output is enabled).
|
|
165
|
+
/// NOTE: due to the file access nature on Android, the size might sometimes be zeroed (really long files).
|
|
166
|
+
Result<std::tuple<std::string, double, double>, std::string> AndroidAudioRecorder::stop() {
|
|
167
|
+
std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
|
|
168
|
+
|
|
169
|
+
std::string filePath = std::format("file://{}", filePath_);
|
|
170
|
+
double outputFileSize = 0.0;
|
|
171
|
+
double outputDuration = 0.0;
|
|
172
|
+
|
|
79
173
|
if (!isRecording()) {
|
|
80
|
-
return
|
|
174
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
175
|
+
"Recorder is not in recording state.");
|
|
81
176
|
}
|
|
82
177
|
|
|
83
178
|
if (!mStream_ || !nativeAudioRecorder_) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"AndroidAudioRecorder",
|
|
87
|
-
"Audio stream is not initialized.\n");
|
|
88
|
-
return "";
|
|
179
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
180
|
+
"Audio stream is not initialized.");
|
|
89
181
|
}
|
|
90
182
|
|
|
91
|
-
|
|
183
|
+
state_.store(RecorderState::Idle, std::memory_order_release);
|
|
184
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
|
|
92
185
|
mStream_->requestStop();
|
|
93
|
-
isRunning_.store(false);
|
|
94
|
-
|
|
95
|
-
// TODO: sendRemainingData() ?
|
|
96
186
|
|
|
97
187
|
if (usesFileOutput()) {
|
|
98
|
-
|
|
188
|
+
auto fileResult = fileWriter_->closeFile();
|
|
189
|
+
|
|
190
|
+
if (!fileResult.is_ok()) {
|
|
191
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
192
|
+
"Failed to close file: " + fileResult.unwrap_err());
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
outputFileSize = std::get<0>(fileResult.unwrap());
|
|
196
|
+
outputDuration = std::get<1>(fileResult.unwrap());
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (usesCallback()) {
|
|
200
|
+
dataCallback_->cleanup();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (isConnected()) {
|
|
204
|
+
adapterNode_->cleanup();
|
|
99
205
|
}
|
|
100
206
|
|
|
101
|
-
|
|
207
|
+
filePath_ = "";
|
|
208
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Ok(
|
|
209
|
+
{filePath, outputFileSize, outputDuration});
|
|
102
210
|
}
|
|
103
211
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
212
|
+
/// @brief Enables file output for the recorder with the specified properties.
|
|
213
|
+
/// If the recorder is already active, it will prepare and open the file for writing immediately.
|
|
214
|
+
/// Due to the nature of RN this might be called multiple times during recording session (especially during development),
|
|
215
|
+
/// thus the requirement of handling the "already active" case.
|
|
216
|
+
/// This method should be called from the JS thread only.
|
|
217
|
+
/// @param properties Properties defining the audio file format and encoding options.
|
|
218
|
+
/// @returns On success, returns the file URI where the recording is being saved, otherwise returns an error message.
|
|
219
|
+
Result<std::string, std::string> AndroidAudioRecorder::enableFileOutput(
|
|
220
|
+
std::shared_ptr<AudioFileProperties> properties) {
|
|
221
|
+
std::scoped_lock fileWriterLock(fileWriterMutex_);
|
|
222
|
+
|
|
223
|
+
if (properties->format == AudioFileProperties::Format::WAV) {
|
|
224
|
+
fileWriter_ = std::make_shared<MiniAudioFileWriter>(audioEventHandlerRegistry_, properties);
|
|
115
225
|
} else {
|
|
116
|
-
|
|
117
|
-
|
|
226
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
227
|
+
fileWriter_ = std::make_shared<android::ffmpeg::FFmpegAudioFileWriter>(
|
|
228
|
+
audioEventHandlerRegistry_, properties);
|
|
229
|
+
#else
|
|
230
|
+
return Result<std::string, std::string>::Err(
|
|
231
|
+
"FFmpeg backend is disabled. Cannot create file writer for the requested format. Use WAV format instead.");
|
|
232
|
+
#endif
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!isIdle()) {
|
|
236
|
+
auto fileResult =
|
|
237
|
+
std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
|
|
238
|
+
->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
239
|
+
|
|
240
|
+
if (!fileResult.is_ok()) {
|
|
241
|
+
return Result<std::string, std::string>::Err(
|
|
242
|
+
"Failed to open file for writing: " + fileResult.unwrap_err());
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
filePath_ = fileResult.unwrap();
|
|
118
246
|
}
|
|
119
247
|
|
|
120
|
-
fileOutputEnabled_.store(true);
|
|
248
|
+
fileOutputEnabled_.store(true, std::memory_order_release);
|
|
249
|
+
return Result<std::string, std::string>::Ok(filePath_);
|
|
121
250
|
}
|
|
122
251
|
|
|
252
|
+
/// @brief Disables file output for the recorder.
|
|
253
|
+
/// If the recorder is currently active, it will finalize and close the file immediately.
|
|
254
|
+
/// This method should be called from the JS thread only.
|
|
123
255
|
void AndroidAudioRecorder::disableFileOutput() {
|
|
124
|
-
|
|
256
|
+
std::scoped_lock fileWriterLock(fileWriterMutex_);
|
|
257
|
+
fileOutputEnabled_.store(false, std::memory_order_release);
|
|
125
258
|
fileWriter_ = nullptr;
|
|
126
259
|
}
|
|
127
260
|
|
|
128
|
-
|
|
261
|
+
/// @brief Pauses the audio recording stream.
|
|
262
|
+
/// For session without active file output, this method acts same as stop().
|
|
263
|
+
/// This method should be called from the JS thread only.
|
|
264
|
+
void AndroidAudioRecorder::pause() {
|
|
265
|
+
if (!isRecording()) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
mStream_->pause(0);
|
|
270
|
+
state_.store(RecorderState::Paused, std::memory_order_release);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/// @brief Resumes the audio recording stream if it was previously paused.
|
|
274
|
+
/// This method should be called from the JS thread only.
|
|
275
|
+
void AndroidAudioRecorder::resume() {
|
|
276
|
+
if (!isPaused()) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
mStream_->start(0);
|
|
281
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/// @brief Sets the callback to be invoked when audio data is ready.
|
|
285
|
+
/// If the recorder is already active, it will prepare the callback for receiving audio data immediately.
|
|
286
|
+
/// This method should be called from the JS thread only.
|
|
287
|
+
/// @param sampleRate Desired sample rate for the callback audio data.
|
|
288
|
+
/// @param bufferLength Desired buffer length in frames for the callback audio data.
|
|
289
|
+
/// @param channelCount Number of channels for the callback audio data.
|
|
290
|
+
/// @param callbackId Identifier for the JS callback to be invoked.
|
|
291
|
+
/// @returns Success status or Error status with message.
|
|
292
|
+
Result<NoneType, std::string> AndroidAudioRecorder::setOnAudioReadyCallback(
|
|
293
|
+
float sampleRate,
|
|
294
|
+
size_t bufferLength,
|
|
295
|
+
int channelCount,
|
|
296
|
+
uint64_t callbackId) {
|
|
297
|
+
std::scoped_lock callbackLock(callbackMutex_);
|
|
298
|
+
dataCallback_ = std::make_shared<AndroidRecorderCallback>(
|
|
299
|
+
audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
|
|
300
|
+
|
|
301
|
+
if (!isIdle()) {
|
|
302
|
+
std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
|
|
303
|
+
->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
callbackOutputEnabled_.store(true, std::memory_order_release);
|
|
129
307
|
|
|
130
|
-
|
|
308
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// @brief Clears the audio data callback.
|
|
312
|
+
/// If the recorder is currently active, it will stop invoking the callback immediately.
|
|
313
|
+
/// This method should be called from the JS thread only.
|
|
314
|
+
void AndroidAudioRecorder::clearOnAudioReadyCallback() {
|
|
315
|
+
std::scoped_lock callbackLock(callbackMutex_);
|
|
316
|
+
callbackOutputEnabled_.store(false, std::memory_order_release);
|
|
317
|
+
dataCallback_ = nullptr;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/// @brief Connects a RecorderAdapterNode to the recorder for audio data routing.
|
|
321
|
+
/// If the recorder is already active, it will initialize the adapter node immediately.
|
|
322
|
+
/// This method should be called from the JS thread only.
|
|
323
|
+
/// @param node Shared pointer to the RecorderAdapterNode to connect.
|
|
324
|
+
void AndroidAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node) {
|
|
325
|
+
std::scoped_lock adapterLock(adapterNodeMutex_);
|
|
326
|
+
adapterNode_ = node;
|
|
327
|
+
deinterleavingBuffer_ = std::make_shared<AudioArray>(streamMaxBufferSizeInFrames_);
|
|
328
|
+
|
|
329
|
+
if (!isIdle()) {
|
|
330
|
+
adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
isConnected_.store(true, std::memory_order_release);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/// @brief Disconnects the currently connected RecorderAdapterNode from the recorder.
|
|
337
|
+
/// If the recorder is currently active, it will stop routing audio data immediately.
|
|
338
|
+
/// This method should be called from the JS thread only.
|
|
339
|
+
void AndroidAudioRecorder::disconnect() {
|
|
340
|
+
std::scoped_lock adapterLock(adapterNodeMutex_);
|
|
341
|
+
isConnected_.store(false, std::memory_order_release);
|
|
342
|
+
deinterleavingBuffer_ = nullptr;
|
|
343
|
+
adapterNode_ = nullptr;
|
|
344
|
+
}
|
|
131
345
|
|
|
132
|
-
|
|
346
|
+
/// @brief onAudioReady callback that is invoked by the Oboe stream when new audio data is available.
|
|
347
|
+
/// This method runs on the audio thread.
|
|
348
|
+
/// It routes the audio data to the enabled outputs: file writer, callback, and adapter node.
|
|
349
|
+
/// For safety measures (check note about RN of enableFileOutput), each output is protected by a lock
|
|
350
|
+
/// additionally to the enabled checks.
|
|
351
|
+
/// @param oboeStream Pointer to the Oboe audio stream.
|
|
352
|
+
/// @param audioData Pointer to the audio data buffer (interleaved float samples).
|
|
353
|
+
/// @param numFrames Number of audio frames in the data buffer.
|
|
354
|
+
/// @returns DataCallbackResult indicating whether to continue or stop the stream.
|
|
355
|
+
oboe::DataCallbackResult AndroidAudioRecorder::onAudioReady(
|
|
133
356
|
oboe::AudioStream *oboeStream,
|
|
134
357
|
void *audioData,
|
|
135
358
|
int32_t numFrames) {
|
|
359
|
+
if (isPaused()) {
|
|
360
|
+
return oboe::DataCallbackResult::Continue;
|
|
361
|
+
}
|
|
362
|
+
|
|
136
363
|
if (usesFileOutput()) {
|
|
137
|
-
|
|
364
|
+
if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {
|
|
365
|
+
std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
|
|
366
|
+
->writeAudioData(audioData, numFrames);
|
|
367
|
+
}
|
|
138
368
|
}
|
|
139
369
|
|
|
140
|
-
|
|
370
|
+
if (usesCallback()) {
|
|
371
|
+
if (auto callbackLock = Locker::tryLock(callbackMutex_)) {
|
|
372
|
+
std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
|
|
373
|
+
->receiveAudioData(audioData, numFrames);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (isConnected()) {
|
|
378
|
+
if (auto adapterLock = Locker::tryLock(adapterNodeMutex_)) {
|
|
379
|
+
for (int channel = 0; channel < streamChannelCount_; ++channel) {
|
|
380
|
+
for (int frame = 0; frame < numFrames; ++frame) {
|
|
381
|
+
deinterleavingBuffer_->getData()[frame] =
|
|
382
|
+
static_cast<float *>(audioData)[frame * streamChannelCount_ + channel];
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
adapterNode_->buff_[channel]->write(deinterleavingBuffer_->getData(), numFrames);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return oboe::DataCallbackResult::Continue;
|
|
141
391
|
}
|
|
142
392
|
|
|
143
|
-
|
|
393
|
+
bool AndroidAudioRecorder::isRecording() const {
|
|
394
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
|
|
395
|
+
mStream_->getState() == oboe::StreamState::Started;
|
|
396
|
+
}
|
|
144
397
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
// }
|
|
398
|
+
bool AndroidAudioRecorder::isPaused() const {
|
|
399
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Paused;
|
|
400
|
+
}
|
|
149
401
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
402
|
+
bool AndroidAudioRecorder::isIdle() const {
|
|
403
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Idle;
|
|
404
|
+
}
|
|
153
405
|
|
|
154
|
-
|
|
406
|
+
void AndroidAudioRecorder::cleanup() {
|
|
407
|
+
state_.store(RecorderState::Idle, std::memory_order_release);
|
|
155
408
|
|
|
156
|
-
|
|
157
|
-
|
|
409
|
+
if (mStream_) {
|
|
410
|
+
mStream_->close();
|
|
411
|
+
mStream_.reset();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/// @brief onError callback that is invoked by the Oboe stream when an error occurs.
|
|
416
|
+
/// This method runs on the audio thread.
|
|
417
|
+
/// If the error is a disconnection, it attempts to reopen the stream and resume recording.
|
|
418
|
+
/// @param oboeStream Pointer to the Oboe audio stream.
|
|
419
|
+
/// @param error The oboe::Result error code.
|
|
420
|
+
void AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
|
|
421
|
+
if (error == oboe::Result::ErrorDisconnected) {
|
|
422
|
+
cleanup();
|
|
423
|
+
|
|
424
|
+
auto streamResult = openAudioStream();
|
|
425
|
+
|
|
426
|
+
if (!streamResult.is_ok()) {
|
|
427
|
+
// TODO: call error callback
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
mStream_->requestStart();
|
|
432
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
} // namespace audioapi
|
|
@@ -1,54 +1,67 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <audioapi/core/inputs/AudioRecorder.h>
|
|
4
|
-
|
|
5
4
|
#include <oboe/Oboe.h>
|
|
6
5
|
#include <functional>
|
|
7
6
|
#include <memory>
|
|
8
7
|
#include <string>
|
|
9
|
-
|
|
8
|
+
#include <tuple>
|
|
9
|
+
#include <mutex>
|
|
10
|
+
#include <audioapi/utils/Result.hpp>
|
|
10
11
|
#include <audioapi/android/core/NativeAudioRecorder.hpp>
|
|
11
12
|
|
|
12
13
|
namespace audioapi {
|
|
13
14
|
|
|
14
|
-
using namespace oboe;
|
|
15
|
-
|
|
16
15
|
class AudioBus;
|
|
16
|
+
class AudioArray;
|
|
17
17
|
class CircularAudioArray;
|
|
18
|
+
class AudioFileProperties;
|
|
19
|
+
class AndroidRecorderCallback;
|
|
18
20
|
class AndroidFileWriterBackend;
|
|
19
21
|
class AudioEventHandlerRegistry;
|
|
20
22
|
|
|
21
|
-
class AndroidAudioRecorder : public
|
|
23
|
+
class AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {
|
|
22
24
|
public:
|
|
23
25
|
explicit AndroidAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
24
26
|
~AndroidAudioRecorder() override;
|
|
27
|
+
void cleanup();
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
std::string stop() override;
|
|
29
|
+
Result<std::string, std::string> start() override;
|
|
30
|
+
Result<std::tuple<std::string, double, double>, std::string> stop() override;
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
float sampleRate,
|
|
31
|
-
size_t channelCount,
|
|
32
|
-
size_t bitRate,
|
|
33
|
-
size_t iosFlags,
|
|
34
|
-
size_t androidFlags) override;
|
|
32
|
+
Result<std::string, std::string> enableFileOutput(std::shared_ptr<AudioFileProperties> properties) override;
|
|
35
33
|
void disableFileOutput() override;
|
|
36
34
|
|
|
37
35
|
void pause() override;
|
|
38
36
|
void resume() override;
|
|
37
|
+
bool isRecording() const override;
|
|
38
|
+
bool isPaused() const override;
|
|
39
|
+
bool isIdle() const override;
|
|
40
|
+
|
|
41
|
+
Result<NoneType, std::string> setOnAudioReadyCallback(float sampleRate, size_t bufferLength, int channelCount, uint64_t callbackId)
|
|
42
|
+
override;
|
|
43
|
+
void clearOnAudioReadyCallback() override;
|
|
44
|
+
|
|
45
|
+
void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
|
|
46
|
+
void disconnect() override;
|
|
39
47
|
|
|
40
|
-
DataCallbackResult onAudioReady(
|
|
41
|
-
AudioStream *oboeStream,
|
|
48
|
+
oboe::DataCallbackResult onAudioReady(
|
|
49
|
+
oboe::AudioStream *oboeStream,
|
|
42
50
|
void *audioData,
|
|
43
51
|
int32_t numFrames) override;
|
|
52
|
+
void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;
|
|
44
53
|
|
|
45
54
|
private:
|
|
46
|
-
std::shared_ptr<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
int32_t streamSampleRate_;
|
|
55
|
+
std::shared_ptr<AudioArray> deinterleavingBuffer_;
|
|
56
|
+
|
|
57
|
+
float streamSampleRate_;
|
|
50
58
|
int32_t streamChannelCount_;
|
|
51
59
|
int32_t streamMaxBufferSizeInFrames_;
|
|
60
|
+
|
|
61
|
+
facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
|
|
62
|
+
|
|
63
|
+
std::shared_ptr<oboe::AudioStream> mStream_;
|
|
64
|
+
Result<NoneType, std::string> openAudioStream();
|
|
52
65
|
};
|
|
53
66
|
|
|
54
67
|
} // namespace audioapi
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
#include <audioapi/core/utils/Constants.h>
|
|
5
5
|
#include <audioapi/utils/AudioArray.h>
|
|
6
6
|
#include <audioapi/utils/AudioBus.h>
|
|
7
|
+
#include <jni.h>
|
|
8
|
+
|
|
9
|
+
#include <algorithm>
|
|
10
|
+
#include <memory>
|
|
7
11
|
|
|
8
12
|
namespace audioapi {
|
|
9
13
|
|
|
@@ -11,9 +15,7 @@ AudioPlayer::AudioPlayer(
|
|
|
11
15
|
const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
|
|
12
16
|
float sampleRate,
|
|
13
17
|
int channelCount)
|
|
14
|
-
: renderAudio_(renderAudio),
|
|
15
|
-
sampleRate_(sampleRate),
|
|
16
|
-
channelCount_(channelCount) {
|
|
18
|
+
: renderAudio_(renderAudio), sampleRate_(sampleRate), channelCount_(channelCount) {
|
|
17
19
|
isInitialized_ = openAudioStream();
|
|
18
20
|
|
|
19
21
|
nativeAudioPlayer_ = jni::make_global(NativeAudioPlayer::create());
|
|
@@ -35,21 +37,17 @@ bool AudioPlayer::openAudioStream() {
|
|
|
35
37
|
auto result = builder.openStream(mStream_);
|
|
36
38
|
if (result != oboe::Result::OK || mStream_ == nullptr) {
|
|
37
39
|
__android_log_print(
|
|
38
|
-
ANDROID_LOG_ERROR,
|
|
39
|
-
"AudioPlayer",
|
|
40
|
-
"Failed to open stream: %s",
|
|
41
|
-
oboe::convertToText(result));
|
|
40
|
+
ANDROID_LOG_ERROR, "AudioPlayer", "Failed to open stream: %s", oboe::convertToText(result));
|
|
42
41
|
return false;
|
|
43
42
|
}
|
|
44
43
|
|
|
45
|
-
mBus_ = std::make_shared<AudioBus>(
|
|
46
|
-
RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
|
|
44
|
+
mBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
|
|
47
45
|
return true;
|
|
48
46
|
}
|
|
49
47
|
|
|
50
48
|
bool AudioPlayer::start() {
|
|
51
49
|
if (mStream_) {
|
|
52
|
-
nativeAudioPlayer_->start();
|
|
50
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->start(); });
|
|
53
51
|
auto result = mStream_->requestStart();
|
|
54
52
|
return result == oboe::Result::OK;
|
|
55
53
|
}
|
|
@@ -59,7 +57,7 @@ bool AudioPlayer::start() {
|
|
|
59
57
|
|
|
60
58
|
void AudioPlayer::stop() {
|
|
61
59
|
if (mStream_) {
|
|
62
|
-
nativeAudioPlayer_->stop();
|
|
60
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->stop(); });
|
|
63
61
|
mStream_->requestStop();
|
|
64
62
|
}
|
|
65
63
|
}
|
|
@@ -92,10 +90,8 @@ bool AudioPlayer::isRunning() const {
|
|
|
92
90
|
return mStream_ && mStream_->getState() == oboe::StreamState::Started;
|
|
93
91
|
}
|
|
94
92
|
|
|
95
|
-
DataCallbackResult
|
|
96
|
-
|
|
97
|
-
void *audioData,
|
|
98
|
-
int32_t numFrames) {
|
|
93
|
+
DataCallbackResult
|
|
94
|
+
AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
|
|
99
95
|
if (!isInitialized_) {
|
|
100
96
|
return DataCallbackResult::Continue;
|
|
101
97
|
}
|
|
@@ -106,8 +102,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
|
|
|
106
102
|
assert(buffer != nullptr);
|
|
107
103
|
|
|
108
104
|
while (processedFrames < numFrames) {
|
|
109
|
-
int framesToProcess =
|
|
110
|
-
std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
105
|
+
int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
111
106
|
renderAudio_(mBus_, framesToProcess);
|
|
112
107
|
|
|
113
108
|
// TODO: optimize this with SIMD?
|
|
@@ -124,9 +119,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
|
|
|
124
119
|
return DataCallbackResult::Continue;
|
|
125
120
|
}
|
|
126
121
|
|
|
127
|
-
void AudioPlayer::onErrorAfterClose(
|
|
128
|
-
oboe::AudioStream *stream,
|
|
129
|
-
oboe::Result error) {
|
|
122
|
+
void AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
|
|
130
123
|
if (error == oboe::Result::ErrorDisconnected) {
|
|
131
124
|
cleanup();
|
|
132
125
|
if (openAudioStream()) {
|