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
|
@@ -1,429 +1,493 @@
|
|
|
1
|
-
#
|
|
2
|
-
#include <cmath>
|
|
1
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
3
2
|
|
|
4
3
|
extern "C" {
|
|
5
|
-
#include <
|
|
4
|
+
#include <libavcodec/avcodec.h>
|
|
5
|
+
#include <libavformat/avformat.h>
|
|
6
|
+
#include <libavutil/audio_fifo.h>
|
|
7
|
+
#include <libavutil/opt.h>
|
|
8
|
+
#include <libswresample/swresample.h>
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
|
|
9
|
-
#include <audioapi/android/core/utils/
|
|
12
|
+
#include <audioapi/android/core/utils/FileOptions.h>
|
|
10
13
|
#include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>
|
|
14
|
+
#include <audioapi/android/core/utils/ffmpegBackend/ptrs.hpp>
|
|
15
|
+
#include <audioapi/android/core/utils/ffmpegBackend/utils.h>
|
|
16
|
+
#include <audioapi/utils/AudioFileProperties.h>
|
|
17
|
+
#include <audioapi/utils/UnitConversion.h>
|
|
11
18
|
|
|
12
|
-
|
|
19
|
+
#include <algorithm>
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include <utility>
|
|
13
23
|
|
|
14
|
-
|
|
24
|
+
constexpr int defaultFrameRatio = 4;
|
|
25
|
+
constexpr int fallbackFIFOSize = 8192;
|
|
26
|
+
constexpr int defaultFlushInterval = 100;
|
|
27
|
+
|
|
28
|
+
namespace audioapi::android::ffmpeg {
|
|
15
29
|
|
|
16
30
|
FFmpegAudioFileWriter::FFmpegAudioFileWriter(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
channelCount,
|
|
24
|
-
bitRate,
|
|
25
|
-
androidFlags) {
|
|
26
|
-
fileOptions_ = std::make_shared<FFmpegAudioFileOptions>(
|
|
27
|
-
sampleRate, channelCount, bitRate, androidFlags);
|
|
31
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
32
|
+
const std::shared_ptr<AudioFileProperties> &fileProperties)
|
|
33
|
+
: AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties) {
|
|
34
|
+
// Set flush interval from properties, limit minimum to 100ms
|
|
35
|
+
// to avoid people hurting themselves too much
|
|
36
|
+
flushIntervalMs_ = std::min(fileProperties_->androidFlushIntervalMs, defaultFlushInterval);
|
|
28
37
|
}
|
|
29
38
|
|
|
30
39
|
FFmpegAudioFileWriter::~FFmpegAudioFileWriter() {
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
if (isFileOpen()) {
|
|
41
|
+
closeFile();
|
|
42
|
+
}
|
|
33
43
|
}
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
45
|
+
/// @brief Opens a specified audio file for writing and prepares any necessary resources.
|
|
46
|
+
/// such as codecs, conversion buffers or circular AVIO FIFO.
|
|
47
|
+
/// This method should be called from the JS thread only.
|
|
48
|
+
/// @param streamSampleRate The sample rate of the incoming audio stream (aka microphone).
|
|
49
|
+
/// @param streamChannelCount The number of channels in the incoming audio stream.
|
|
50
|
+
/// @param streamMaxBufferSize The estimated maximum buffer size for the incoming audio stream.
|
|
51
|
+
/// @returns Success status with file path or Error status with message.
|
|
52
|
+
OpenFileResult FFmpegAudioFileWriter::openFile(
|
|
53
|
+
float streamSampleRate,
|
|
37
54
|
int32_t streamChannelCount,
|
|
38
55
|
int32_t streamMaxBufferSize) {
|
|
39
|
-
filePath_ = fileOptions_->getFilePath("audio");
|
|
40
|
-
|
|
41
56
|
streamSampleRate_ = streamSampleRate;
|
|
42
57
|
streamChannelCount_ = streamChannelCount;
|
|
43
58
|
streamMaxBufferSize_ = streamMaxBufferSize;
|
|
44
|
-
framesWritten_.store(0);
|
|
59
|
+
framesWritten_.store(0, std::memory_order_release);
|
|
45
60
|
nextPts_ = 0;
|
|
61
|
+
Result<NoneType, std::string> result = Result<NoneType, std::string>::Ok(None);
|
|
62
|
+
Result<std::string, std::string> filePathResult = fileoptions::getFilePath(fileProperties_);
|
|
46
63
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (avformat_alloc_output_context2(
|
|
51
|
-
&rawFormatCtx,
|
|
52
|
-
nullptr,
|
|
53
|
-
fileOptions_->getMuxerName().c_str(),
|
|
54
|
-
filePath_.c_str()) < 0 ||
|
|
55
|
-
!rawFormatCtx) {
|
|
56
|
-
__android_log_print(
|
|
57
|
-
ANDROID_LOG_ERROR,
|
|
58
|
-
"FFmpegFileWriter",
|
|
59
|
-
"Failed to allocate FFmpeg format context for file: %s",
|
|
60
|
-
filePath_.c_str());
|
|
61
|
-
return "";
|
|
64
|
+
if (!filePathResult.is_ok()) {
|
|
65
|
+
return OpenFileResult::Err(filePathResult.unwrap_err());
|
|
62
66
|
}
|
|
63
67
|
|
|
64
|
-
|
|
65
|
-
stream_ = avformat_new_stream(formatCtx_.get(), codec);
|
|
68
|
+
filePath_ = filePathResult.unwrap();
|
|
66
69
|
|
|
67
|
-
|
|
70
|
+
const AVCodec *codec = getCodec(fileProperties_);
|
|
68
71
|
|
|
69
|
-
if (!
|
|
70
|
-
|
|
71
|
-
ANDROID_LOG_ERROR,
|
|
72
|
-
"FFmpegFileWriter",
|
|
73
|
-
"Failed to allocate FFmpeg codec context for file");
|
|
74
|
-
return "";
|
|
72
|
+
if (!codec) {
|
|
73
|
+
return OpenFileResult::Err("Unsupported codec for the given file format");
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
return initializeFormatContext(codec)
|
|
77
|
+
.and_then([this, codec](auto) { return configureAndOpenCodec(codec); })
|
|
78
|
+
.and_then([this](auto) { return initializeStream(); })
|
|
79
|
+
.and_then([this](auto) { return openIOAndWriteHeader(); })
|
|
80
|
+
.and_then([this, streamSampleRate, streamChannelCount](auto) {
|
|
81
|
+
return initializeResampler(streamSampleRate, streamChannelCount);
|
|
82
|
+
})
|
|
83
|
+
.and_then([this, streamMaxBufferSize, filePath = std::move(filePath_)](auto) {
|
|
84
|
+
initializeBuffers(streamMaxBufferSize);
|
|
85
|
+
isFileOpen_.store(true, std::memory_order_release);
|
|
86
|
+
return OpenFileResult::Ok(filePath);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
/// @brief Closes the currently opened audio file, flushing any remaining data and finalizing the file.
|
|
91
|
+
/// This method should called from the JS thread only.
|
|
92
|
+
/// @returns CloseFileStatus indicating success with file path, size and duration, or error with message.
|
|
93
|
+
CloseFileResult FFmpegAudioFileWriter::closeFile() {
|
|
94
|
+
int result = 0;
|
|
85
95
|
|
|
86
|
-
if (
|
|
87
|
-
|
|
96
|
+
if (!isFileOpen()) {
|
|
97
|
+
return CloseFileResult::Err("File is not open");
|
|
88
98
|
}
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
av_dict_set_int(
|
|
92
|
-
&codecOptions, "compression_level", flacCompressionLevel, 0);
|
|
93
|
-
}
|
|
100
|
+
result = processFifo(true);
|
|
94
101
|
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"Failed to
|
|
100
|
-
|
|
101
|
-
return "";
|
|
102
|
+
if (result < 0) {
|
|
103
|
+
auto finalStatus = finalizeOutput();
|
|
104
|
+
|
|
105
|
+
return CloseFileResult::Err(
|
|
106
|
+
"Failed to flush FIFO to encoder. error code: " + parseErrorCode(result) +
|
|
107
|
+
", finalization status: " + (finalStatus.is_ok() ? "success" : finalStatus.unwrap_err()));
|
|
102
108
|
}
|
|
103
109
|
|
|
104
|
-
|
|
110
|
+
result = avcodec_send_frame(encoderCtx_.get(), nullptr);
|
|
105
111
|
|
|
106
|
-
if (
|
|
107
|
-
|
|
108
|
-
__android_log_print(
|
|
109
|
-
ANDROID_LOG_ERROR,
|
|
110
|
-
"FFmpegFileWriter",
|
|
111
|
-
"Failed to copy codec parameters to stream for file");
|
|
112
|
-
return "";
|
|
112
|
+
if (result < 0) {
|
|
113
|
+
return CloseFileResult::Err("Failed to send EOF to encoder");
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
__android_log_print(
|
|
118
|
-
ANDROID_LOG_ERROR,
|
|
119
|
-
"FFmpegFileWriter",
|
|
120
|
-
"Failed to open output file: %s",
|
|
121
|
-
filePath_.c_str());
|
|
122
|
-
return "";
|
|
123
|
-
}
|
|
116
|
+
if (writeEncodedPackets() < 0) {
|
|
117
|
+
return CloseFileResult::Err("Failed to drain encoder packets");
|
|
124
118
|
}
|
|
125
119
|
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
return finalizeOutput();
|
|
121
|
+
}
|
|
128
122
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
123
|
+
/// @brief Writes audio data to the currently opened file.
|
|
124
|
+
/// This method should be called only from the audio thread (or audio side-effect thread in the future).
|
|
125
|
+
/// @param data Pointer to the audio data buffer (interleaved float samples) as returned by Oboe stream.
|
|
126
|
+
/// @param numFrames Number of audio frames in the data buffer.
|
|
127
|
+
/// @returns True if the data was written successfully, false otherwise.
|
|
128
|
+
bool FFmpegAudioFileWriter::writeAudioData(void *data, int numFrames) {
|
|
129
|
+
if (!isFileOpen()) {
|
|
130
|
+
return false;
|
|
136
131
|
}
|
|
137
132
|
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
if (!resampleAndPushToFifo(data, numFrames)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
140
136
|
|
|
141
|
-
|
|
137
|
+
framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
|
|
142
138
|
|
|
143
|
-
|
|
144
|
-
|
|
139
|
+
if (processFifo(false) < 0) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
145
142
|
|
|
146
|
-
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
147
145
|
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
/// @brief Initializes the FFmpeg format context for the output file.
|
|
147
|
+
/// @param codec The codec to be used for encoding.
|
|
148
|
+
/// @returns Success status or Error status with message.
|
|
149
|
+
Result<NoneType, std::string> FFmpegAudioFileWriter::initializeFormatContext(const AVCodec *codec) {
|
|
150
|
+
AVFormatContext *rawFormatCtx = nullptr;
|
|
150
151
|
|
|
151
|
-
|
|
152
|
+
int result = avformat_alloc_output_context2(
|
|
153
|
+
&rawFormatCtx, nullptr, getMuxerName(fileProperties_).c_str(), filePath_.c_str());
|
|
152
154
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
+
if (result < 0 || !rawFormatCtx) {
|
|
156
|
+
return Result<NoneType, std::string>::Err(
|
|
157
|
+
"Failed to allocate FFmpeg format context with error: " + parseErrorCode(result));
|
|
158
|
+
}
|
|
155
159
|
|
|
156
|
-
|
|
157
|
-
|
|
160
|
+
formatCtx_ = av_unique_ptr<AVFormatContext>(rawFormatCtx);
|
|
161
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
162
|
+
}
|
|
158
163
|
|
|
159
|
-
|
|
160
|
-
|
|
164
|
+
/// @brief Configures and opens the codec context for encoding.
|
|
165
|
+
/// @param codec The codec to be used for encoding.
|
|
166
|
+
/// @returns Success status or Error status with message.
|
|
167
|
+
Result<NoneType, std::string> FFmpegAudioFileWriter::configureAndOpenCodec(const AVCodec *codec) {
|
|
168
|
+
encoderCtx_ = av_unique_ptr<AVCodecContext>(avcodec_alloc_context3(codec));
|
|
161
169
|
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
ANDROID_LOG_ERROR,
|
|
165
|
-
"FFmpegFileWriter",
|
|
166
|
-
"Failed to initialize resampler for file: %s",
|
|
167
|
-
filePath_.c_str());
|
|
168
|
-
return "";
|
|
170
|
+
if (!encoderCtx_) {
|
|
171
|
+
return Result<NoneType, std::string>::Err("Failed to allocate FFmpeg codec context");
|
|
169
172
|
}
|
|
170
173
|
|
|
171
|
-
|
|
174
|
+
av_channel_layout_default(&encoderCtx_->ch_layout, fileProperties_->channelCount);
|
|
175
|
+
encoderCtx_->sample_rate = static_cast<int>(fileProperties_->sampleRate);
|
|
176
|
+
encoderCtx_->sample_fmt = getSampleFormat(fileProperties_);
|
|
172
177
|
|
|
173
|
-
if (
|
|
174
|
-
|
|
175
|
-
static_cast<double>(streamMaxBufferSize_) /
|
|
176
|
-
static_cast<double>(encoderCtx_->frame_size)));
|
|
178
|
+
if (fileProperties_->bitRate > 0) {
|
|
179
|
+
encoderCtx_->bit_rate = fileProperties_->bitRate;
|
|
177
180
|
}
|
|
178
181
|
|
|
179
|
-
|
|
180
|
-
encoderCtx_->frame_size > 0
|
|
181
|
-
? encoderCtx_->frame_size * contextFrameRatio * 2
|
|
182
|
-
: streamMaxBufferSize_ * 2,
|
|
183
|
-
4096);
|
|
182
|
+
AVDictionary *codecOptions = nullptr;
|
|
184
183
|
|
|
185
|
-
|
|
186
|
-
|
|
184
|
+
if (fileProperties_->flacCompressionLevel >= 0) {
|
|
185
|
+
av_dict_set_int(&codecOptions, "compression_level", fileProperties_->flacCompressionLevel, 0);
|
|
186
|
+
}
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"FFmpegFileWriter",
|
|
191
|
-
"Using audio FIFO size of %d frames",
|
|
192
|
-
fifoSize);
|
|
188
|
+
int result = avcodec_open2(encoderCtx_.get(), codec, &codecOptions);
|
|
189
|
+
av_dict_free(&codecOptions);
|
|
193
190
|
|
|
194
|
-
|
|
191
|
+
if (result < 0) {
|
|
192
|
+
return Result<NoneType, std::string>::Err(
|
|
193
|
+
"Failed to open FFmpeg codec with error: " + parseErrorCode(result));
|
|
194
|
+
}
|
|
195
195
|
|
|
196
|
-
return
|
|
196
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
199
|
+
/// @brief Initializes a new stream in the format context.
|
|
200
|
+
/// @returns Success status or Error status with message.
|
|
201
|
+
Result<NoneType, std::string> FFmpegAudioFileWriter::initializeStream() {
|
|
202
|
+
stream_ = avformat_new_stream(formatCtx_.get(), nullptr);
|
|
203
203
|
|
|
204
|
-
|
|
204
|
+
if (!stream_) {
|
|
205
|
+
return Result<NoneType, std::string>::Err("Failed to create new stream in format context");
|
|
206
|
+
}
|
|
205
207
|
|
|
206
|
-
|
|
207
|
-
encoderCtx_->frame_size > 0 ? encoderCtx_->frame_size : 512;
|
|
208
|
+
int result = avcodec_parameters_from_context(stream_->codecpar, encoderCtx_.get());
|
|
208
209
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
if (result < 0) {
|
|
211
|
+
return Result<NoneType, std::string>::Err(
|
|
212
|
+
"Failed to copy codec parameters to stream with error: " + parseErrorCode(result));
|
|
213
|
+
}
|
|
212
214
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
frame_->sample_rate = encoderCtx_->sample_rate;
|
|
215
|
+
stream_->time_base = AVRational{1, static_cast<int>(encoderCtx_->sample_rate)};
|
|
216
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
217
|
+
}
|
|
217
218
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
"Failed to allocate audio frame buffer during flushing");
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
219
|
+
/// @brief Opens the file and writes the basic header (depends on the codec/format used).
|
|
220
|
+
/// @returns Success status or Error status with message.
|
|
221
|
+
Result<NoneType, std::string> FFmpegAudioFileWriter::openIOAndWriteHeader() {
|
|
222
|
+
int result = 0;
|
|
225
223
|
|
|
226
|
-
|
|
227
|
-
|
|
224
|
+
if (!(formatCtx_->oformat->flags & AVFMT_NOFILE)) {
|
|
225
|
+
result = avio_open(&formatCtx_->pb, filePath_.c_str(), AVIO_FLAG_WRITE);
|
|
228
226
|
|
|
229
|
-
if (
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"FFmpegFileWriter",
|
|
233
|
-
"Failed to read audio samples from FIFO during flushing");
|
|
234
|
-
break;
|
|
227
|
+
if (result < 0) {
|
|
228
|
+
return Result<NoneType, std::string>::Err(
|
|
229
|
+
"Failed to open output file with error: " + parseErrorCode(result));
|
|
235
230
|
}
|
|
231
|
+
}
|
|
236
232
|
|
|
237
|
-
|
|
238
|
-
nextPts_ += chunkSize;
|
|
239
|
-
|
|
240
|
-
if (avcodec_send_frame(encoderCtx_.get(), frame_.get()) < 0) {
|
|
241
|
-
__android_log_print(
|
|
242
|
-
ANDROID_LOG_ERROR,
|
|
243
|
-
"FFmpegFileWriter",
|
|
244
|
-
"Failed to send audio frame to encoder during flushing");
|
|
245
|
-
av_frame_unref(frame_.get());
|
|
246
|
-
break;
|
|
247
|
-
}
|
|
233
|
+
result = avformat_write_header(formatCtx_.get(), nullptr);
|
|
248
234
|
|
|
249
|
-
|
|
235
|
+
if (result < 0) {
|
|
236
|
+
return Result<NoneType, std::string>::Err("Failed to write header to file: " + filePath_);
|
|
250
237
|
}
|
|
251
238
|
|
|
252
|
-
|
|
239
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
240
|
+
}
|
|
253
241
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
242
|
+
/// @brief Initializes the resampler context for audio conversion.
|
|
243
|
+
/// @param inputRate The sample rate of the input audio.
|
|
244
|
+
/// @param inputChannels The number of channels in the input audio.
|
|
245
|
+
/// @returns Success status or Error status with message.
|
|
246
|
+
Result<NoneType, std::string> FFmpegAudioFileWriter::initializeResampler(
|
|
247
|
+
float inputRate,
|
|
248
|
+
int inputChannels) {
|
|
249
|
+
resampleCtx_ = av_unique_ptr<SwrContext>(swr_alloc());
|
|
250
|
+
|
|
251
|
+
if (!resampleCtx_) {
|
|
252
|
+
return Result<NoneType, std::string>::Err("Failed to allocate resampler context");
|
|
262
253
|
}
|
|
263
254
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
ANDROID_LOG_ERROR,
|
|
267
|
-
"FFmpegFileWriter",
|
|
268
|
-
"Failed to write trailer to file: %s",
|
|
269
|
-
filePath_.c_str());
|
|
270
|
-
}
|
|
255
|
+
AVChannelLayout inChannelLayout;
|
|
256
|
+
av_channel_layout_default(&inChannelLayout, inputChannels);
|
|
271
257
|
|
|
272
|
-
|
|
273
|
-
|
|
258
|
+
av_opt_set_chlayout(resampleCtx_.get(), "in_chlayout", &inChannelLayout, 0);
|
|
259
|
+
av_opt_set_chlayout(resampleCtx_.get(), "out_chlayout", &encoderCtx_->ch_layout, 0);
|
|
274
260
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
261
|
+
av_opt_set_int(resampleCtx_.get(), "in_sample_rate", static_cast<int64_t>(inputRate), 0);
|
|
262
|
+
av_opt_set_int(resampleCtx_.get(), "out_sample_rate", encoderCtx_->sample_rate, 0);
|
|
278
263
|
|
|
279
|
-
resampleCtx_.
|
|
280
|
-
|
|
281
|
-
packet_.reset();
|
|
282
|
-
encoderCtx_.reset();
|
|
283
|
-
formatCtx_.reset();
|
|
284
|
-
audioFifo_.reset();
|
|
264
|
+
av_opt_set_sample_fmt(resampleCtx_.get(), "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
|
|
265
|
+
av_opt_set_sample_fmt(resampleCtx_.get(), "out_sample_fmt", encoderCtx_->sample_fmt, 0);
|
|
285
266
|
|
|
286
|
-
|
|
287
|
-
|
|
267
|
+
int result = swr_init(resampleCtx_.get());
|
|
268
|
+
|
|
269
|
+
if (result < 0) {
|
|
270
|
+
return Result<NoneType, std::string>::Err(
|
|
271
|
+
"Failed to initialize resampler for file: " + parseErrorCode(result));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
288
275
|
}
|
|
289
276
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
277
|
+
/// @brief Initializes frame and packet buffers as well as the audio FIFO,
|
|
278
|
+
/// that might be needed for storing intermediate audio data or buffering before encoding.
|
|
279
|
+
/// @param maxBufferSize The maximum buffer size to allocate.
|
|
280
|
+
void FFmpegAudioFileWriter::initializeBuffers(int32_t maxBufferSize) {
|
|
281
|
+
frame_ = av_unique_ptr<AVFrame>(av_frame_alloc());
|
|
282
|
+
packet_ = av_unique_ptr<AVPacket>(av_packet_alloc());
|
|
283
|
+
|
|
284
|
+
int frameRatio = defaultFrameRatio;
|
|
285
|
+
if (encoderCtx_->frame_size > 0) {
|
|
286
|
+
frameRatio = static_cast<int>(std::ceil(
|
|
287
|
+
static_cast<double>(maxBufferSize) / static_cast<double>(encoderCtx_->frame_size)));
|
|
293
288
|
}
|
|
294
289
|
|
|
295
|
-
int
|
|
296
|
-
|
|
290
|
+
int calculatedSize =
|
|
291
|
+
(encoderCtx_->frame_size > 0 ? encoderCtx_->frame_size * frameRatio
|
|
292
|
+
: maxBufferSize * frameRatio);
|
|
297
293
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
294
|
+
int fifoSize = std::max(calculatedSize, fallbackFIFOSize);
|
|
295
|
+
|
|
296
|
+
audioFifo_ = av_unique_ptr<AVAudioFifo>(
|
|
297
|
+
av_audio_fifo_alloc(encoderCtx_->sample_fmt, encoderCtx_->ch_layout.nb_channels, fifoSize));
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/// @brief Resamples input audio data and pushes it to the audio FIFO.
|
|
301
|
+
/// @param inputData Pointer to the input audio data.
|
|
302
|
+
/// @param inputFrameCount Number of input frames.
|
|
303
|
+
/// @returns True if successful, false otherwise.
|
|
304
|
+
bool FFmpegAudioFileWriter::resampleAndPushToFifo(void *inputData, int inputFrameCount) {
|
|
305
|
+
int result = 0;
|
|
306
|
+
int64_t outputLength = av_rescale_rnd(
|
|
307
|
+
inputFrameCount, encoderCtx_->sample_rate, static_cast<int>(streamSampleRate_), AV_ROUND_UP);
|
|
302
308
|
|
|
303
|
-
|
|
304
|
-
__android_log_print(
|
|
305
|
-
ANDROID_LOG_ERROR,
|
|
306
|
-
"FFmpegFileWriter",
|
|
307
|
-
"Failed to allocate audio frame buffer, outputLength: %d, format: %d, sample_rate: %d, channels: %d",
|
|
308
|
-
outputLength,
|
|
309
|
-
encoderCtx_->sample_fmt,
|
|
310
|
-
encoderCtx_->sample_rate,
|
|
311
|
-
encoderCtx_->ch_layout.nb_channels);
|
|
309
|
+
result = prepareFrameForEncoding(outputLength);
|
|
312
310
|
|
|
311
|
+
if (result < 0) {
|
|
312
|
+
invokeOnErrorCallback("Failed to prepare frame for resampling: " + parseErrorCode(result));
|
|
313
313
|
return false;
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
-
const uint8_t *
|
|
316
|
+
const uint8_t *inputs[1] = {reinterpret_cast<const uint8_t *>(inputData)};
|
|
317
317
|
|
|
318
318
|
int convertedSamples = swr_convert(
|
|
319
|
-
resampleCtx_.get(), frame_->data, outputLength,
|
|
319
|
+
resampleCtx_.get(), frame_->data, static_cast<int>(outputLength), inputs, inputFrameCount);
|
|
320
320
|
|
|
321
321
|
if (convertedSamples < 0) {
|
|
322
|
-
|
|
323
|
-
ANDROID_LOG_ERROR,
|
|
324
|
-
"FFmpegFileWriter",
|
|
325
|
-
"Failed to convert audio samples for file: %s",
|
|
326
|
-
filePath_.c_str());
|
|
322
|
+
invokeOnErrorCallback("Failed to convert audio samples: " + parseErrorCode(convertedSamples));
|
|
327
323
|
av_frame_unref(frame_.get());
|
|
328
324
|
return false;
|
|
329
325
|
}
|
|
330
326
|
|
|
331
|
-
int
|
|
332
|
-
audioFifo_.get(),
|
|
327
|
+
int written = av_audio_fifo_write(
|
|
328
|
+
audioFifo_.get(), reinterpret_cast<void **>(frame_->data), convertedSamples);
|
|
333
329
|
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
ANDROID_LOG_ERROR,
|
|
337
|
-
"FFmpegFileWriter",
|
|
338
|
-
"Failed to write audio samples to FIFO");
|
|
330
|
+
if (written < convertedSamples) {
|
|
331
|
+
invokeOnErrorCallback("Failed to write all samples to FIFO");
|
|
339
332
|
av_frame_unref(frame_.get());
|
|
340
333
|
return false;
|
|
341
334
|
}
|
|
342
335
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
encoderCtx_->frame_size > 0 ? encoderCtx_->frame_size : 512;
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
346
338
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
339
|
+
/// @brief pushes the audio data from FIFO to the encoder in chunks,
|
|
340
|
+
// defined by the encoder (512 samples by default) or flushes the FIFO if requested.
|
|
341
|
+
/// Note: flush might be called only when writing the final data batch, otherwise
|
|
342
|
+
// the codec will crash (especially in case of defined size frames like AAC).
|
|
343
|
+
/// @param flush Indicates whether to flush the FIFO.
|
|
344
|
+
/// @returns 0 on success, -1 or AV_ERROR code on failure
|
|
345
|
+
int FFmpegAudioFileWriter::processFifo(bool flush) {
|
|
346
|
+
int result = 0;
|
|
347
|
+
int frameSize = encoderCtx_->frame_size > 0 ? encoderCtx_->frame_size : 512;
|
|
348
|
+
|
|
349
|
+
while (av_audio_fifo_size(audioFifo_.get()) >= (flush ? 1 : frameSize)) {
|
|
350
|
+
const int chunkSize = std::min(av_audio_fifo_size(audioFifo_.get()), frameSize);
|
|
351
|
+
|
|
352
|
+
if (prepareFrameForEncoding(chunkSize) < 0) {
|
|
353
|
+
invokeOnErrorCallback("Failed to prepare frame for encoding");
|
|
354
|
+
return -1;
|
|
355
|
+
}
|
|
352
356
|
|
|
353
|
-
if (
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
"Failed to allocate audio frame buffer");
|
|
358
|
-
return false;
|
|
357
|
+
if (av_audio_fifo_read(audioFifo_.get(), reinterpret_cast<void **>(frame_->data), chunkSize) !=
|
|
358
|
+
chunkSize) {
|
|
359
|
+
invokeOnErrorCallback("Failed to read data from FIFO");
|
|
360
|
+
return -1;
|
|
359
361
|
}
|
|
360
362
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
+
frame_->pts = nextPts_;
|
|
364
|
+
nextPts_ += chunkSize;
|
|
365
|
+
|
|
366
|
+
result = avcodec_send_frame(encoderCtx_.get(), frame_.get());
|
|
363
367
|
|
|
364
|
-
if (
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
"FFmpegFileWriter",
|
|
368
|
-
"Failed to read audio samples from FIFO");
|
|
369
|
-
return false;
|
|
368
|
+
if (result < 0) {
|
|
369
|
+
invokeOnErrorCallback("Failed to send frame to encoder: " + parseErrorCode(result));
|
|
370
|
+
return result;
|
|
370
371
|
}
|
|
371
372
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
ANDROID_LOG_ERROR,
|
|
378
|
-
"FFmpegFileWriter",
|
|
379
|
-
"Failed to send audio frame to encoder");
|
|
380
|
-
av_frame_unref(frame_.get());
|
|
381
|
-
return false;
|
|
373
|
+
result = writeEncodedPackets();
|
|
374
|
+
|
|
375
|
+
if (result < 0) {
|
|
376
|
+
invokeOnErrorCallback("Failed to write encoded packets: " + parseErrorCode(result));
|
|
377
|
+
return result;
|
|
382
378
|
}
|
|
379
|
+
}
|
|
383
380
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
381
|
+
return 0;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/// @brief Takes ready encoded packets from the encoder and writes them to the output file.
|
|
385
|
+
/// Also in order to optimize file writing vs file resilience from crashes, it periodically
|
|
386
|
+
/// forces the AVIO buffer to flush data to disk, by default every 0,5 second.
|
|
387
|
+
/// @returns 0 on success, AV_ERROR code on failure
|
|
388
|
+
int FFmpegAudioFileWriter::writeEncodedPackets() {
|
|
389
|
+
int result = 0;
|
|
390
|
+
|
|
391
|
+
while (true) {
|
|
392
|
+
result = avcodec_receive_packet(encoderCtx_.get(), packet_.get());
|
|
393
|
+
|
|
394
|
+
if (result == AVERROR(EAGAIN) || result == AVERROR_EOF) {
|
|
395
|
+
return 0;
|
|
396
|
+
} else if (result < 0) {
|
|
397
|
+
invokeOnErrorCallback("Failed to receive packet from encoder: " + parseErrorCode(result));
|
|
398
|
+
return result;
|
|
399
|
+
}
|
|
389
400
|
|
|
390
|
-
|
|
401
|
+
av_packet_rescale_ts(packet_.get(), encoderCtx_->time_base, stream_->time_base);
|
|
402
|
+
packet_->stream_index = stream_->index;
|
|
391
403
|
|
|
392
|
-
|
|
393
|
-
__android_log_print(
|
|
394
|
-
ANDROID_LOG_ERROR,
|
|
395
|
-
"FFmpegFileWriter",
|
|
396
|
-
"Failed to write audio packet to file");
|
|
404
|
+
result = av_interleaved_write_frame(formatCtx_.get(), packet_.get());
|
|
397
405
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
}
|
|
406
|
+
auto now = std::chrono::steady_clock::now();
|
|
407
|
+
auto elapsedMs =
|
|
408
|
+
std::chrono::duration_cast<std::chrono::milliseconds>(now - lastFlushTime_).count();
|
|
402
409
|
|
|
403
|
-
|
|
410
|
+
if (formatCtx_->pb && elapsedMs >= flushIntervalMs_) {
|
|
411
|
+
avio_flush(formatCtx_->pb);
|
|
412
|
+
lastFlushTime_ = now;
|
|
404
413
|
}
|
|
405
414
|
|
|
415
|
+
if (result < 0) {
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/// @brief Prepares the frame for next encoding phase,
|
|
422
|
+
/// if frame is same size as previously used one (99.9% cases) try to reuse it.
|
|
423
|
+
/// Otherwise resize the frame and in the worst case allocate new frame to use.
|
|
424
|
+
/// @param samplesToRead Number of samples to prepare the frame for.
|
|
425
|
+
/// @returns 0 on success, AV_ERROR code on failure
|
|
426
|
+
int FFmpegAudioFileWriter::prepareFrameForEncoding(int64_t samplesToRead) {
|
|
427
|
+
int result = 0;
|
|
428
|
+
|
|
429
|
+
if (frame_->data[0] && frame_->nb_samples == samplesToRead &&
|
|
430
|
+
av_frame_is_writable(frame_.get())) {
|
|
431
|
+
return 0;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
frame_->nb_samples = static_cast<int>(samplesToRead);
|
|
435
|
+
frame_->format = encoderCtx_->sample_fmt;
|
|
436
|
+
frame_->sample_rate = encoderCtx_->sample_rate;
|
|
437
|
+
|
|
438
|
+
if (av_channel_layout_compare(&frame_->ch_layout, &encoderCtx_->ch_layout) != 0) {
|
|
439
|
+
av_channel_layout_uninit(&frame_->ch_layout);
|
|
440
|
+
|
|
441
|
+
result = av_channel_layout_copy(&frame_->ch_layout, &encoderCtx_->ch_layout);
|
|
442
|
+
|
|
443
|
+
if (result < 0) {
|
|
444
|
+
invokeOnErrorCallback("Failed to copy channel layout: " + parseErrorCode(result));
|
|
445
|
+
return result;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
result = av_frame_make_writable(frame_.get());
|
|
450
|
+
|
|
451
|
+
if (result < 0) {
|
|
406
452
|
av_frame_unref(frame_.get());
|
|
453
|
+
|
|
454
|
+
frame_->nb_samples = static_cast<int>(samplesToRead);
|
|
455
|
+
;
|
|
456
|
+
frame_->format = encoderCtx_->sample_fmt;
|
|
457
|
+
frame_->sample_rate = encoderCtx_->sample_rate;
|
|
458
|
+
av_channel_layout_copy(&frame_->ch_layout, &encoderCtx_->ch_layout);
|
|
459
|
+
|
|
460
|
+
result = av_frame_get_buffer(frame_.get(), 0);
|
|
407
461
|
}
|
|
408
462
|
|
|
409
|
-
|
|
410
|
-
return true;
|
|
463
|
+
return result;
|
|
411
464
|
}
|
|
412
465
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
466
|
+
/// @brief Closes the currently opened audio file, flushing any remaining data and finalizing the file.
|
|
467
|
+
/// Method checks the file size and duration for convenience.
|
|
468
|
+
/// @returns CloseFileResult indicating success or error details
|
|
469
|
+
CloseFileResult FFmpegAudioFileWriter::finalizeOutput() {
|
|
470
|
+
int result = av_write_trailer(formatCtx_.get());
|
|
416
471
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
472
|
+
if (result < 0) {
|
|
473
|
+
return CloseFileResult::Err("Failed to write trailer: " + parseErrorCode(result));
|
|
474
|
+
}
|
|
420
475
|
|
|
421
|
-
|
|
422
|
-
return isFileOpen_.load();
|
|
423
|
-
}
|
|
476
|
+
double fileSizeInMB = 0;
|
|
424
477
|
|
|
425
|
-
|
|
426
|
-
|
|
478
|
+
if (formatCtx_->pb) {
|
|
479
|
+
fileSizeInMB = static_cast<double>(avio_size(formatCtx_->pb)) / MB_IN_BYTES;
|
|
480
|
+
avio_closep(&formatCtx_->pb);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
double durationInSeconds = getCurrentDuration();
|
|
484
|
+
|
|
485
|
+
filePath_ = "";
|
|
486
|
+
isFileOpen_.store(false, std::memory_order_release);
|
|
487
|
+
|
|
488
|
+
return CloseFileResult::Ok({fileSizeInMB, durationInSeconds});
|
|
427
489
|
}
|
|
428
490
|
|
|
429
|
-
} // namespace audioapi
|
|
491
|
+
} // namespace audioapi::android::ffmpeg
|
|
492
|
+
|
|
493
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|