react-native-audio-api 0.11.0-alpha.1 → 0.11.0-alpha.11
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 +315 -84
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +23 -23
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
- 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 +363 -299
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -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 +132 -105
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -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 +98 -50
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -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 +66 -36
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +42 -44
- 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 +26 -18
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +244 -54
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +49 -7
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -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/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
- package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
- package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
- 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 +43 -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 +44 -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 +13 -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 +34 -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 +57 -49
- 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 +63 -78
- 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 +51 -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 +59 -50
- 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 -36
- package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
- package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
- package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
- 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
|
@@ -2,39 +2,60 @@
|
|
|
2
2
|
#include <audioapi/android/core/AndroidAudioRecorder.h>
|
|
3
3
|
#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
|
|
4
4
|
#include <audioapi/android/core/utils/AndroidRecorderCallback.h>
|
|
5
|
+
|
|
6
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
5
7
|
#include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>
|
|
8
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
9
|
+
|
|
6
10
|
#include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
|
|
7
11
|
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
8
12
|
#include <audioapi/core/utils/Constants.h>
|
|
13
|
+
#include <audioapi/core/utils/Locker.h>
|
|
9
14
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
10
15
|
#include <audioapi/utils/AudioArray.h>
|
|
11
16
|
#include <audioapi/utils/AudioBus.h>
|
|
17
|
+
#include <audioapi/utils/AudioFileProperties.h>
|
|
12
18
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
13
19
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
14
20
|
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <string>
|
|
23
|
+
|
|
15
24
|
namespace audioapi {
|
|
16
25
|
|
|
17
26
|
AndroidAudioRecorder::AndroidAudioRecorder(
|
|
18
27
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
19
|
-
: AudioRecorder(audioEventHandlerRegistry)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
->setDirection(Direction::Input)
|
|
24
|
-
->setFormat(AudioFormat::Float)
|
|
25
|
-
->setFormatConversionAllowed(true)
|
|
26
|
-
->setPerformanceMode(PerformanceMode::None)
|
|
27
|
-
->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
|
|
28
|
-
->setDataCallback(this)
|
|
29
|
-
->openStream(mStream_);
|
|
30
|
-
|
|
31
|
-
streamSampleRate_ = mStream_->getSampleRate();
|
|
32
|
-
streamChannelCount_ = mStream_->getChannelCount();
|
|
33
|
-
streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
|
|
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,162 +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>::Err("Recorder is already recording");
|
|
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 filePath_;
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
141
|
+
std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
|
|
142
|
+
->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
|
|
69
143
|
}
|
|
70
144
|
|
|
71
145
|
if (isConnected()) {
|
|
72
|
-
|
|
146
|
+
adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
|
|
73
147
|
}
|
|
74
148
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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)));
|
|
154
|
+
}
|
|
78
155
|
|
|
79
|
-
|
|
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_));
|
|
80
160
|
}
|
|
81
161
|
|
|
82
|
-
|
|
83
|
-
|
|
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_);
|
|
84
170
|
double outputFileSize = 0.0;
|
|
85
171
|
double outputDuration = 0.0;
|
|
86
172
|
|
|
87
173
|
if (!isRecording()) {
|
|
88
|
-
return
|
|
174
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
175
|
+
"Recorder is not in recording state.");
|
|
89
176
|
}
|
|
90
177
|
|
|
91
178
|
if (!mStream_ || !nativeAudioRecorder_) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"AndroidAudioRecorder",
|
|
95
|
-
"Audio stream is not initialized.\n");
|
|
96
|
-
return {filePath_, 0.0, 0.0};
|
|
179
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
180
|
+
"Audio stream is not initialized.");
|
|
97
181
|
}
|
|
98
182
|
|
|
99
|
-
|
|
183
|
+
state_.store(RecorderState::Idle, std::memory_order_release);
|
|
184
|
+
jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
|
|
100
185
|
mStream_->requestStop();
|
|
101
|
-
state_.store(RecorderState::Idle);
|
|
102
186
|
|
|
103
187
|
if (usesFileOutput()) {
|
|
104
|
-
auto
|
|
105
|
-
|
|
106
|
-
|
|
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());
|
|
107
197
|
}
|
|
108
198
|
|
|
109
199
|
if (usesCallback()) {
|
|
110
|
-
|
|
200
|
+
dataCallback_->cleanup();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (isConnected()) {
|
|
204
|
+
adapterNode_->cleanup();
|
|
111
205
|
}
|
|
112
206
|
|
|
113
207
|
filePath_ = "";
|
|
114
|
-
return
|
|
208
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Ok(
|
|
209
|
+
{filePath, outputFileSize, outputDuration});
|
|
115
210
|
}
|
|
116
211
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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);
|
|
128
225
|
} else {
|
|
129
|
-
|
|
130
|
-
|
|
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();
|
|
131
246
|
}
|
|
132
247
|
|
|
133
|
-
fileOutputEnabled_.store(true);
|
|
248
|
+
fileOutputEnabled_.store(true, std::memory_order_release);
|
|
249
|
+
return Result<std::string, std::string>::Ok(filePath_);
|
|
134
250
|
}
|
|
135
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.
|
|
136
255
|
void AndroidAudioRecorder::disableFileOutput() {
|
|
137
|
-
|
|
256
|
+
std::scoped_lock fileWriterLock(fileWriterMutex_);
|
|
257
|
+
fileOutputEnabled_.store(false, std::memory_order_release);
|
|
138
258
|
fileWriter_ = nullptr;
|
|
139
259
|
}
|
|
140
260
|
|
|
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.
|
|
141
264
|
void AndroidAudioRecorder::pause() {
|
|
142
265
|
if (!isRecording()) {
|
|
143
266
|
return;
|
|
144
267
|
}
|
|
145
268
|
|
|
146
269
|
mStream_->pause(0);
|
|
147
|
-
state_.store(RecorderState::Paused);
|
|
270
|
+
state_.store(RecorderState::Paused, std::memory_order_release);
|
|
148
271
|
}
|
|
149
272
|
|
|
273
|
+
/// @brief Resumes the audio recording stream if it was previously paused.
|
|
274
|
+
/// This method should be called from the JS thread only.
|
|
150
275
|
void AndroidAudioRecorder::resume() {
|
|
151
276
|
if (!isPaused()) {
|
|
152
277
|
return;
|
|
153
278
|
}
|
|
154
279
|
|
|
155
280
|
mStream_->start(0);
|
|
156
|
-
state_.store(RecorderState::Recording);
|
|
281
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
157
282
|
}
|
|
158
283
|
|
|
159
|
-
|
|
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(
|
|
160
293
|
float sampleRate,
|
|
161
294
|
size_t bufferLength,
|
|
162
|
-
|
|
295
|
+
int channelCount,
|
|
163
296
|
uint64_t callbackId) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
sampleRate,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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);
|
|
307
|
+
|
|
308
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
171
309
|
}
|
|
172
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.
|
|
173
314
|
void AndroidAudioRecorder::clearOnAudioReadyCallback() {
|
|
174
|
-
|
|
175
|
-
|
|
315
|
+
std::scoped_lock callbackLock(callbackMutex_);
|
|
316
|
+
callbackOutputEnabled_.store(false, std::memory_order_release);
|
|
317
|
+
dataCallback_ = nullptr;
|
|
176
318
|
}
|
|
177
319
|
|
|
178
|
-
|
|
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
|
+
}
|
|
345
|
+
|
|
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(
|
|
179
356
|
oboe::AudioStream *oboeStream,
|
|
180
357
|
void *audioData,
|
|
181
358
|
int32_t numFrames) {
|
|
182
359
|
if (isPaused()) {
|
|
183
|
-
return DataCallbackResult::Continue;
|
|
360
|
+
return oboe::DataCallbackResult::Continue;
|
|
184
361
|
}
|
|
185
362
|
|
|
186
363
|
if (usesFileOutput()) {
|
|
187
|
-
|
|
364
|
+
if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {
|
|
365
|
+
std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
|
|
366
|
+
->writeAudioData(audioData, numFrames);
|
|
367
|
+
}
|
|
188
368
|
}
|
|
189
369
|
|
|
190
370
|
if (usesCallback()) {
|
|
191
|
-
|
|
371
|
+
if (auto callbackLock = Locker::tryLock(callbackMutex_)) {
|
|
372
|
+
std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
|
|
373
|
+
->receiveAudioData(audioData, numFrames);
|
|
374
|
+
}
|
|
192
375
|
}
|
|
193
376
|
|
|
194
|
-
|
|
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;
|
|
195
391
|
}
|
|
196
392
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
393
|
+
bool AndroidAudioRecorder::isRecording() const {
|
|
394
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
|
|
395
|
+
mStream_->getState() == oboe::StreamState::Started;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
bool AndroidAudioRecorder::isPaused() const {
|
|
399
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Paused;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
bool AndroidAudioRecorder::isIdle() const {
|
|
403
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Idle;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
void AndroidAudioRecorder::cleanup() {
|
|
407
|
+
state_.store(RecorderState::Idle, std::memory_order_release);
|
|
408
|
+
|
|
409
|
+
if (mStream_) {
|
|
410
|
+
mStream_->close();
|
|
411
|
+
mStream_.reset();
|
|
200
412
|
}
|
|
413
|
+
}
|
|
201
414
|
|
|
202
|
-
|
|
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
|
+
}
|
|
203
434
|
}
|
|
204
435
|
|
|
205
436
|
} // namespace audioapi
|
|
@@ -1,67 +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>
|
|
10
|
-
|
|
9
|
+
#include <mutex>
|
|
10
|
+
#include <audioapi/utils/Result.hpp>
|
|
11
11
|
#include <audioapi/android/core/NativeAudioRecorder.hpp>
|
|
12
12
|
|
|
13
13
|
namespace audioapi {
|
|
14
14
|
|
|
15
|
-
using namespace oboe;
|
|
16
|
-
|
|
17
15
|
class AudioBus;
|
|
16
|
+
class AudioArray;
|
|
18
17
|
class CircularAudioArray;
|
|
18
|
+
class AudioFileProperties;
|
|
19
19
|
class AndroidRecorderCallback;
|
|
20
20
|
class AndroidFileWriterBackend;
|
|
21
21
|
class AudioEventHandlerRegistry;
|
|
22
22
|
|
|
23
|
-
class AndroidAudioRecorder : public
|
|
23
|
+
class AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {
|
|
24
24
|
public:
|
|
25
25
|
explicit AndroidAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
26
26
|
~AndroidAudioRecorder() override;
|
|
27
|
+
void cleanup();
|
|
27
28
|
|
|
28
|
-
std::string start() override;
|
|
29
|
-
std::tuple<std::string, double, double> stop() override;
|
|
29
|
+
Result<std::string, std::string> start() override;
|
|
30
|
+
Result<std::tuple<std::string, double, double>, std::string> stop() override;
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
float sampleRate,
|
|
33
|
-
size_t channelCount,
|
|
34
|
-
size_t bitRate,
|
|
35
|
-
size_t iosFlags,
|
|
36
|
-
size_t androidFlags) override;
|
|
32
|
+
Result<std::string, std::string> enableFileOutput(std::shared_ptr<AudioFileProperties> properties) override;
|
|
37
33
|
void disableFileOutput() override;
|
|
38
34
|
|
|
39
35
|
void pause() override;
|
|
40
36
|
void resume() override;
|
|
37
|
+
bool isRecording() const override;
|
|
38
|
+
bool isPaused() const override;
|
|
39
|
+
bool isIdle() const override;
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
Result<NoneType, std::string> setOnAudioReadyCallback(float sampleRate, size_t bufferLength, int channelCount, uint64_t callbackId)
|
|
43
42
|
override;
|
|
44
43
|
void clearOnAudioReadyCallback() override;
|
|
45
44
|
|
|
46
|
-
|
|
45
|
+
void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
|
|
46
|
+
void disconnect() override;
|
|
47
47
|
|
|
48
|
-
DataCallbackResult onAudioReady(
|
|
49
|
-
AudioStream *oboeStream,
|
|
48
|
+
oboe::DataCallbackResult onAudioReady(
|
|
49
|
+
oboe::AudioStream *oboeStream,
|
|
50
50
|
void *audioData,
|
|
51
51
|
int32_t numFrames) override;
|
|
52
|
+
void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;
|
|
52
53
|
|
|
53
54
|
private:
|
|
54
|
-
std::
|
|
55
|
-
std::shared_ptr<AudioStream> mStream_;
|
|
55
|
+
std::shared_ptr<AudioArray> deinterleavingBuffer_;
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
std::shared_ptr<AndroidRecorderCallback> callback_;
|
|
59
|
-
|
|
60
|
-
int32_t streamSampleRate_;
|
|
57
|
+
float streamSampleRate_;
|
|
61
58
|
int32_t streamChannelCount_;
|
|
62
59
|
int32_t streamMaxBufferSizeInFrames_;
|
|
63
60
|
|
|
64
61
|
facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
|
|
62
|
+
|
|
63
|
+
std::shared_ptr<oboe::AudioStream> mStream_;
|
|
64
|
+
Result<NoneType, std::string> openAudioStream();
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
} // namespace audioapi
|