react-native-audio-api 0.11.0-alpha.0 → 0.11.0-nightly-bfab178-20251107
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 +20 -15
- package/android/build.gradle +33 -3
- package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +30 -94
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +14 -28
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
- package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +9 -9
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +6 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +31 -3
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +21 -9
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +27 -6
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
- package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +30 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +18 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +47 -0
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +18 -80
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +6 -15
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/core/AudioNode.h +3 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +10 -0
- package/common/cpp/audioapi/core/BaseAudioContext.h +2 -0
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +69 -32
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +37 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +210 -0
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +55 -0
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +49 -102
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +28 -46
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +14 -17
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +8 -14
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +14 -18
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +64 -64
- package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +5 -0
- package/common/cpp/audioapi/core/utils/Constants.h +2 -1
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +12 -8
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +3 -3
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +1 -1
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +213 -0
- package/common/cpp/audioapi/dsp/Convolver.h +45 -0
- package/common/cpp/audioapi/dsp/FFT.cpp +0 -26
- package/common/cpp/audioapi/dsp/FFT.h +26 -2
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +1 -1
- 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/libs/ffmpeg/FFmpegDecoding.cpp +2 -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/AudioBus.cpp +28 -0
- package/common/cpp/audioapi/utils/AudioBus.h +3 -0
- package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
- package/common/cpp/test/CMakeLists.txt +19 -14
- package/common/cpp/test/src/AudioParamTest.cpp +1 -1
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +134 -0
- package/common/cpp/test/src/ConstantSourceTest.cpp +1 -1
- package/common/cpp/test/src/GainTest.cpp +1 -1
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +4 -4
- package/common/cpp/test/src/OscillatorTest.cpp +1 -1
- package/common/cpp/test/src/StereoPannerTest.cpp +1 -1
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +389 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +64 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +284 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +40 -0
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +13 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +9 -18
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +28 -70
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -2
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +73 -5
- package/ios/audioapi/ios/system/AudioEngine.mm +3 -3
- package/ios/audioapi/ios/system/AudioSessionManager.h +2 -0
- package/ios/audioapi/ios/system/AudioSessionManager.mm +24 -0
- package/ios/audioapi/ios/system/LockScreenManager.h +0 -1
- package/ios/audioapi/ios/system/LockScreenManager.mm +6 -19
- package/lib/commonjs/api.js +141 -76
- 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/AudioContext.js +1 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/AudioRecorder.js +12 -157
- package/lib/commonjs/core/AudioRecorder.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +28 -25
- 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/OfflineAudioContext.js +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +3 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/types.js +0 -46
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/index.js +19 -21
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +12 -0
- 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/OfflineAudioContext.js +12 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/api.js +16 -15
- 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/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioRecorder.js +12 -157
- package/lib/module/core/AudioRecorder.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +29 -26
- 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/OfflineAudioContext.js +2 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +3 -0
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/types.js +1 -45
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/index.js +15 -2
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +12 -0
- 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/OfflineAudioContext.js +12 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +19 -17
- 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/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioRecorder.d.ts +6 -58
- package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +3 -1
- 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/events/types.d.ts +0 -16
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +8 -39
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -0
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +1 -0
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +8 -74
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +5 -2
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +3 -0
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
- 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/OfflineAudioContext.d.ts +3 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/package.json +14 -5
- package/scripts/download-prebuilt-binaries.sh +61 -0
- package/scripts/rnaa_utils.rb +8 -0
- package/scripts/validate-worklets-version.js +28 -0
- package/src/api.ts +45 -18
- package/src/api.web.ts +1 -0
- package/src/core/AudioContext.ts +3 -2
- package/src/core/AudioRecorder.ts +20 -190
- package/src/core/BaseAudioContext.ts +67 -60
- package/src/core/ConvolverNode.ts +35 -0
- package/src/core/OfflineAudioContext.ts +2 -2
- package/src/events/types.ts +0 -18
- package/src/interfaces.ts +15 -47
- package/src/specs/NativeAudioAPIModule.ts +1 -0
- package/src/system/AudioManager.ts +4 -0
- package/src/types.ts +9 -84
- package/src/utils/index.ts +22 -2
- package/src/web-core/AudioContext.tsx +25 -0
- package/src/web-core/BaseAudioContext.tsx +2 -0
- package/src/web-core/ConvolverNode.tsx +43 -0
- package/src/web-core/ConvolverNodeOptions.tsx +6 -0
- package/src/web-core/OfflineAudioContext.tsx +25 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +0 -33
- 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/MiniaudioImplementation.cpp +0 -3
- 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/ffmpegBackend/FFmpegFileWriter.cpp +0 -431
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +0 -112
- 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/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +0 -237
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +0 -46
- package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +0 -31
- package/android/src/main/java/com/swmansion/audioapi/system/NativeFileInfo.kt +0 -18
- 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/common/cpp/audioapi/external/arm64-v8a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libogg.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopus.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libssl.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libogg.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopus.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libssl.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/x86/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
- package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
- package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
- package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
- package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
- package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
- package/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/src/utils/bitEnums.ts +0 -51
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#include <test/src/biquad/BiquadFilterChromium.h>
|
|
2
|
+
#include <test/src/biquad/BiquadFilterTest.h>
|
|
3
|
+
|
|
4
|
+
namespace audioapi {
|
|
5
|
+
|
|
6
|
+
void BiquadFilterTest::expectCoefficientsNear(
|
|
7
|
+
const std::shared_ptr<BiquadFilterNode> &biquadNode,
|
|
8
|
+
const BiquadCoefficients &expected) {
|
|
9
|
+
EXPECT_NEAR(biquadNode->b0_, expected.b0, tolerance);
|
|
10
|
+
EXPECT_NEAR(biquadNode->b1_, expected.b1, tolerance);
|
|
11
|
+
EXPECT_NEAR(biquadNode->b2_, expected.b2, tolerance);
|
|
12
|
+
EXPECT_NEAR(biquadNode->a1_, expected.a1, tolerance);
|
|
13
|
+
EXPECT_NEAR(biquadNode->a2_, expected.a2, tolerance);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
void BiquadFilterTest::testLowpass(float frequency, float Q) {
|
|
17
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
18
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
19
|
+
|
|
20
|
+
node->setLowpassCoefficients(normalizedFrequency, Q);
|
|
21
|
+
expectCoefficientsNear(
|
|
22
|
+
node, calculateLowpassCoefficients(normalizedFrequency, Q));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void BiquadFilterTest::testHighpass(float frequency, float Q) {
|
|
26
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
27
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
28
|
+
|
|
29
|
+
node->setHighpassCoefficients(normalizedFrequency, Q);
|
|
30
|
+
expectCoefficientsNear(
|
|
31
|
+
node, calculateHighpassCoefficients(normalizedFrequency, Q));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void BiquadFilterTest::testBandpass(float frequency, float Q) {
|
|
35
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
36
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
37
|
+
|
|
38
|
+
node->setBandpassCoefficients(normalizedFrequency, Q);
|
|
39
|
+
expectCoefficientsNear(
|
|
40
|
+
node, calculateBandpassCoefficients(normalizedFrequency, Q));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void BiquadFilterTest::testNotch(float frequency, float Q) {
|
|
44
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
45
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
46
|
+
|
|
47
|
+
node->setNotchCoefficients(normalizedFrequency, Q);
|
|
48
|
+
expectCoefficientsNear(
|
|
49
|
+
node, calculateNotchCoefficients(normalizedFrequency, Q));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
void BiquadFilterTest::testAllpass(float frequency, float Q) {
|
|
53
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
54
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
55
|
+
|
|
56
|
+
node->setAllpassCoefficients(normalizedFrequency, Q);
|
|
57
|
+
expectCoefficientsNear(
|
|
58
|
+
node, calculateAllpassCoefficients(normalizedFrequency, Q));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
|
|
62
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
63
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
64
|
+
|
|
65
|
+
node->setPeakingCoefficients(normalizedFrequency, Q, gain);
|
|
66
|
+
expectCoefficientsNear(
|
|
67
|
+
node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void BiquadFilterTest::testLowshelf(float frequency, float gain) {
|
|
71
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
72
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
73
|
+
|
|
74
|
+
node->setLowshelfCoefficients(normalizedFrequency, gain);
|
|
75
|
+
expectCoefficientsNear(
|
|
76
|
+
node, calculateLowshelfCoefficients(normalizedFrequency, gain));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void BiquadFilterTest::testHighshelf(float frequency, float gain) {
|
|
80
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
81
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
82
|
+
|
|
83
|
+
node->setHighshelfCoefficients(normalizedFrequency, gain);
|
|
84
|
+
expectCoefficientsNear(
|
|
85
|
+
node, calculateHighshelfCoefficients(normalizedFrequency, gain));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
89
|
+
Frequencies,
|
|
90
|
+
BiquadFilterFrequencyTest,
|
|
91
|
+
::testing::Values(
|
|
92
|
+
0.0f, // 0 Hz - the filter should block all input signal
|
|
93
|
+
10.0f, // very low frequency
|
|
94
|
+
350.0f, // default
|
|
95
|
+
nyquistFrequency - 0.0001f, // frequency near Nyquist
|
|
96
|
+
nyquistFrequency)); // maximal frequency
|
|
97
|
+
|
|
98
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
99
|
+
QEdgeCases,
|
|
100
|
+
BiquadFilterQTestLowpassHighpass,
|
|
101
|
+
::testing::Values(
|
|
102
|
+
-770.63678f, // min value for lowpass and highpass
|
|
103
|
+
0.0f, // default
|
|
104
|
+
770.63678f)); // max value for lowpass and highpass
|
|
105
|
+
|
|
106
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
107
|
+
QEdgeCases,
|
|
108
|
+
BiquadFilterQTestRestTypes, // bandpass, notch, allpass, peaking
|
|
109
|
+
::testing::Values(
|
|
110
|
+
0.0f, // default and min value
|
|
111
|
+
MOST_POSITIVE_SINGLE_FLOAT));
|
|
112
|
+
|
|
113
|
+
INSTANTIATE_TEST_SUITE_P(
|
|
114
|
+
GainEdgeCases,
|
|
115
|
+
BiquadFilterGainTest,
|
|
116
|
+
::testing::Values(
|
|
117
|
+
-40.0f,
|
|
118
|
+
0.0f, // default
|
|
119
|
+
40.0f));
|
|
120
|
+
|
|
121
|
+
TEST_P(BiquadFilterFrequencyTest, SetLowpassCoefficients) {
|
|
122
|
+
float frequency = GetParam();
|
|
123
|
+
float Q = 1.0f;
|
|
124
|
+
testLowpass(frequency, Q);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
TEST_P(BiquadFilterFrequencyTest, SetHighpassCoefficients) {
|
|
128
|
+
float frequency = GetParam();
|
|
129
|
+
float Q = 1.0f;
|
|
130
|
+
testHighpass(frequency, Q);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
TEST_P(BiquadFilterFrequencyTest, SetBandpassCoefficients) {
|
|
134
|
+
float frequency = GetParam();
|
|
135
|
+
float Q = 1.0f;
|
|
136
|
+
testBandpass(frequency, Q);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
TEST_P(BiquadFilterFrequencyTest, SetNotchCoefficients) {
|
|
140
|
+
float frequency = GetParam();
|
|
141
|
+
float Q = 1.0f;
|
|
142
|
+
testNotch(frequency, Q);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
TEST_P(BiquadFilterFrequencyTest, SetAllpassCoefficients) {
|
|
146
|
+
float frequency = GetParam();
|
|
147
|
+
float Q = 1.0f;
|
|
148
|
+
testAllpass(frequency, Q);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
TEST_P(BiquadFilterFrequencyTest, SetPeakingCoefficients) {
|
|
152
|
+
float frequency = GetParam();
|
|
153
|
+
float Q = 1.0f;
|
|
154
|
+
float gain = 2.0f;
|
|
155
|
+
testPeaking(frequency, Q, gain);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
TEST_P(BiquadFilterFrequencyTest, SetLowshelfCoefficients) {
|
|
159
|
+
float frequency = GetParam();
|
|
160
|
+
float gain = 2.0f;
|
|
161
|
+
testLowshelf(frequency, gain);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
TEST_P(BiquadFilterFrequencyTest, SetHighshelfCoefficients) {
|
|
165
|
+
float frequency = GetParam();
|
|
166
|
+
float gain = 2.0f;
|
|
167
|
+
testHighshelf(frequency, gain);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
TEST_P(BiquadFilterQTestLowpassHighpass, SetLowpassCoefficients) {
|
|
171
|
+
float frequency = 1000.0f;
|
|
172
|
+
float Q = GetParam();
|
|
173
|
+
testLowpass(frequency, Q);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
TEST_P(BiquadFilterQTestLowpassHighpass, SetHighpassCoefficients) {
|
|
177
|
+
float frequency = 1000.0f;
|
|
178
|
+
float Q = GetParam();
|
|
179
|
+
testHighpass(frequency, Q);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
TEST_P(BiquadFilterQTestRestTypes, SetBandpassCoefficients) {
|
|
183
|
+
float frequency = 1000.0f;
|
|
184
|
+
float Q = GetParam();
|
|
185
|
+
testBandpass(frequency, Q);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
TEST_P(BiquadFilterQTestRestTypes, SetNotchCoefficients) {
|
|
189
|
+
float frequency = 1000.0f;
|
|
190
|
+
float Q = GetParam();
|
|
191
|
+
testNotch(frequency, Q);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
TEST_P(BiquadFilterQTestRestTypes, SetAllpassCoefficients) {
|
|
195
|
+
float frequency = 1000.0f;
|
|
196
|
+
float Q = GetParam();
|
|
197
|
+
testAllpass(frequency, Q);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
TEST_P(BiquadFilterQTestRestTypes, SetPeakingCoefficients) {
|
|
201
|
+
float frequency = 1000.0f;
|
|
202
|
+
float Q = GetParam();
|
|
203
|
+
float gain = 2.0f;
|
|
204
|
+
testPeaking(frequency, Q, gain);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
TEST_P(BiquadFilterGainTest, SetPeakingCoefficients) {
|
|
208
|
+
float frequency = 1000.0f;
|
|
209
|
+
float Q = 1.0f;
|
|
210
|
+
float gain = GetParam();
|
|
211
|
+
testPeaking(frequency, Q, gain);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
TEST_P(BiquadFilterGainTest, SetLowshelfCoefficients) {
|
|
215
|
+
float frequency = 1000.0f;
|
|
216
|
+
float gain = GetParam();
|
|
217
|
+
testLowshelf(frequency, gain);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
TEST_P(BiquadFilterGainTest, SetHighshelfCoefficients) {
|
|
221
|
+
float frequency = 1000.0f;
|
|
222
|
+
float gain = GetParam();
|
|
223
|
+
testHighshelf(frequency, gain);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
TEST_F(BiquadFilterTest, GetFrequencyResponse) {
|
|
227
|
+
auto node = std::make_shared<BiquadFilterNode>(context.get());
|
|
228
|
+
|
|
229
|
+
float frequency = 1000.0f;
|
|
230
|
+
float Q = 1.0f;
|
|
231
|
+
float normalizedFrequency = frequency / nyquistFrequency;
|
|
232
|
+
|
|
233
|
+
node->setLowpassCoefficients(normalizedFrequency, Q);
|
|
234
|
+
auto coeffs = calculateLowpassCoefficients(normalizedFrequency, Q);
|
|
235
|
+
|
|
236
|
+
std::vector<float> TestFrequencies = {
|
|
237
|
+
-0.0001f,
|
|
238
|
+
0.0f,
|
|
239
|
+
0.0001f,
|
|
240
|
+
0.25f * nyquistFrequency,
|
|
241
|
+
0.5f * nyquistFrequency,
|
|
242
|
+
0.75f * nyquistFrequency,
|
|
243
|
+
nyquistFrequency - 0.0001f,
|
|
244
|
+
nyquistFrequency,
|
|
245
|
+
nyquistFrequency + 0.0001f};
|
|
246
|
+
|
|
247
|
+
std::vector<float> magResponseNode(TestFrequencies.size());
|
|
248
|
+
std::vector<float> phaseResponseNode(TestFrequencies.size());
|
|
249
|
+
std::vector<float> magResponseExpected(TestFrequencies.size());
|
|
250
|
+
std::vector<float> phaseResponseExpected(TestFrequencies.size());
|
|
251
|
+
|
|
252
|
+
node->getFrequencyResponse(
|
|
253
|
+
TestFrequencies.data(),
|
|
254
|
+
magResponseNode.data(),
|
|
255
|
+
phaseResponseNode.data(),
|
|
256
|
+
TestFrequencies.size());
|
|
257
|
+
getFrequencyResponse(
|
|
258
|
+
coeffs,
|
|
259
|
+
TestFrequencies,
|
|
260
|
+
magResponseExpected,
|
|
261
|
+
phaseResponseExpected,
|
|
262
|
+
nyquistFrequency);
|
|
263
|
+
|
|
264
|
+
for (size_t i = 0; i < TestFrequencies.size(); ++i) {
|
|
265
|
+
float f = TestFrequencies[i];
|
|
266
|
+
if (std::isnan(magResponseExpected[i])) {
|
|
267
|
+
EXPECT_TRUE(std::isnan(magResponseNode[i]))
|
|
268
|
+
<< "Expected NaN at frequency " << f;
|
|
269
|
+
} else {
|
|
270
|
+
EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)
|
|
271
|
+
<< "Magnitude mismatch at " << f << " Hz";
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (std::isnan(phaseResponseExpected[i])) {
|
|
275
|
+
EXPECT_TRUE(std::isnan(phaseResponseNode[i]))
|
|
276
|
+
<< "Expected NaN at frequency " << f;
|
|
277
|
+
} else {
|
|
278
|
+
EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)
|
|
279
|
+
<< "Phase mismatch at " << f << " Hz";
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/core/OfflineAudioContext.h>
|
|
4
|
+
#include <audioapi/core/effects/BiquadFilterNode.h>
|
|
5
|
+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
6
|
+
#include <gtest/gtest.h>
|
|
7
|
+
#include <test/src/MockAudioEventHandlerRegistry.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
|
|
10
|
+
static constexpr int sampleRate = 44100;
|
|
11
|
+
static constexpr float nyquistFrequency = sampleRate / 2.0f;
|
|
12
|
+
static constexpr float tolerance = 0.0001f;
|
|
13
|
+
|
|
14
|
+
namespace audioapi {
|
|
15
|
+
class BiquadFilterTest : public ::testing::Test {
|
|
16
|
+
protected:
|
|
17
|
+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
|
|
18
|
+
std::unique_ptr<OfflineAudioContext> context;
|
|
19
|
+
|
|
20
|
+
void SetUp() override {
|
|
21
|
+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
|
|
22
|
+
context = std::make_unique<OfflineAudioContext>(2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void expectCoefficientsNear(const std::shared_ptr<BiquadFilterNode> &node, const BiquadCoefficients &expected);
|
|
26
|
+
void testLowpass(float frequency, float Q);
|
|
27
|
+
void testHighpass(float frequency, float Q);
|
|
28
|
+
void testBandpass(float frequency, float Q);
|
|
29
|
+
void testNotch(float frequency, float Q);
|
|
30
|
+
void testAllpass(float frequency, float Q);
|
|
31
|
+
void testPeaking(float frequency, float Q, float gain);
|
|
32
|
+
void testLowshelf(float frequency, float gain);
|
|
33
|
+
void testHighshelf(float frequency, float gain);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
37
|
+
class BiquadFilterQTestRestTypes : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
38
|
+
class BiquadFilterFrequencyTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
39
|
+
class BiquadFilterGainTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
|
|
40
|
+
} // namespace audioapi
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
2
2
|
#import <React/RCTCallInvokerModule.h>
|
|
3
|
+
#import <React/RCTInvalidating.h>
|
|
3
4
|
#import <rnaudioapi/rnaudioapi.h>
|
|
4
5
|
#else // RCT_NEW_ARCH_ENABLED
|
|
5
6
|
#import <React/RCTBridgeModule.h>
|
|
@@ -14,7 +15,7 @@
|
|
|
14
15
|
|
|
15
16
|
@interface AudioAPIModule : RCTEventEmitter
|
|
16
17
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
17
|
-
<NativeAudioAPIModuleSpec, RCTCallInvokerModule>
|
|
18
|
+
<NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
|
|
18
19
|
#else
|
|
19
20
|
<RCTBridgeModule>
|
|
20
21
|
#endif // RCT_NEW_ARCH_ENABLED
|
|
@@ -54,6 +54,8 @@ RCT_EXPORT_MODULE(AudioAPIModule);
|
|
|
54
54
|
|
|
55
55
|
_eventHandler = nullptr;
|
|
56
56
|
|
|
57
|
+
audioapi::AudioAPIModuleInstaller::closeAllContexts();
|
|
58
|
+
|
|
57
59
|
[super invalidate];
|
|
58
60
|
}
|
|
59
61
|
|
|
@@ -116,6 +118,9 @@ RCT_EXPORT_METHOD(
|
|
|
116
118
|
setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
|
|
117
119
|
reject)
|
|
118
120
|
{
|
|
121
|
+
if (!self.audioSessionManager.shouldManageSession) {
|
|
122
|
+
[self.audioSessionManager setShouldManageSession:true];
|
|
123
|
+
}
|
|
119
124
|
if ([self.audioSessionManager setActive:enabled]) {
|
|
120
125
|
resolve(@"true");
|
|
121
126
|
return;
|
|
@@ -128,6 +133,9 @@ RCT_EXPORT_METHOD(
|
|
|
128
133
|
setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
|
|
129
134
|
options allowHaptics : (BOOL)allowHaptics)
|
|
130
135
|
{
|
|
136
|
+
if (!self.audioSessionManager.shouldManageSession) {
|
|
137
|
+
[self.audioSessionManager setShouldManageSession:true];
|
|
138
|
+
}
|
|
131
139
|
[self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
|
|
132
140
|
}
|
|
133
141
|
|
|
@@ -180,6 +188,11 @@ RCT_EXPORT_METHOD(
|
|
|
180
188
|
[self.audioSessionManager getDevicesInfo:resolve reject:reject];
|
|
181
189
|
}
|
|
182
190
|
|
|
191
|
+
RCT_EXPORT_METHOD(disableSessionManagement)
|
|
192
|
+
{
|
|
193
|
+
[self.audioSessionManager disableSessionManagement];
|
|
194
|
+
}
|
|
195
|
+
|
|
183
196
|
#ifdef RCT_NEW_ARCH_ENABLED
|
|
184
197
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
185
198
|
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#ifdef __OBJC__ // when compiled as C++
|
|
3
|
+
#ifdef __OBJC__ // when compiled as Objective-C++
|
|
4
4
|
#import <NativeAudioRecorder.h>
|
|
5
|
-
#else
|
|
6
|
-
typedef struct objc_object AVAudioFile;
|
|
7
|
-
typedef struct objc_object NSURL;
|
|
8
|
-
typedef struct objc_object AudioBufferList;
|
|
5
|
+
#else // when compiled as C++
|
|
9
6
|
typedef struct objc_object NativeAudioRecorder;
|
|
10
7
|
#endif // __OBJC__
|
|
11
8
|
|
|
@@ -15,27 +12,21 @@ namespace audioapi {
|
|
|
15
12
|
|
|
16
13
|
class AudioBus;
|
|
17
14
|
class CircularAudioArray;
|
|
18
|
-
class IOSAudioFileWriter;
|
|
19
|
-
class AudioEventHandlerRegistry;
|
|
20
15
|
|
|
21
16
|
class IOSAudioRecorder : public AudioRecorder {
|
|
22
17
|
public:
|
|
23
|
-
IOSAudioRecorder(
|
|
18
|
+
IOSAudioRecorder(
|
|
19
|
+
float sampleRate,
|
|
20
|
+
int bufferLength,
|
|
21
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
|
|
22
|
+
|
|
24
23
|
~IOSAudioRecorder() override;
|
|
25
24
|
|
|
26
25
|
void start() override;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
void enableFileOutput(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags, size_t androidFlags)
|
|
30
|
-
override;
|
|
31
|
-
void disableFileOutput() override;
|
|
32
|
-
|
|
33
|
-
void pause() override;
|
|
34
|
-
void resume() override;
|
|
26
|
+
void stop() override;
|
|
35
27
|
|
|
36
28
|
private:
|
|
37
|
-
|
|
38
|
-
NativeAudioRecorder *nativeRecorder_;
|
|
29
|
+
NativeAudioRecorder *audioRecorder_;
|
|
39
30
|
};
|
|
40
31
|
|
|
41
32
|
} // namespace audioapi
|
|
@@ -1,112 +1,70 @@
|
|
|
1
1
|
#import <AVFoundation/AVFoundation.h>
|
|
2
|
-
#import <Foundation/Foundation.h>
|
|
3
|
-
#include <unordered_map>
|
|
4
2
|
|
|
5
3
|
#include <audioapi/core/utils/Constants.h>
|
|
6
4
|
#include <audioapi/dsp/VectorMath.h>
|
|
7
5
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
8
|
-
#include <audioapi/ios/core/IOSAudioFileWriter.h>
|
|
9
6
|
#include <audioapi/ios/core/IOSAudioRecorder.h>
|
|
10
7
|
#include <audioapi/utils/AudioArray.h>
|
|
11
8
|
#include <audioapi/utils/AudioBus.h>
|
|
12
9
|
#include <audioapi/utils/CircularAudioArray.h>
|
|
13
10
|
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
11
|
+
#include <unordered_map>
|
|
14
12
|
|
|
15
13
|
namespace audioapi {
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
IOSAudioRecorder::IOSAudioRecorder(
|
|
16
|
+
float sampleRate,
|
|
17
|
+
int bufferLength,
|
|
18
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
19
|
+
: AudioRecorder(sampleRate, bufferLength, audioEventHandlerRegistry)
|
|
20
|
+
{
|
|
21
|
+
AudioReceiverBlock audioReceiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
|
|
22
|
+
if (isRunning_.load()) {
|
|
23
|
+
auto *inputChannel = static_cast<float *>(inputBuffer->mBuffers[0].mData);
|
|
24
|
+
writeToBuffers(inputChannel, numFrames);
|
|
25
|
+
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
while (circularBuffer_->getNumberOfAvailableFrames() >= bufferLength_) {
|
|
28
|
+
auto bus = std::make_shared<AudioBus>(bufferLength_, 1, sampleRate_);
|
|
29
|
+
auto *outputChannel = bus->getChannel(0)->getData();
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
// }
|
|
31
|
-
// };
|
|
31
|
+
circularBuffer_->pop_front(outputChannel, bufferLength_);
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
: AudioRecorder(audioEventHandlerRegistry), fileWriter_(nullptr)
|
|
35
|
-
{
|
|
36
|
-
AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
|
|
37
|
-
if (usesFileOutput()) {
|
|
38
|
-
fileWriter_->writeAudioData(inputBuffer, numFrames);
|
|
33
|
+
invokeOnAudioReadyCallback(bus, bufferLength_);
|
|
39
34
|
}
|
|
40
35
|
};
|
|
41
36
|
|
|
42
|
-
|
|
37
|
+
audioRecorder_ = [[NativeAudioRecorder alloc] initWithReceiverBlock:audioReceiverBlock
|
|
38
|
+
bufferLength:bufferLength
|
|
39
|
+
sampleRate:sampleRate];
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
IOSAudioRecorder::~IOSAudioRecorder()
|
|
46
43
|
{
|
|
47
44
|
stop();
|
|
48
|
-
[
|
|
45
|
+
[audioRecorder_ cleanup];
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
void IOSAudioRecorder::start()
|
|
52
49
|
{
|
|
53
|
-
if (
|
|
50
|
+
if (isRunning_.load()) {
|
|
54
51
|
return;
|
|
55
52
|
}
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
fileWriter_->openFile([nativeRecorder_ getInputFormat]);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (usesCallback()) {
|
|
62
|
-
// TODO: create circular buffer and converter?
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (isConnected()) {
|
|
66
|
-
// TODO: set adapter node properties?
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
[nativeRecorder_ start];
|
|
54
|
+
[audioRecorder_ start];
|
|
70
55
|
isRunning_.store(true);
|
|
71
56
|
}
|
|
72
57
|
|
|
73
|
-
|
|
58
|
+
void IOSAudioRecorder::stop()
|
|
74
59
|
{
|
|
75
|
-
if (!
|
|
76
|
-
return
|
|
60
|
+
if (!isRunning_.load()) {
|
|
61
|
+
return;
|
|
77
62
|
}
|
|
78
63
|
|
|
79
|
-
[nativeRecorder_ stop];
|
|
80
64
|
isRunning_.store(false);
|
|
65
|
+
[audioRecorder_ stop];
|
|
81
66
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (usesFileOutput()) {
|
|
85
|
-
return fileWriter_->closeFile();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return std::string("");
|
|
67
|
+
sendRemainingData();
|
|
89
68
|
}
|
|
90
69
|
|
|
91
|
-
void IOSAudioRecorder::enableFileOutput(
|
|
92
|
-
float sampleRate,
|
|
93
|
-
size_t channelCount,
|
|
94
|
-
size_t bitRate,
|
|
95
|
-
size_t iosFlags,
|
|
96
|
-
size_t androidFlags)
|
|
97
|
-
{
|
|
98
|
-
fileOutputEnabled_.store(true);
|
|
99
|
-
fileWriter_ = std::make_shared<IOSAudioFileWriter>(sampleRate, channelCount, bitRate, iosFlags);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
void IOSAudioRecorder::disableFileOutput()
|
|
103
|
-
{
|
|
104
|
-
fileOutputEnabled_.store(false);
|
|
105
|
-
fileWriter_ = nullptr;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
void IOSAudioRecorder::pause() {}
|
|
109
|
-
|
|
110
|
-
void IOSAudioRecorder::resume() {}
|
|
111
|
-
|
|
112
70
|
} // namespace audioapi
|
|
@@ -14,9 +14,13 @@ typedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFr
|
|
|
14
14
|
@property (nonatomic, copy) AVAudioSinkNodeReceiverBlock receiverSinkBlock;
|
|
15
15
|
@property (nonatomic, copy) AudioReceiverBlock receiverBlock;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
@property (nonatomic, strong) AVAudioConverter *audioConverter;
|
|
18
|
+
@property (nonatomic, strong) AVAudioFormat *inputFormat;
|
|
19
|
+
@property (nonatomic, strong) AVAudioFormat *outputFormat;
|
|
18
20
|
|
|
19
|
-
- (
|
|
21
|
+
- (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
|
|
22
|
+
bufferLength:(int)bufferLength
|
|
23
|
+
sampleRate:(float)sampleRate;
|
|
20
24
|
|
|
21
25
|
- (void)start;
|
|
22
26
|
|
|
@@ -5,18 +5,40 @@
|
|
|
5
5
|
@implementation NativeAudioRecorder
|
|
6
6
|
|
|
7
7
|
- (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
|
|
8
|
+
bufferLength:(int)bufferLength
|
|
9
|
+
sampleRate:(float)sampleRate
|
|
8
10
|
{
|
|
9
11
|
if (self = [super init]) {
|
|
12
|
+
self.bufferLength = bufferLength;
|
|
13
|
+
self.sampleRate = sampleRate;
|
|
14
|
+
|
|
10
15
|
self.receiverBlock = [receiverBlock copy];
|
|
11
16
|
|
|
17
|
+
float devicePrefferedSampleRate = [[AVAudioSession sharedInstance] sampleRate];
|
|
18
|
+
|
|
19
|
+
if (!devicePrefferedSampleRate) {
|
|
20
|
+
NSError *error;
|
|
21
|
+
devicePrefferedSampleRate = sampleRate;
|
|
22
|
+
|
|
23
|
+
[[AVAudioSession sharedInstance] setPreferredSampleRate:sampleRate error:&error];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
self.inputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
|
|
27
|
+
sampleRate:devicePrefferedSampleRate
|
|
28
|
+
channels:1
|
|
29
|
+
interleaved:NO];
|
|
30
|
+
self.outputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
|
|
31
|
+
sampleRate:sampleRate
|
|
32
|
+
channels:1
|
|
33
|
+
interleaved:NO];
|
|
34
|
+
self.audioConverter = [[AVAudioConverter alloc] initFromFormat:self.inputFormat toFormat:self.outputFormat];
|
|
35
|
+
|
|
12
36
|
__weak typeof(self) weakSelf = self;
|
|
13
37
|
self.receiverSinkBlock = ^OSStatus(
|
|
14
38
|
const AudioTimeStamp *_Nonnull timestamp,
|
|
15
39
|
AVAudioFrameCount frameCount,
|
|
16
40
|
const AudioBufferList *_Nonnull inputData) {
|
|
17
|
-
weakSelf
|
|
18
|
-
|
|
19
|
-
return kAudioServicesNoError;
|
|
41
|
+
return [weakSelf processAudioInput:inputData withFrameCount:frameCount atTimestamp:timestamp];
|
|
20
42
|
};
|
|
21
43
|
|
|
22
44
|
self.sinkNode = [[AVAudioSinkNode alloc] initWithReceiverBlock:self.receiverSinkBlock];
|
|
@@ -25,9 +47,55 @@
|
|
|
25
47
|
return self;
|
|
26
48
|
}
|
|
27
49
|
|
|
28
|
-
- (
|
|
50
|
+
- (OSStatus)processAudioInput:(const AudioBufferList *)inputData
|
|
51
|
+
withFrameCount:(AVAudioFrameCount)frameCount
|
|
52
|
+
atTimestamp:(const AudioTimeStamp *)timestamp
|
|
29
53
|
{
|
|
30
|
-
|
|
54
|
+
float inputSampleRate = self.inputFormat.sampleRate;
|
|
55
|
+
float outputSampleRate = self.outputFormat.sampleRate;
|
|
56
|
+
|
|
57
|
+
if (inputSampleRate != outputSampleRate) {
|
|
58
|
+
AVAudioPCMBuffer *inputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.inputFormat
|
|
59
|
+
frameCapacity:frameCount];
|
|
60
|
+
memcpy(
|
|
61
|
+
inputBuffer.mutableAudioBufferList->mBuffers[0].mData,
|
|
62
|
+
inputData->mBuffers[0].mData,
|
|
63
|
+
inputData->mBuffers[0].mDataByteSize);
|
|
64
|
+
inputBuffer.frameLength = frameCount;
|
|
65
|
+
|
|
66
|
+
int outputFrameCount = frameCount * outputSampleRate / inputSampleRate;
|
|
67
|
+
|
|
68
|
+
AVAudioPCMBuffer *outputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.audioConverter.outputFormat
|
|
69
|
+
frameCapacity:outputFrameCount];
|
|
70
|
+
|
|
71
|
+
NSError *error = nil;
|
|
72
|
+
AVAudioConverterInputBlock inputBlock =
|
|
73
|
+
^AVAudioBuffer *_Nullable(AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)
|
|
74
|
+
{
|
|
75
|
+
*outStatus = AVAudioConverterInputStatus_HaveData;
|
|
76
|
+
return inputBuffer;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/// IMPORTANT: AVAudioConverter leaks memory without autorelease pool
|
|
80
|
+
/// more details here: https://github.com/poneciak57/AVAudioConverter-memory-leak-repro-electric-boogaloo
|
|
81
|
+
/// we can try to remove it in the future or refactor to reuse buffers to minimize allocations
|
|
82
|
+
@autoreleasepool {
|
|
83
|
+
[self.audioConverter convertToBuffer:outputBuffer error:&error withInputFromBlock:inputBlock];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (error) {
|
|
87
|
+
NSLog(@"Error during audio conversion: %@", error.localizedDescription);
|
|
88
|
+
return kAudioServicesBadSpecifierSizeError;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
self.receiverBlock(outputBuffer.audioBufferList, outputBuffer.frameLength);
|
|
92
|
+
|
|
93
|
+
return kAudioServicesNoError;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
self.receiverBlock(inputData, frameCount);
|
|
97
|
+
|
|
98
|
+
return kAudioServicesNoError;
|
|
31
99
|
}
|
|
32
100
|
|
|
33
101
|
- (void)start
|