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
|
@@ -7,38 +7,56 @@
|
|
|
7
7
|
#include <audioapi/utils/AudioBus.h>
|
|
8
8
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
9
9
|
|
|
10
|
+
#include <algorithm>
|
|
10
11
|
#include <memory>
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <unordered_map>
|
|
11
14
|
|
|
12
15
|
namespace audioapi {
|
|
13
16
|
|
|
17
|
+
/// @brief Constructor
|
|
18
|
+
/// Allocates circular buffer (as every property to do so is already known at this point).
|
|
19
|
+
/// @param audioEventHandlerRegistry The audio event handler registry
|
|
20
|
+
/// @param sampleRate The user desired sample rate
|
|
21
|
+
/// @param bufferLength The user desired buffer length
|
|
22
|
+
/// @param channelCount The user desired channel count
|
|
23
|
+
/// @param callbackId The callback identifier
|
|
14
24
|
AndroidRecorderCallback::AndroidRecorderCallback(
|
|
15
25
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
16
26
|
float sampleRate,
|
|
17
27
|
size_t bufferLength,
|
|
18
|
-
|
|
28
|
+
int channelCount,
|
|
19
29
|
uint64_t callbackId)
|
|
20
|
-
:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
circularBus_.resize(channelCount_);
|
|
27
|
-
|
|
28
|
-
for (size_t i = 0; i < channelCount_; ++i) {
|
|
29
|
-
auto busArray = std::make_shared<CircularAudioArray>(ringBufferSize_);
|
|
30
|
-
circularBus_[i] = busArray;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
30
|
+
: AudioRecorderCallback(
|
|
31
|
+
audioEventHandlerRegistry,
|
|
32
|
+
sampleRate,
|
|
33
|
+
bufferLength,
|
|
34
|
+
channelCount,
|
|
35
|
+
callbackId) {}
|
|
33
36
|
|
|
34
37
|
AndroidRecorderCallback::~AndroidRecorderCallback() {
|
|
38
|
+
if (converter_ != nullptr) {
|
|
39
|
+
ma_data_converter_uninit(converter_.get(), NULL);
|
|
40
|
+
converter_.reset();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (processingBuffer_ != nullptr) {
|
|
44
|
+
ma_free(processingBuffer_, NULL);
|
|
45
|
+
processingBuffer_ = nullptr;
|
|
46
|
+
processingBufferLength_ = 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
35
49
|
for (size_t i = 0; i < circularBus_.size(); ++i) {
|
|
36
|
-
circularBus_[i]
|
|
50
|
+
circularBus_[i]->zero();
|
|
37
51
|
}
|
|
38
52
|
}
|
|
39
53
|
|
|
40
|
-
|
|
41
|
-
|
|
54
|
+
/// @brief Prepares the recorder callback by initializing the data converter and allocating necessary buffers.
|
|
55
|
+
/// @param streamSampleRate The sample rate of the incoming audio stream.
|
|
56
|
+
/// @param streamChannelCount The channel count of the incoming audio stream.
|
|
57
|
+
/// @param maxInputBufferLength The maximum buffer length of the incoming audio stream.
|
|
58
|
+
Result<NoneType, std::string> AndroidRecorderCallback::prepare(
|
|
59
|
+
float streamSampleRate,
|
|
42
60
|
int32_t streamChannelCount,
|
|
43
61
|
size_t maxInputBufferLength) {
|
|
44
62
|
ma_result result;
|
|
@@ -59,27 +77,34 @@ void AndroidRecorderCallback::prepare(
|
|
|
59
77
|
result = ma_data_converter_init(&converterConfig, NULL, converter_.get());
|
|
60
78
|
|
|
61
79
|
if (result != MA_SUCCESS) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
80
|
+
return Result<NoneType, std::string>::Err(
|
|
81
|
+
"Failed to initialize miniaudio data converter" +
|
|
82
|
+
std::string(ma_result_description(result)));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (streamSampleRate_ <= 0 || streamChannelCount_ <= 0) {
|
|
86
|
+
return Result<NoneType, std::string>::Err("Invalid stream sample rate or channel count");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (sampleRate_ <= 0 || channelCount_ <= 0) {
|
|
90
|
+
return Result<NoneType, std::string>::Err("Invalid callback sample rate or channel count");
|
|
67
91
|
}
|
|
68
92
|
|
|
69
93
|
ma_data_converter_get_expected_output_frame_count(
|
|
70
94
|
converter_.get(), maxInputBufferLength_, &processingBufferLength_);
|
|
71
95
|
|
|
72
|
-
processingBufferLength_ =
|
|
73
|
-
std::max(processingBufferLength_, (ma_uint64)maxInputBufferLength_);
|
|
96
|
+
processingBufferLength_ = std::max(processingBufferLength_, (ma_uint64)maxInputBufferLength_);
|
|
74
97
|
|
|
75
98
|
deinterleavingArray_ = std::make_shared<AudioArray>(processingBufferLength_);
|
|
76
99
|
processingBuffer_ = ma_malloc(
|
|
77
|
-
processingBufferLength_ * channelCount_ *
|
|
78
|
-
|
|
79
|
-
|
|
100
|
+
processingBufferLength_ * channelCount_ * ma_get_bytes_per_sample(ma_format_f32), NULL);
|
|
101
|
+
|
|
102
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
80
103
|
}
|
|
81
104
|
|
|
82
105
|
void AndroidRecorderCallback::cleanup() {
|
|
106
|
+
emitAudioData(true);
|
|
107
|
+
|
|
83
108
|
if (converter_ != nullptr) {
|
|
84
109
|
ma_data_converter_uninit(converter_.get(), NULL);
|
|
85
110
|
converter_.reset();
|
|
@@ -92,17 +117,25 @@ void AndroidRecorderCallback::cleanup() {
|
|
|
92
117
|
}
|
|
93
118
|
|
|
94
119
|
for (size_t i = 0; i < circularBus_.size(); ++i) {
|
|
95
|
-
circularBus_[i]
|
|
120
|
+
circularBus_[i]->zero();
|
|
96
121
|
}
|
|
97
122
|
}
|
|
98
123
|
|
|
124
|
+
/// @brief Receives audio data from the recorder, processes it (resampling and deinterleaving if necessary),
|
|
125
|
+
/// and pushes it into the circular buffer.
|
|
126
|
+
/// @param data Pointer to the incoming audio data.
|
|
127
|
+
/// @param numFrames Number of frames in the incoming audio data.
|
|
99
128
|
void AndroidRecorderCallback::receiveAudioData(void *data, int numFrames) {
|
|
129
|
+
if (!isInitialized_.load(std::memory_order_acquire)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
100
133
|
ma_uint64 inputFrameCount = numFrames;
|
|
101
134
|
ma_uint64 outputFrameCount = 0;
|
|
102
135
|
|
|
103
|
-
if ((
|
|
136
|
+
if (static_cast<float>(streamSampleRate_) == sampleRate_ &&
|
|
104
137
|
streamChannelCount_ == channelCount_) {
|
|
105
|
-
|
|
138
|
+
deinterleaveAndPushAudioData(data, numFrames);
|
|
106
139
|
emitAudioData();
|
|
107
140
|
return;
|
|
108
141
|
}
|
|
@@ -111,77 +144,27 @@ void AndroidRecorderCallback::receiveAudioData(void *data, int numFrames) {
|
|
|
111
144
|
converter_.get(), inputFrameCount, &outputFrameCount);
|
|
112
145
|
|
|
113
146
|
ma_data_converter_process_pcm_frames(
|
|
114
|
-
converter_.get(),
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
processingBuffer_,
|
|
118
|
-
&outputFrameCount);
|
|
119
|
-
|
|
120
|
-
deinterleaveAndWriteAudioData(
|
|
121
|
-
processingBuffer_, static_cast<int>(outputFrameCount));
|
|
147
|
+
converter_.get(), data, &inputFrameCount, processingBuffer_, &outputFrameCount);
|
|
148
|
+
|
|
149
|
+
deinterleaveAndPushAudioData(processingBuffer_, static_cast<int>(outputFrameCount));
|
|
122
150
|
emitAudioData();
|
|
123
151
|
}
|
|
124
152
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
153
|
+
/// @brief Deinterleaves the audio data and pushes it into the circular buffer.
|
|
154
|
+
/// @param data Pointer to the interleaved audio data.
|
|
155
|
+
/// @param numFrames Number of frames in the audio data.
|
|
156
|
+
void AndroidRecorderCallback::deinterleaveAndPushAudioData(void *data, int numFrames) {
|
|
128
157
|
auto *inputData = static_cast<float *>(data);
|
|
129
158
|
|
|
130
|
-
for (
|
|
159
|
+
for (int channel = 0; channel < channelCount_; ++channel) {
|
|
131
160
|
float *channelData = deinterleavingArray_->getData();
|
|
132
161
|
|
|
133
162
|
for (int frame = 0; frame < numFrames; ++frame) {
|
|
134
|
-
channelData[frame] = inputData[frame *
|
|
163
|
+
channelData[frame] = inputData[frame * channelCount_ + channel];
|
|
135
164
|
}
|
|
136
165
|
|
|
137
166
|
circularBus_[channel]->push_back(channelData, numFrames);
|
|
138
167
|
}
|
|
139
168
|
}
|
|
140
169
|
|
|
141
|
-
void AndroidRecorderCallback::emitAudioData() {
|
|
142
|
-
while (circularBus_[0]->getNumberOfAvailableFrames() >= bufferLength_) {
|
|
143
|
-
auto bus =
|
|
144
|
-
std::make_shared<AudioBus>(bufferLength_, channelCount_, sampleRate_);
|
|
145
|
-
|
|
146
|
-
for (int i = 0; i < channelCount_; ++i) {
|
|
147
|
-
auto *outputChannel = bus->getChannel(i)->getData();
|
|
148
|
-
circularBus_[i]->pop_front(outputChannel, bufferLength_);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
invokeCallback(bus, (int)bufferLength_);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
void AndroidRecorderCallback::invokeCallback(
|
|
156
|
-
const std::shared_ptr<AudioBus> &bus,
|
|
157
|
-
int numFrames) {
|
|
158
|
-
auto audioBuffer = std::make_shared<AudioBuffer>(bus);
|
|
159
|
-
auto audioBufferHostObject =
|
|
160
|
-
std::make_shared<AudioBufferHostObject>(audioBuffer);
|
|
161
|
-
|
|
162
|
-
std::unordered_map<std::string, EventValue> eventPayload = {};
|
|
163
|
-
eventPayload.insert({"buffer", audioBufferHostObject});
|
|
164
|
-
eventPayload.insert({"numFrames", numFrames});
|
|
165
|
-
|
|
166
|
-
if (audioEventHandlerRegistry_) {
|
|
167
|
-
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
168
|
-
"audioReady", callbackId_, eventPayload);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
void AndroidRecorderCallback::sendRemainingData() {
|
|
173
|
-
auto numberOfFrames = circularBus_[0]->getNumberOfAvailableFrames();
|
|
174
|
-
auto bus = std::make_shared<AudioBus>(
|
|
175
|
-
circularBus_[0]->getNumberOfAvailableFrames(),
|
|
176
|
-
channelCount_,
|
|
177
|
-
sampleRate_);
|
|
178
|
-
|
|
179
|
-
for (int i = 0; i < channelCount_; ++i) {
|
|
180
|
-
auto *outputChannel = bus->getChannel(i)->getData();
|
|
181
|
-
circularBus_[i]->pop_front(outputChannel, numberOfFrames);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
invokeCallback(bus, (int)numberOfFrames);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
170
|
} // namespace audioapi
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
#include <audioapi/libs/miniaudio/miniaudio.h>
|
|
5
|
+
#include <audioapi/core/utils/AudioRecorderCallback.h>
|
|
5
6
|
#include <memory>
|
|
6
7
|
#include <vector>
|
|
8
|
+
#include <string>
|
|
7
9
|
|
|
8
10
|
namespace audioapi {
|
|
9
11
|
|
|
@@ -12,46 +14,33 @@ class AudioArray;
|
|
|
12
14
|
class CircularAudioArray;
|
|
13
15
|
class AudioEventHandlerRegistry;
|
|
14
16
|
|
|
15
|
-
class AndroidRecorderCallback {
|
|
17
|
+
class AndroidRecorderCallback : public AudioRecorderCallback {
|
|
16
18
|
public:
|
|
17
19
|
AndroidRecorderCallback(
|
|
18
20
|
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
19
21
|
float sampleRate,
|
|
20
22
|
size_t bufferLength,
|
|
21
|
-
|
|
23
|
+
int channelCount,
|
|
22
24
|
uint64_t callbackId);
|
|
23
25
|
~AndroidRecorderCallback();
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
void cleanup();
|
|
27
|
+
Result<NoneType, std::string> prepare(float streamSampleRate, int streamChannelCount, size_t maxInputBufferLength);
|
|
28
|
+
void cleanup() override;
|
|
27
29
|
|
|
28
30
|
void receiveAudioData(void *data, int numFrames);
|
|
29
|
-
void emitAudioData();
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
protected:
|
|
33
|
+
float streamSampleRate_{0.0};
|
|
34
|
+
int streamChannelCount_{0};
|
|
35
|
+
size_t maxInputBufferLength_{0};
|
|
33
36
|
|
|
34
|
-
private:
|
|
35
|
-
int32_t streamSampleRate_;
|
|
36
|
-
int32_t streamChannelCount_;
|
|
37
|
-
size_t maxInputBufferLength_;
|
|
38
|
-
|
|
39
|
-
float sampleRate_;
|
|
40
|
-
size_t bufferLength_;
|
|
41
|
-
size_t channelCount_;
|
|
42
|
-
uint64_t callbackId_;
|
|
43
|
-
size_t ringBufferSize_;
|
|
44
|
-
|
|
45
|
-
ma_uint64 processingBufferLength_{0};
|
|
46
37
|
void *processingBuffer_{nullptr};
|
|
47
|
-
|
|
38
|
+
ma_uint64 processingBufferLength_{0};
|
|
48
39
|
std::unique_ptr<ma_data_converter> converter_{nullptr};
|
|
49
40
|
|
|
50
|
-
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
51
|
-
std::vector<std::shared_ptr<CircularAudioArray>> circularBus_;
|
|
52
41
|
std::shared_ptr<AudioArray> deinterleavingArray_;
|
|
53
42
|
|
|
54
|
-
void
|
|
43
|
+
void deinterleaveAndPushAudioData(void *data, int numFrames);
|
|
55
44
|
};
|
|
56
45
|
|
|
57
46
|
} // namespace audioapi
|
|
@@ -11,17 +11,21 @@
|
|
|
11
11
|
|
|
12
12
|
#ifndef AUDIO_API_TEST_SUITE
|
|
13
13
|
#include <android/log.h>
|
|
14
|
+
#endif // AUDIO_API_TEST_SUITE
|
|
15
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
14
16
|
#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
|
|
15
|
-
#endif
|
|
17
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
18
|
+
|
|
19
|
+
#include <memory>
|
|
20
|
+
#include <string>
|
|
21
|
+
#include <vector>
|
|
16
22
|
|
|
17
23
|
namespace audioapi {
|
|
18
24
|
|
|
19
25
|
// Decoding audio in fixed-size chunks because total frame count can't be
|
|
20
26
|
// determined in advance. Note: ma_decoder_get_length_in_pcm_frames() always
|
|
21
27
|
// returns 0 for Vorbis decoders.
|
|
22
|
-
std::vector<float> AudioDecoder::readAllPcmFrames(
|
|
23
|
-
ma_decoder &decoder,
|
|
24
|
-
int outputChannels) {
|
|
28
|
+
std::vector<float> AudioDecoder::readAllPcmFrames(ma_decoder &decoder, int outputChannels) {
|
|
25
29
|
std::vector<float> buffer;
|
|
26
30
|
std::vector<float> temp(CHUNK_SIZE * outputChannels);
|
|
27
31
|
ma_uint64 outFramesRead = 0;
|
|
@@ -29,16 +33,12 @@ std::vector<float> AudioDecoder::readAllPcmFrames(
|
|
|
29
33
|
#ifndef AUDIO_API_TEST_SUITE
|
|
30
34
|
while (true) {
|
|
31
35
|
ma_uint64 tempFramesDecoded = 0;
|
|
32
|
-
ma_decoder_read_pcm_frames(
|
|
33
|
-
&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);
|
|
36
|
+
ma_decoder_read_pcm_frames(&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);
|
|
34
37
|
if (tempFramesDecoded == 0) {
|
|
35
38
|
break;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
buffer.insert(
|
|
39
|
-
buffer.end(),
|
|
40
|
-
temp.data(),
|
|
41
|
-
temp.data() + tempFramesDecoded * outputChannels);
|
|
41
|
+
buffer.insert(buffer.end(), temp.data(), temp.data() + tempFramesDecoded * outputChannels);
|
|
42
42
|
outFramesRead += tempFramesDecoded;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -58,8 +58,7 @@ std::shared_ptr<AudioBuffer> AudioDecoder::makeAudioBufferFromFloatBuffer(
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
auto outputFrames = buffer.size() / outputChannels;
|
|
61
|
-
auto audioBus = std::make_shared<AudioBus>(
|
|
62
|
-
outputFrames, outputChannels, outputSampleRate);
|
|
61
|
+
auto audioBus = std::make_shared<AudioBus>(outputFrames, outputChannels, outputSampleRate);
|
|
63
62
|
|
|
64
63
|
for (int ch = 0; ch < outputChannels; ++ch) {
|
|
65
64
|
auto channelData = audioBus->getChannel(ch)->getData();
|
|
@@ -75,29 +74,37 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(
|
|
|
75
74
|
float sampleRate) {
|
|
76
75
|
#ifndef AUDIO_API_TEST_SUITE
|
|
77
76
|
if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
78
|
+
auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
|
|
80
79
|
if (buffer == nullptr) {
|
|
81
80
|
__android_log_print(
|
|
82
|
-
ANDROID_LOG_ERROR,
|
|
83
|
-
"AudioDecoder",
|
|
84
|
-
"Failed to decode with FFmpeg: %s",
|
|
85
|
-
path.c_str());
|
|
81
|
+
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg: %s", path.c_str());
|
|
86
82
|
return nullptr;
|
|
87
83
|
}
|
|
88
84
|
return buffer;
|
|
85
|
+
#else
|
|
86
|
+
__android_log_print(
|
|
87
|
+
ANDROID_LOG_ERROR,
|
|
88
|
+
"AudioDecoder",
|
|
89
|
+
"FFmpeg is disabled, cannot decode file: %s",
|
|
90
|
+
path.c_str());
|
|
91
|
+
return nullptr;
|
|
92
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
89
93
|
}
|
|
90
94
|
ma_decoder decoder;
|
|
91
|
-
ma_decoder_config config =
|
|
92
|
-
ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
95
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
93
96
|
ma_decoding_backend_vtable *customBackends[] = {
|
|
94
97
|
ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
95
98
|
|
|
96
99
|
config.ppCustomBackendVTables = customBackends;
|
|
97
|
-
config.customBackendCount =
|
|
98
|
-
sizeof(customBackends) / sizeof(customBackends[0]);
|
|
100
|
+
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
99
101
|
|
|
100
102
|
if (ma_decoder_init_file(path.c_str(), &config, &decoder) != MA_SUCCESS) {
|
|
103
|
+
__android_log_print(
|
|
104
|
+
ANDROID_LOG_ERROR,
|
|
105
|
+
"AudioDecoder",
|
|
106
|
+
"Failed to initialize decoder for file: %s",
|
|
107
|
+
path.c_str());
|
|
101
108
|
ma_decoder_uninit(&decoder);
|
|
102
109
|
return nullptr;
|
|
103
110
|
}
|
|
@@ -107,46 +114,42 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(
|
|
|
107
114
|
|
|
108
115
|
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
109
116
|
ma_decoder_uninit(&decoder);
|
|
110
|
-
return makeAudioBufferFromFloatBuffer(
|
|
111
|
-
buffer, outputSampleRate, outputChannels);
|
|
117
|
+
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
112
118
|
#else
|
|
113
119
|
return nullptr;
|
|
114
120
|
#endif
|
|
115
121
|
}
|
|
116
122
|
|
|
117
|
-
std::shared_ptr<AudioBuffer>
|
|
118
|
-
|
|
119
|
-
size_t size,
|
|
120
|
-
float sampleRate) {
|
|
123
|
+
std::shared_ptr<AudioBuffer>
|
|
124
|
+
AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate) {
|
|
121
125
|
#ifndef AUDIO_API_TEST_SUITE
|
|
122
126
|
const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
|
|
123
|
-
if (format == AudioFormat::MP4 || format == AudioFormat::M4A ||
|
|
124
|
-
|
|
125
|
-
auto buffer = ffmpegdecoder::decodeWithMemoryBlock(
|
|
126
|
-
data, size, static_cast<int>(sampleRate));
|
|
127
|
+
if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
|
|
128
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
129
|
+
auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));
|
|
127
130
|
if (buffer == nullptr) {
|
|
128
|
-
__android_log_print(
|
|
129
|
-
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg");
|
|
131
|
+
__android_log_print(ANDROID_LOG_ERROR, "AudioDecoder", "Failed to decode with FFmpeg");
|
|
130
132
|
return nullptr;
|
|
131
133
|
}
|
|
132
134
|
return buffer;
|
|
135
|
+
#else
|
|
136
|
+
__android_log_print(
|
|
137
|
+
ANDROID_LOG_ERROR, "AudioDecoder", "FFmpeg is disabled, cannot decode memory block");
|
|
138
|
+
return nullptr;
|
|
139
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
133
140
|
}
|
|
134
141
|
ma_decoder decoder;
|
|
135
|
-
ma_decoder_config config =
|
|
136
|
-
ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
142
|
+
ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
|
|
137
143
|
|
|
138
144
|
ma_decoding_backend_vtable *customBackends[] = {
|
|
139
145
|
ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
|
|
140
146
|
|
|
141
147
|
config.ppCustomBackendVTables = customBackends;
|
|
142
|
-
config.customBackendCount =
|
|
143
|
-
sizeof(customBackends) / sizeof(customBackends[0]);
|
|
148
|
+
config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
|
|
144
149
|
|
|
145
150
|
if (ma_decoder_init_memory(data, size, &config, &decoder) != MA_SUCCESS) {
|
|
146
151
|
__android_log_print(
|
|
147
|
-
ANDROID_LOG_ERROR,
|
|
148
|
-
"AudioDecoder",
|
|
149
|
-
"Failed to initialize decoder for memory block");
|
|
152
|
+
ANDROID_LOG_ERROR, "AudioDecoder", "Failed to initialize decoder for memory block");
|
|
150
153
|
ma_decoder_uninit(&decoder);
|
|
151
154
|
return nullptr;
|
|
152
155
|
}
|
|
@@ -156,8 +159,7 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithMemoryBlock(
|
|
|
156
159
|
|
|
157
160
|
std::vector<float> buffer = readAllPcmFrames(decoder, outputChannels);
|
|
158
161
|
ma_decoder_uninit(&decoder);
|
|
159
|
-
return makeAudioBufferFromFloatBuffer(
|
|
160
|
-
buffer, outputSampleRate, outputChannels);
|
|
162
|
+
return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
|
|
161
163
|
#else
|
|
162
164
|
return nullptr;
|
|
163
165
|
#endif
|
|
@@ -170,11 +172,9 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithPCMInBase64(
|
|
|
170
172
|
bool interleaved) {
|
|
171
173
|
auto decodedData = base64_decode(data, false);
|
|
172
174
|
const auto uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());
|
|
173
|
-
size_t numFramesDecoded =
|
|
174
|
-
decodedData.size() / (inputChannelCount * sizeof(int16_t));
|
|
175
|
+
size_t numFramesDecoded = decodedData.size() / (inputChannelCount * sizeof(int16_t));
|
|
175
176
|
|
|
176
|
-
auto audioBus = std::make_shared<AudioBus>(
|
|
177
|
-
numFramesDecoded, inputChannelCount, inputSampleRate);
|
|
177
|
+
auto audioBus = std::make_shared<AudioBus>(numFramesDecoded, inputChannelCount, inputSampleRate);
|
|
178
178
|
|
|
179
179
|
for (int ch = 0; ch < inputChannelCount; ++ch) {
|
|
180
180
|
auto channelData = audioBus->getChannel(ch)->getData();
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#include <android/log.h>
|
|
2
|
+
#include <audioapi/android/core/utils/FileOptions.h>
|
|
3
|
+
#include <audioapi/android/system/NativeFileInfo.hpp>
|
|
4
|
+
#include <audioapi/utils/AudioFileProperties.h>
|
|
5
|
+
#include <chrono>
|
|
6
|
+
#include <filesystem>
|
|
7
|
+
#include <format>
|
|
8
|
+
#include <iostream>
|
|
9
|
+
#include <memory>
|
|
10
|
+
#include <string>
|
|
11
|
+
|
|
12
|
+
namespace audioapi::android::fileoptions {
|
|
13
|
+
|
|
14
|
+
Result<NoneType, std::string> createDirectoryIfNotExists(const std::string &directoryPath) {
|
|
15
|
+
std::error_code ec;
|
|
16
|
+
|
|
17
|
+
if (std::filesystem::exists(directoryPath, ec)) {
|
|
18
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
bool created = std::filesystem::create_directories(directoryPath, ec);
|
|
22
|
+
|
|
23
|
+
if (!created) {
|
|
24
|
+
return Result<NoneType, std::string>::Err("Failed to create directory: " + directoryPath);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (ec) {
|
|
28
|
+
return Result<NoneType, std::string>::Err(ec.message());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return Result<NoneType, std::string>::Ok(None);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
std::string getTimestampString() {
|
|
35
|
+
auto tNow = std::chrono::system_clock::now();
|
|
36
|
+
return std::format("{:%Y%m%d_%H%M%S}", std::chrono::floor<std::chrono::seconds>(tNow));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
std::string getDirectory(const std::shared_ptr<AudioFileProperties> &properties) {
|
|
40
|
+
switch (properties->directory) {
|
|
41
|
+
case AudioFileProperties::FileDirectory::Document:
|
|
42
|
+
return NativeFileInfo::getFilesDir();
|
|
43
|
+
case AudioFileProperties::FileDirectory::Cache:
|
|
44
|
+
return NativeFileInfo::getCacheDir();
|
|
45
|
+
default:
|
|
46
|
+
return NativeFileInfo::getCacheDir();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
std::string getFileExtension(const std::shared_ptr<AudioFileProperties> &properties) {
|
|
51
|
+
switch (properties->format) {
|
|
52
|
+
case AudioFileProperties::Format::WAV:
|
|
53
|
+
return "wav";
|
|
54
|
+
case AudioFileProperties::Format::CAF:
|
|
55
|
+
return "caf";
|
|
56
|
+
case AudioFileProperties::Format::M4A:
|
|
57
|
+
return "m4a";
|
|
58
|
+
case AudioFileProperties::Format::FLAC:
|
|
59
|
+
return "flac";
|
|
60
|
+
default:
|
|
61
|
+
return "m4a";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
Result<std::string, std::string> getFilePath(
|
|
66
|
+
const std::shared_ptr<AudioFileProperties> &properties) {
|
|
67
|
+
std::string directory = getDirectory(properties);
|
|
68
|
+
std::string subDirectory = std::format("{}/{}", directory, properties->subDirectory);
|
|
69
|
+
std::string fileTimestamp = getTimestampString();
|
|
70
|
+
std::string extension = getFileExtension(properties);
|
|
71
|
+
|
|
72
|
+
auto result = createDirectoryIfNotExists(subDirectory);
|
|
73
|
+
|
|
74
|
+
if (!result.is_ok()) {
|
|
75
|
+
return Result<std::string, std::string>::Err(result.unwrap_err());
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
auto filePath = std::format(
|
|
79
|
+
"{}/{}_{}.{}", subDirectory, properties->fileNamePrefix, fileTimestamp, extension);
|
|
80
|
+
return Result<std::string, std::string>::Ok(filePath);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
} // namespace audioapi::android::fileoptions
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <audioapi/utils/Result.hpp>
|
|
6
|
+
|
|
7
|
+
namespace audioapi {
|
|
8
|
+
|
|
9
|
+
class AudioFileProperties;
|
|
10
|
+
|
|
11
|
+
namespace android::fileoptions {
|
|
12
|
+
|
|
13
|
+
Result<NoneType, std::string> createDirectoryIfNotExists(const std::string &directoryPath);
|
|
14
|
+
std::string getTimestampString();
|
|
15
|
+
|
|
16
|
+
std::string getDirectory(const std::shared_ptr<AudioFileProperties> &properties);
|
|
17
|
+
std::string getFileExtension(const std::shared_ptr<AudioFileProperties> &properties);
|
|
18
|
+
Result<std::string, std::string> getFilePath(const std::shared_ptr<AudioFileProperties> &properties);
|
|
19
|
+
|
|
20
|
+
} // namespace android::fileoptions
|
|
21
|
+
|
|
22
|
+
} // namespace audioapi
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/// Miniaudio implementation for Android platform.
|
|
2
|
+
/// this define tells the miniaudio to also include the definitions and not only declarations.
|
|
3
|
+
/// Which should be done only once in the whole project.
|
|
4
|
+
/// This make its safe to include the header file in multiple places, without causing multiple definition errors.
|
|
5
|
+
/// TODO: Consider moving this file to common scope to re-use the miniaudio also for iOS platform.
|
|
1
6
|
#define MINIAUDIO_IMPLEMENTATION
|
|
2
7
|
#define MA_DEBUG_OUTPUT
|
|
3
8
|
#include <audioapi/libs/miniaudio/miniaudio.h>
|