react-native-audio-api 0.11.0-alpha.1 → 0.11.0-alpha.3
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 +219 -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 +47 -47
- 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 +379 -298
- 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 +48 -0
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -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 -104
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -16
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -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 +4 -0
- 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 +84 -66
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
- 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 +58 -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 +104 -87
- package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -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 +43 -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 +51 -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 +50 -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/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/Result.hpp +286 -0
- package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
- package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
- package/common/cpp/test/CMakeLists.txt +20 -14
- 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 +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
- 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 +193 -53
- package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
- package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
- package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
- package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
- package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
- package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
- package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
- package/ios/audioapi/ios/system/AudioEngine.h +19 -16
- package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
- package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
- package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
- package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
- package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
- 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 +18 -12
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +8 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioBufferBaseSourceNode.js +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 +4 -7
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/types.js +16 -23
- 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/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 +3 -12
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -0
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioBufferBaseSourceNode.js +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 +4 -7
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/types.js +15 -22
- 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/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 +3 -9
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -0
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +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 +4 -0
- 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 +2 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +3 -2
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +42 -34
- 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/package.json +11 -4
- 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 +4 -52
- package/src/api.web.ts +1 -0
- 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 +5 -0
- package/src/interfaces.ts +51 -34
- package/src/plugin/withAudioAPI.ts +61 -0
- package/src/specs/NativeAudioAPIModule.ts +3 -2
- package/src/system/AudioManager.ts +13 -19
- package/src/types.ts +45 -36
- 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/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/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/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
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
4
|
+
#include <audioapi/core/effects/BiquadFilterNode.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
6
|
+
#include <gtest/gtest.h>
|
|
7
|
+
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
static constexpr int sampleRate = 44100;
|
|
11
|
+
static constexpr float nyquistFrequency = sampleRate / 2.0f;
|
|
12
|
+
static constexpr float tolerance = 0.0001f;
|
|
13
|
+
|
|
14
|
+
namespace audioapi {
|
|
15
|
+
class BiquadFilterTest : public ::testing::Test {
|
|
16
|
+
protected:
|
|
17
|
+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
18
|
+
std::unique_ptr<OfflineAudioContext> context;
|
|
19
|
+
|
|
20
|
+
void SetUp() override {
|
|
21
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
22
|
+
context = std::make_unique<OfflineAudioContext>(
|
|
23
|
+
2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
void expectCoefficientsNear(
|
|
27
|
+
const std::shared_ptr<BiquadFilterNode> &node,
|
|
28
|
+
const BiquadCoefficients &expected);
|
|
29
|
+
void testLowpass(float frequency, float Q);
|
|
30
|
+
void testHighpass(float frequency, float Q);
|
|
31
|
+
void testBandpass(float frequency, float Q);
|
|
32
|
+
void testNotch(float frequency, float Q);
|
|
33
|
+
void testAllpass(float frequency, float Q);
|
|
34
|
+
void testPeaking(float frequency, float Q, float gain);
|
|
35
|
+
void testLowshelf(float frequency, float gain);
|
|
36
|
+
void testHighshelf(float frequency, float gain);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest,
|
|
40
|
+
public ::testing::WithParamInterface<float> {};
|
|
41
|
+
class BiquadFilterQTestRestTypes : public BiquadFilterTest,
|
|
42
|
+
public ::testing::WithParamInterface<float> {};
|
|
43
|
+
class BiquadFilterFrequencyTest : public BiquadFilterTest,
|
|
44
|
+
public ::testing::WithParamInterface<float> {};
|
|
45
|
+
class BiquadFilterGainTest : public BiquadFilterTest,
|
|
46
|
+
public ::testing::WithParamInterface<float> {};
|
|
47
|
+
} // namespace audioapi
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
2
2
|
#import <React/RCTCallInvokerModule.h>
|
|
3
|
+
#import <React/RCTInvalidating.h>
|
|
3
4
|
#import <rnaudioapi/rnaudioapi.h>
|
|
4
5
|
#else // RCT_NEW_ARCH_ENABLED
|
|
5
6
|
#import <React/RCTBridgeModule.h>
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
@interface AudioAPIModule : RCTEventEmitter
|
|
16
17
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
17
|
-
<NativeAudioAPIModuleSpec, RCTCallInvokerModule>
|
|
18
|
+
<NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
|
|
18
19
|
#else
|
|
19
20
|
<RCTBridgeModule>
|
|
20
21
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
@@ -26,7 +26,7 @@ using namespace worklets;
|
|
|
26
26
|
|
|
27
27
|
#if defined(RCT_NEW_ARCH_ENABLED)
|
|
28
28
|
// nothing
|
|
29
|
-
#else
|
|
29
|
+
#else // defined(RCT_NEW_ARCH_ENABLED)
|
|
30
30
|
@interface RCTBridge (RCTTurboModule)
|
|
31
31
|
- (std::shared_ptr<facebook::react::CallInvoker>)jsCallInvoker;
|
|
32
32
|
- (void)_tryAndHandleError:(dispatch_block_t)block;
|
|
@@ -57,10 +57,15 @@ RCT_EXPORT_MODULE(AudioAPIModule);
|
|
|
57
57
|
[super invalidate];
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
- (dispatch_queue_t)methodQueue
|
|
61
|
+
{
|
|
62
|
+
return dispatch_queue_create("com.swmansion.audioapi.MainModuleQueue", DISPATCH_QUEUE_SERIAL);
|
|
63
|
+
}
|
|
64
|
+
|
|
60
65
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
61
66
|
{
|
|
62
67
|
self.audioSessionManager = [[AudioSessionManager alloc] init];
|
|
63
|
-
self.audioEngine = [[AudioEngine alloc]
|
|
68
|
+
self.audioEngine = [[AudioEngine alloc] init];
|
|
64
69
|
self.lockScreenManager = [[LockScreenManager alloc] initWithAudioAPIModule:self];
|
|
65
70
|
self.notificationManager = [[NotificationManager alloc] initWithAudioAPIModule:self];
|
|
66
71
|
|
|
@@ -68,7 +73,7 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
68
73
|
|
|
69
74
|
#if defined(RCT_NEW_ARCH_ENABLED)
|
|
70
75
|
auto jsCallInvoker = _callInvoker.callInvoker;
|
|
71
|
-
#else
|
|
76
|
+
#else // defined(RCT_NEW_ARCH_ENABLED)
|
|
72
77
|
auto jsCallInvoker = self.bridge.jsCallInvoker;
|
|
73
78
|
#endif // defined(RCT_NEW_ARCH_ENABLED)
|
|
74
79
|
|
|
@@ -98,13 +103,14 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
|
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
// Get the actual JSI Runtime reference
|
|
101
|
-
audioapi::AudioAPIModuleInstaller::injectJSIBindings(
|
|
106
|
+
audioapi::AudioAPIModuleInstaller::injectJSIBindings(
|
|
107
|
+
jsiRuntime, jsCallInvoker, _eventHandler, uiWorkletRuntime);
|
|
102
108
|
#else
|
|
103
109
|
audioapi::AudioAPIModuleInstaller::injectJSIBindings(jsiRuntime, jsCallInvoker, _eventHandler);
|
|
104
110
|
#endif
|
|
105
111
|
|
|
106
112
|
NSLog(@"Successfully installed JSI bindings for react-native-audio-api!");
|
|
107
|
-
return @
|
|
113
|
+
return @YES;
|
|
108
114
|
}
|
|
109
115
|
|
|
110
116
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
|
|
@@ -113,22 +119,27 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
|
|
|
113
119
|
}
|
|
114
120
|
|
|
115
121
|
RCT_EXPORT_METHOD(
|
|
116
|
-
setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
|
|
117
|
-
reject)
|
|
122
|
+
setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
|
|
123
|
+
resolve reject : (RCTPromiseRejectBlock)reject)
|
|
118
124
|
{
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
125
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
126
|
+
auto success = [self.audioSessionManager setActive:enabled];
|
|
123
127
|
|
|
124
|
-
|
|
128
|
+
resolve(@(success));
|
|
129
|
+
});
|
|
125
130
|
}
|
|
126
131
|
|
|
127
132
|
RCT_EXPORT_METHOD(
|
|
128
133
|
setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
|
|
129
134
|
options allowHaptics : (BOOL)allowHaptics)
|
|
130
135
|
{
|
|
131
|
-
|
|
136
|
+
if (!self.audioSessionManager.shouldManageSession) {
|
|
137
|
+
[self.audioSessionManager setShouldManageSession:true];
|
|
138
|
+
}
|
|
139
|
+
[self.audioSessionManager setAudioSessionOptions:category
|
|
140
|
+
mode:mode
|
|
141
|
+
options:options
|
|
142
|
+
allowHaptics:allowHaptics];
|
|
132
143
|
}
|
|
133
144
|
|
|
134
145
|
RCT_EXPORT_METHOD(setLockScreenInfo : (NSDictionary *)info)
|
|
@@ -162,22 +173,35 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
|
|
|
162
173
|
}
|
|
163
174
|
|
|
164
175
|
RCT_EXPORT_METHOD(
|
|
165
|
-
requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
166
|
-
reject)
|
|
176
|
+
requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
177
|
+
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
167
178
|
{
|
|
168
|
-
|
|
179
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
180
|
+
[self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
|
|
181
|
+
});
|
|
169
182
|
}
|
|
170
183
|
|
|
171
184
|
RCT_EXPORT_METHOD(
|
|
172
|
-
checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
185
|
+
checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
|
|
186
|
+
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
173
187
|
{
|
|
174
|
-
|
|
188
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
189
|
+
[self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
|
|
190
|
+
});
|
|
175
191
|
}
|
|
176
192
|
|
|
177
193
|
RCT_EXPORT_METHOD(
|
|
178
|
-
getDevicesInfo : (nonnull RCTPromiseResolveBlock)
|
|
194
|
+
getDevicesInfo : (nonnull RCTPromiseResolveBlock)
|
|
195
|
+
resolve reject : (nonnull RCTPromiseRejectBlock)reject)
|
|
196
|
+
{
|
|
197
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
198
|
+
[self.audioSessionManager getDevicesInfo:resolve reject:reject];
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
RCT_EXPORT_METHOD(disableSessionManagement)
|
|
179
203
|
{
|
|
180
|
-
[self.audioSessionManager
|
|
204
|
+
[self.audioSessionManager disableSessionManagement];
|
|
181
205
|
}
|
|
182
206
|
|
|
183
207
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#ifdef __OBJC__ // when compiled as Objective-C
|
|
3
|
+
#ifdef __OBJC__ // when compiled as Objective-C
|
|
4
4
|
#import <NativeAudioPlayer.h>
|
|
5
|
-
#else
|
|
5
|
+
#else // when compiled as C++
|
|
6
6
|
typedef struct objc_object NativeAudioPlayer;
|
|
7
7
|
#endif // __OBJC__
|
|
8
8
|
|
|
@@ -21,7 +21,7 @@ IOSAudioPlayer::IOSAudioPlayer(
|
|
|
21
21
|
while (processedFrames < numFrames) {
|
|
22
22
|
int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
|
|
23
23
|
|
|
24
|
-
if (isRunning_.load()) {
|
|
24
|
+
if (isRunning_.load(std::memory_order_acquire)) {
|
|
25
25
|
renderAudio_(audioBus_, framesToProcess);
|
|
26
26
|
} else {
|
|
27
27
|
audioBus_->zero();
|
|
@@ -57,13 +57,13 @@ bool IOSAudioPlayer::start()
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
bool success = [audioPlayer_ start];
|
|
60
|
-
isRunning_.store(success);
|
|
60
|
+
isRunning_.store(success, std::memory_order_release);
|
|
61
61
|
return success;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
void IOSAudioPlayer::stop()
|
|
65
65
|
{
|
|
66
|
-
isRunning_.store(false);
|
|
66
|
+
isRunning_.store(false, std::memory_order_release);
|
|
67
67
|
[audioPlayer_ stop];
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -74,13 +74,13 @@ bool IOSAudioPlayer::resume()
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
bool success = [audioPlayer_ resume];
|
|
77
|
-
isRunning_.store(success);
|
|
77
|
+
isRunning_.store(success, std::memory_order_release);
|
|
78
78
|
return success;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
void IOSAudioPlayer::suspend()
|
|
82
82
|
{
|
|
83
|
-
isRunning_.store(false);
|
|
83
|
+
isRunning_.store(false, std::memory_order_release);
|
|
84
84
|
[audioPlayer_ suspend];
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -88,7 +88,8 @@ bool IOSAudioPlayer::isRunning() const
|
|
|
88
88
|
{
|
|
89
89
|
AudioEngine *audioEngine = [AudioEngine sharedInstance];
|
|
90
90
|
|
|
91
|
-
return isRunning_.load() &&
|
|
91
|
+
return isRunning_.load(std::memory_order_acquire) &&
|
|
92
|
+
[audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
void IOSAudioPlayer::cleanup()
|
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#ifdef __OBJC__ // when compiled as C
|
|
3
|
+
#ifdef __OBJC__ // when compiled as Objective-C
|
|
4
4
|
#import <NativeAudioRecorder.h>
|
|
5
5
|
#else
|
|
6
|
-
typedef struct objc_object AVAudioFile;
|
|
7
6
|
typedef struct objc_object NSURL;
|
|
7
|
+
typedef struct objc_object AVAudioFile;
|
|
8
8
|
typedef struct objc_object AudioBufferList;
|
|
9
9
|
typedef struct objc_object NativeAudioRecorder;
|
|
10
10
|
#endif // __OBJC__
|
|
11
11
|
|
|
12
12
|
#include <audioapi/core/inputs/AudioRecorder.h>
|
|
13
|
+
#include <audioapi/utils/Result.hpp>
|
|
14
|
+
|
|
15
|
+
#include <mutex>
|
|
13
16
|
|
|
14
17
|
namespace audioapi {
|
|
15
18
|
|
|
16
|
-
class
|
|
17
|
-
class
|
|
18
|
-
class
|
|
19
|
-
class
|
|
19
|
+
class FileWriter;
|
|
20
|
+
class RecorderCallback;
|
|
21
|
+
class RecorderAdapterNode;
|
|
22
|
+
class AudioFileProperties;
|
|
20
23
|
class AudioEventHandlerRegistry;
|
|
21
24
|
|
|
22
25
|
class IOSAudioRecorder : public AudioRecorder {
|
|
@@ -24,26 +27,31 @@ class IOSAudioRecorder : public AudioRecorder {
|
|
|
24
27
|
IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
25
28
|
~IOSAudioRecorder() override;
|
|
26
29
|
|
|
27
|
-
std::string start() override;
|
|
28
|
-
std::tuple<std::string, double, double> stop() override;
|
|
30
|
+
Result<std::string, std::string> start() override;
|
|
31
|
+
Result<std::tuple<std::string, double, double>, std::string> stop() override;
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
override;
|
|
33
|
+
Result<std::string, std::string> enableFileOutput(
|
|
34
|
+
std::shared_ptr<AudioFileProperties> properties) override;
|
|
32
35
|
void disableFileOutput() override;
|
|
33
36
|
|
|
37
|
+
void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
|
|
38
|
+
void disconnect() override;
|
|
39
|
+
|
|
34
40
|
void pause() override;
|
|
35
41
|
void resume() override;
|
|
36
42
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
bool isRecording() const override;
|
|
44
|
+
bool isPaused() const override;
|
|
45
|
+
bool isIdle() const override;
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
Result<NoneType, std::string> setOnAudioReadyCallback(
|
|
48
|
+
float sampleRate,
|
|
49
|
+
size_t bufferLength,
|
|
50
|
+
int channelCount,
|
|
51
|
+
uint64_t callbackId) override;
|
|
52
|
+
void clearOnAudioReadyCallback() override;
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
std::shared_ptr<IOSAudioFileWriter> fileWriter_;
|
|
45
|
-
std::shared_ptr<IOSRecorderCallback> callback_;
|
|
46
|
-
std::string filePath_{""};
|
|
54
|
+
protected:
|
|
47
55
|
NativeAudioRecorder *nativeRecorder_;
|
|
48
56
|
};
|
|
49
57
|
|
|
@@ -1,30 +1,56 @@
|
|
|
1
1
|
#import <AVFoundation/AVFoundation.h>
|
|
2
|
+
#import <AudioEngine.h>
|
|
3
|
+
#import <AudioSessionManager.h>
|
|
2
4
|
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
3
6
|
#include <unordered_map>
|
|
4
7
|
|
|
8
|
+
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
9
|
+
#include <audioapi/core/utils/AudioFileWriter.h>
|
|
5
10
|
#include <audioapi/core/utils/Constants.h>
|
|
11
|
+
#include <audioapi/core/utils/Locker.h>
|
|
6
12
|
#include <audioapi/dsp/VectorMath.h>
|
|
7
13
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
8
|
-
#include <audioapi/ios/core/IOSAudioFileWriter.h>
|
|
9
14
|
#include <audioapi/ios/core/IOSAudioRecorder.h>
|
|
10
|
-
#include <audioapi/ios/core/
|
|
15
|
+
#include <audioapi/ios/core/utils/IOSFileWriter.h>
|
|
16
|
+
#include <audioapi/ios/core/utils/IOSRecorderCallback.h>
|
|
17
|
+
#include <audioapi/ios/system/AudioEngine.h>
|
|
11
18
|
#include <audioapi/utils/AudioArray.h>
|
|
12
19
|
#include <audioapi/utils/AudioBus.h>
|
|
20
|
+
#include <audioapi/utils/AudioFileProperties.h>
|
|
13
21
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
14
22
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
23
|
+
#include <audioapi/utils/Result.hpp>
|
|
15
24
|
|
|
16
25
|
namespace audioapi {
|
|
17
26
|
|
|
18
|
-
IOSAudioRecorder::IOSAudioRecorder(
|
|
19
|
-
|
|
27
|
+
IOSAudioRecorder::IOSAudioRecorder(
|
|
28
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
29
|
+
: AudioRecorder(audioEventHandlerRegistry)
|
|
20
30
|
{
|
|
21
31
|
AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
|
|
22
32
|
if (usesFileOutput()) {
|
|
23
|
-
|
|
33
|
+
if (auto lock = Locker::tryLock(fileWriterMutex_)) {
|
|
34
|
+
std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
|
|
35
|
+
->writeAudioData(inputBuffer, numFrames);
|
|
36
|
+
}
|
|
24
37
|
}
|
|
25
38
|
|
|
26
39
|
if (usesCallback()) {
|
|
27
|
-
|
|
40
|
+
if (auto lock = Locker::tryLock(callbackMutex_)) {
|
|
41
|
+
std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
|
|
42
|
+
->receiveAudioData(inputBuffer, numFrames);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (isConnected()) {
|
|
47
|
+
if (auto lock = Locker::tryLock(adapterNodeMutex_)) {
|
|
48
|
+
for (size_t channel = 0; channel < adapterNode_->channelCount_; ++channel) {
|
|
49
|
+
float *channelData = (float *)inputBuffer->mBuffers[channel].mData;
|
|
50
|
+
|
|
51
|
+
adapterNode_->buff_[channel]->write(channelData, numFrames);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
28
54
|
}
|
|
29
55
|
};
|
|
30
56
|
|
|
@@ -36,84 +62,168 @@ IOSAudioRecorder::~IOSAudioRecorder()
|
|
|
36
62
|
stop();
|
|
37
63
|
[nativeRecorder_ cleanup];
|
|
38
64
|
}
|
|
39
|
-
std::string IOSAudioRecorder::start()
|
|
40
|
-
{
|
|
41
|
-
size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
|
|
42
65
|
|
|
66
|
+
Result<std::string, std::string> IOSAudioRecorder::start()
|
|
67
|
+
{
|
|
43
68
|
if (isRecording()) {
|
|
44
|
-
return
|
|
69
|
+
return Result<std::string, std::string>::Err("Already recording");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
|
|
73
|
+
AudioSessionManager *audioSessionManager = [AudioSessionManager sharedInstance];
|
|
74
|
+
|
|
75
|
+
if ([[audioSessionManager checkRecordingPermissions] isEqual:@"Denied"]) {
|
|
76
|
+
return Result<std::string, std::string>::Err("Microphone permissions are not granted");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// TODO: recorder should probably request activating the session and setting the options if not set by user
|
|
80
|
+
// but lets handle that in another PR
|
|
81
|
+
if (![audioSessionManager isSessionActive]) {
|
|
82
|
+
return Result<std::string, std::string>::Err("Audio session is not active");
|
|
45
83
|
}
|
|
46
84
|
|
|
85
|
+
// TODO: this is a bit ugly, and could be written slightly better
|
|
86
|
+
// we need to stop the audio engine if it's running, to be able to get
|
|
87
|
+
// proper input format values, otherwise the system my zero out the sample rate or channel count
|
|
88
|
+
// if input wasn't used yet
|
|
89
|
+
// (especially on simulators)
|
|
90
|
+
// Engine will be started again once the native recorder starts
|
|
91
|
+
[AudioEngine.sharedInstance stopIfNecessary];
|
|
92
|
+
|
|
93
|
+
size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
|
|
94
|
+
auto inputFormat = [nativeRecorder_ getInputFormat];
|
|
95
|
+
|
|
47
96
|
if (usesFileOutput()) {
|
|
48
|
-
|
|
97
|
+
auto fileResult = std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
|
|
98
|
+
->openFile(inputFormat, maxInputBufferLength);
|
|
99
|
+
|
|
100
|
+
if (fileResult.is_err()) {
|
|
101
|
+
return Result<std::string, std::string>::Err(
|
|
102
|
+
"Failed to open file for writing: " + fileResult.unwrap_err());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
filePath_ = fileResult.unwrap();
|
|
49
106
|
}
|
|
50
107
|
|
|
51
108
|
if (usesCallback()) {
|
|
52
|
-
|
|
109
|
+
auto callbackResult = std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
|
|
110
|
+
->prepare(inputFormat, maxInputBufferLength);
|
|
111
|
+
|
|
112
|
+
if (callbackResult.is_err()) {
|
|
113
|
+
return Result<std::string, std::string>::Err(
|
|
114
|
+
"Failed to prepare callback: " + callbackResult.unwrap_err());
|
|
115
|
+
}
|
|
53
116
|
}
|
|
54
117
|
|
|
55
118
|
if (isConnected()) {
|
|
56
|
-
// TODO:
|
|
119
|
+
// TODO: pass sample rate, in case conversion is necessary
|
|
120
|
+
adapterNode_->init(maxInputBufferLength, inputFormat.channelCount);
|
|
57
121
|
}
|
|
58
122
|
|
|
59
123
|
[nativeRecorder_ start];
|
|
60
|
-
state_.store(RecorderState::Recording);
|
|
61
|
-
|
|
62
|
-
return filePath_;
|
|
124
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
125
|
+
return Result<std::string, std::string>::Ok(filePath_);
|
|
63
126
|
}
|
|
64
127
|
|
|
65
|
-
std::tuple<std::string, double, double> IOSAudioRecorder::stop()
|
|
128
|
+
Result<std::tuple<std::string, double, double>, std::string> IOSAudioRecorder::stop()
|
|
66
129
|
{
|
|
130
|
+
std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
|
|
131
|
+
|
|
67
132
|
std::string filePath = filePath_;
|
|
68
133
|
double outputFileSize = 0;
|
|
69
134
|
double outputDuration = 0;
|
|
70
135
|
|
|
71
136
|
if (!isRecording()) {
|
|
72
|
-
return
|
|
137
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err("Not recording");
|
|
73
138
|
}
|
|
74
139
|
|
|
140
|
+
state_.store(RecorderState::Idle, std::memory_order_release);
|
|
75
141
|
[nativeRecorder_ stop];
|
|
76
|
-
state_.store(RecorderState::Idle);
|
|
77
142
|
|
|
78
143
|
if (usesFileOutput()) {
|
|
79
|
-
auto
|
|
80
|
-
|
|
81
|
-
|
|
144
|
+
auto fileResult = fileWriter_->closeFile();
|
|
145
|
+
|
|
146
|
+
if (fileResult.is_err()) {
|
|
147
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Err(
|
|
148
|
+
"Failed to close file: " + fileResult.unwrap_err());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
outputFileSize = std::get<0>(fileResult.unwrap());
|
|
152
|
+
outputDuration = std::get<1>(fileResult.unwrap());
|
|
82
153
|
}
|
|
83
154
|
|
|
84
155
|
if (usesCallback()) {
|
|
85
|
-
|
|
156
|
+
dataCallback_->cleanup();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (isConnected()) {
|
|
160
|
+
adapterNode_->cleanup();
|
|
86
161
|
}
|
|
87
162
|
|
|
88
163
|
filePath_ = "";
|
|
89
|
-
return
|
|
164
|
+
return Result<std::tuple<std::string, double, double>, std::string>::Ok(
|
|
165
|
+
std::make_tuple(filePath, outputFileSize, outputDuration));
|
|
90
166
|
}
|
|
91
167
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
size_t channelCount,
|
|
95
|
-
size_t bitRate,
|
|
96
|
-
size_t iosFlags,
|
|
97
|
-
size_t androidFlags)
|
|
168
|
+
Result<std::string, std::string> IOSAudioRecorder::enableFileOutput(
|
|
169
|
+
std::shared_ptr<AudioFileProperties> properties)
|
|
98
170
|
{
|
|
99
|
-
|
|
100
|
-
fileWriter_ = std::make_shared<
|
|
171
|
+
std::scoped_lock lock(fileWriterMutex_, errorCallbackMutex_);
|
|
172
|
+
fileWriter_ = std::make_shared<IOSFileWriter>(audioEventHandlerRegistry_, properties);
|
|
173
|
+
|
|
174
|
+
if (!isIdle()) {
|
|
175
|
+
auto result = std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
|
|
176
|
+
->openFile([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
|
|
177
|
+
|
|
178
|
+
if (result.is_err()) {
|
|
179
|
+
return Result<std::string, std::string>::Err(
|
|
180
|
+
"Failed to open file for writing: " + result.unwrap_err());
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
filePath_ = result.unwrap();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
fileWriter_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
|
|
187
|
+
|
|
188
|
+
fileOutputEnabled_.store(true, std::memory_order_release);
|
|
189
|
+
return Result<std::string, std::string>::Ok(filePath_);
|
|
101
190
|
}
|
|
102
191
|
|
|
103
192
|
void IOSAudioRecorder::disableFileOutput()
|
|
104
193
|
{
|
|
105
|
-
|
|
194
|
+
std::scoped_lock lock(fileWriterMutex_);
|
|
195
|
+
fileOutputEnabled_.store(false, std::memory_order_release);
|
|
106
196
|
fileWriter_ = nullptr;
|
|
107
197
|
}
|
|
108
198
|
|
|
199
|
+
void IOSAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node)
|
|
200
|
+
{
|
|
201
|
+
std::scoped_lock lock(adapterNodeMutex_);
|
|
202
|
+
adapterNode_ = node;
|
|
203
|
+
|
|
204
|
+
if (!isIdle()) {
|
|
205
|
+
adapterNode_->init(
|
|
206
|
+
[nativeRecorder_ getBufferSize], [nativeRecorder_ getInputFormat].channelCount);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
isConnected_.store(true, std::memory_order_release);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
void IOSAudioRecorder::disconnect()
|
|
213
|
+
{
|
|
214
|
+
std::scoped_lock lock(adapterNodeMutex_);
|
|
215
|
+
adapterNode_ = nullptr;
|
|
216
|
+
isConnected_.store(false, std::memory_order_release);
|
|
217
|
+
}
|
|
218
|
+
|
|
109
219
|
void IOSAudioRecorder::pause()
|
|
110
220
|
{
|
|
111
221
|
if (!isRecording()) {
|
|
112
222
|
return;
|
|
113
223
|
}
|
|
114
224
|
|
|
115
|
-
[nativeRecorder_
|
|
116
|
-
state_.store(RecorderState::Paused);
|
|
225
|
+
[nativeRecorder_ pause];
|
|
226
|
+
state_.store(RecorderState::Paused, std::memory_order_release);
|
|
117
227
|
}
|
|
118
228
|
|
|
119
229
|
void IOSAudioRecorder::resume()
|
|
@@ -122,36 +232,66 @@ void IOSAudioRecorder::resume()
|
|
|
122
232
|
return;
|
|
123
233
|
}
|
|
124
234
|
|
|
125
|
-
[nativeRecorder_
|
|
126
|
-
state_.store(RecorderState::Recording);
|
|
235
|
+
[nativeRecorder_ resume];
|
|
236
|
+
state_.store(RecorderState::Recording, std::memory_order_release);
|
|
127
237
|
}
|
|
128
238
|
|
|
129
|
-
|
|
130
|
-
float sampleRate,
|
|
131
|
-
size_t bufferLength,
|
|
132
|
-
size_t channelCount,
|
|
133
|
-
uint64_t callbackId)
|
|
239
|
+
bool IOSAudioRecorder::isRecording() const
|
|
134
240
|
{
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
241
|
+
AudioEngine *audioEngine = [AudioEngine sharedInstance];
|
|
242
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
|
|
243
|
+
[audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
|
|
138
244
|
}
|
|
139
245
|
|
|
140
|
-
|
|
246
|
+
bool IOSAudioRecorder::isPaused() const
|
|
141
247
|
{
|
|
142
|
-
|
|
143
|
-
|
|
248
|
+
AudioEngine *audioEngine = [AudioEngine sharedInstance];
|
|
249
|
+
auto currentState = state_.load(std::memory_order_acquire);
|
|
250
|
+
|
|
251
|
+
if (currentState == RecorderState::Idle) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return currentState == RecorderState::Paused &&
|
|
256
|
+
[audioEngine getState] != AudioEngineState::AudioEngineStateRunning;
|
|
144
257
|
}
|
|
145
258
|
|
|
146
|
-
|
|
259
|
+
bool IOSAudioRecorder::isIdle() const
|
|
147
260
|
{
|
|
148
|
-
|
|
261
|
+
return state_.load(std::memory_order_acquire) == RecorderState::Idle;
|
|
262
|
+
}
|
|
149
263
|
|
|
150
|
-
|
|
151
|
-
|
|
264
|
+
Result<NoneType, std::string> IOSAudioRecorder::setOnAudioReadyCallback(
|
|
265
|
+
float sampleRate,
|
|
266
|
+
size_t bufferLength,
|
|
267
|
+
int channelCount,
|
|
268
|
+
uint64_t callbackId)
|
|
269
|
+
{
|
|
270
|
+
std::scoped_lock lock(callbackMutex_, errorCallbackMutex_);
|
|
271
|
+
|
|
272
|
+
dataCallback_ = std::make_shared<IOSRecorderCallback>(
|
|
273
|
+
audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
|
|
274
|
+
|
|
275
|
+
if (!isIdle()) {
|
|
276
|
+
auto result = std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
|
|
277
|
+
->prepare([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
|
|
278
|
+
|
|
279
|
+
if (result.is_err()) {
|
|
280
|
+
return Result<NoneType, std::string>::Err(result.unwrap_err());
|
|
281
|
+
}
|
|
152
282
|
}
|
|
153
283
|
|
|
154
|
-
|
|
284
|
+
dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
|
|
285
|
+
|
|
286
|
+
callbackOutputEnabled_.store(true, std::memory_order_release);
|
|
287
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
void IOSAudioRecorder::clearOnAudioReadyCallback()
|
|
291
|
+
{
|
|
292
|
+
std::scoped_lock lock(callbackMutex_);
|
|
293
|
+
callbackOutputEnabled_.store(false, std::memory_order_release);
|
|
294
|
+
dataCallback_ = nullptr;
|
|
155
295
|
}
|
|
156
296
|
|
|
157
297
|
} // namespace audioapi
|