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
package/src/core/AudioContext.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import AudioAPIModule from '../AudioAPIModule';
|
|
2
|
+
import { NotSupportedError } from '../errors';
|
|
1
3
|
import { IAudioContext } from '../interfaces';
|
|
2
|
-
import BaseAudioContext from './BaseAudioContext';
|
|
3
4
|
import AudioManager from '../system';
|
|
4
5
|
import { AudioContextOptions } from '../types';
|
|
5
|
-
import
|
|
6
|
-
import { isWorkletsAvailable, workletsModule } from '../utils';
|
|
6
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
7
7
|
|
|
8
8
|
export default class AudioContext extends BaseAudioContext {
|
|
9
9
|
constructor(options?: AudioContextOptions) {
|
|
@@ -16,15 +16,12 @@ export default class AudioContext extends BaseAudioContext {
|
|
|
16
16
|
`The provided sampleRate is not supported: ${options.sampleRate}`
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
|
|
22
|
-
}
|
|
19
|
+
|
|
20
|
+
const audioRuntime = AudioAPIModule.createAudioRuntime();
|
|
23
21
|
|
|
24
22
|
super(
|
|
25
23
|
global.createAudioContext(
|
|
26
24
|
options?.sampleRate || AudioManager.getDevicePreferredSampleRate(),
|
|
27
|
-
options?.initSuspended || false,
|
|
28
25
|
audioRuntime
|
|
29
26
|
)
|
|
30
27
|
);
|
package/src/core/AudioNode.ts
CHANGED
|
@@ -23,7 +23,9 @@ export default class AudioNode {
|
|
|
23
23
|
this.channelInterpretation = this.node.channelInterpretation;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
public connect(destination: AudioNode
|
|
26
|
+
public connect(destination: AudioNode): AudioNode;
|
|
27
|
+
public connect(destination: AudioParam): void;
|
|
28
|
+
public connect(destination: AudioNode | AudioParam): AudioNode | void {
|
|
27
29
|
if (this.context !== destination.context) {
|
|
28
30
|
throw new InvalidAccessError(
|
|
29
31
|
'Source and destination are from different BaseAudioContexts'
|
|
@@ -34,9 +36,8 @@ export default class AudioNode {
|
|
|
34
36
|
this.node.connect(destination.audioParam);
|
|
35
37
|
} else {
|
|
36
38
|
this.node.connect(destination.node);
|
|
39
|
+
return destination;
|
|
37
40
|
}
|
|
38
|
-
|
|
39
|
-
return destination;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
public disconnect(destination?: AudioNode | AudioParam): void {
|
package/src/core/AudioParam.ts
CHANGED
|
@@ -33,7 +33,8 @@ export default class AudioParam {
|
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
const clampedTime = Math.max(startTime, this.context.currentTime);
|
|
37
|
+
this.audioParam.setValueAtTime(value, clampedTime);
|
|
37
38
|
|
|
38
39
|
return this;
|
|
39
40
|
}
|
|
@@ -45,7 +46,8 @@ export default class AudioParam {
|
|
|
45
46
|
);
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
const clampedTime = Math.max(endTime, this.context.currentTime);
|
|
50
|
+
this.audioParam.linearRampToValueAtTime(value, clampedTime);
|
|
49
51
|
|
|
50
52
|
return this;
|
|
51
53
|
}
|
|
@@ -54,13 +56,14 @@ export default class AudioParam {
|
|
|
54
56
|
value: number,
|
|
55
57
|
endTime: number
|
|
56
58
|
): AudioParam {
|
|
57
|
-
if (endTime
|
|
59
|
+
if (endTime <= 0) {
|
|
58
60
|
throw new RangeError(
|
|
59
61
|
`endTime must be a finite non-negative number: ${endTime}`
|
|
60
62
|
);
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
const clampedTime = Math.max(endTime, this.context.currentTime);
|
|
66
|
+
this.audioParam.exponentialRampToValueAtTime(value, clampedTime);
|
|
64
67
|
|
|
65
68
|
return this;
|
|
66
69
|
}
|
|
@@ -78,11 +81,12 @@ export default class AudioParam {
|
|
|
78
81
|
|
|
79
82
|
if (timeConstant < 0) {
|
|
80
83
|
throw new RangeError(
|
|
81
|
-
`timeConstant must be a finite non-negative number: ${
|
|
84
|
+
`timeConstant must be a finite non-negative number: ${timeConstant}`
|
|
82
85
|
);
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
|
|
88
|
+
const clampedTime = Math.max(startTime, this.context.currentTime);
|
|
89
|
+
this.audioParam.setTargetAtTime(target, clampedTime, timeConstant);
|
|
86
90
|
|
|
87
91
|
return this;
|
|
88
92
|
}
|
|
@@ -98,9 +102,9 @@ export default class AudioParam {
|
|
|
98
102
|
);
|
|
99
103
|
}
|
|
100
104
|
|
|
101
|
-
if (duration
|
|
105
|
+
if (duration <= 0) {
|
|
102
106
|
throw new RangeError(
|
|
103
|
-
`duration must be a finite
|
|
107
|
+
`duration must be a finite strictly-positive number: ${duration}`
|
|
104
108
|
);
|
|
105
109
|
}
|
|
106
110
|
|
|
@@ -108,7 +112,8 @@ export default class AudioParam {
|
|
|
108
112
|
throw new InvalidStateError(`values must contain at least two values`);
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
|
|
115
|
+
const clampedTime = Math.max(startTime, this.context.currentTime);
|
|
116
|
+
this.audioParam.setValueCurveAtTime(values, clampedTime, duration);
|
|
112
117
|
|
|
113
118
|
return this;
|
|
114
119
|
}
|
|
@@ -120,7 +125,8 @@ export default class AudioParam {
|
|
|
120
125
|
);
|
|
121
126
|
}
|
|
122
127
|
|
|
123
|
-
this.
|
|
128
|
+
const clampedTime = Math.max(cancelTime, this.context.currentTime);
|
|
129
|
+
this.audioParam.cancelScheduledValues(clampedTime);
|
|
124
130
|
|
|
125
131
|
return this;
|
|
126
132
|
}
|
|
@@ -132,7 +138,8 @@ export default class AudioParam {
|
|
|
132
138
|
);
|
|
133
139
|
}
|
|
134
140
|
|
|
135
|
-
this.
|
|
141
|
+
const clampedTime = Math.max(cancelTime, this.context.currentTime);
|
|
142
|
+
this.audioParam.cancelAndHoldAtTime(clampedTime);
|
|
136
143
|
|
|
137
144
|
return this;
|
|
138
145
|
}
|
|
@@ -1,66 +1,42 @@
|
|
|
1
1
|
import { AudioEventEmitter, AudioEventSubscription } from '../events';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
OnAudioReadyEventType,
|
|
4
|
+
OnRecorderErrorEventType,
|
|
5
|
+
} from '../events/types';
|
|
3
6
|
import { IAudioRecorder } from '../interfaces';
|
|
4
7
|
import {
|
|
5
|
-
AndroidFormat,
|
|
6
8
|
AudioRecorderCallbackOptions,
|
|
7
9
|
AudioRecorderFileOptions,
|
|
8
|
-
BitDepth,
|
|
9
10
|
FileDirectory,
|
|
11
|
+
FileFormat,
|
|
10
12
|
FileInfo,
|
|
11
|
-
|
|
12
|
-
IOSFormat,
|
|
13
|
+
Result,
|
|
13
14
|
} from '../types';
|
|
14
|
-
import
|
|
15
|
+
import FilePreset from '../utils/filePresets';
|
|
15
16
|
import AudioBuffer from './AudioBuffer';
|
|
16
17
|
import RecorderAdapterNode from './RecorderAdapterNode';
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
// Enforces default options, making sure that all properties are defined
|
|
20
|
+
// for the contract with native code.
|
|
21
|
+
function withDefaultOptions(
|
|
22
|
+
inOptions: AudioRecorderFileOptions
|
|
23
|
+
): Required<AudioRecorderFileOptions> {
|
|
19
24
|
return {
|
|
20
25
|
directory: FileDirectory.Cache,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
subDirectory: 'AudioAPI',
|
|
27
|
+
fileNamePrefix: 'recording_',
|
|
28
|
+
channelCount: 2,
|
|
29
|
+
format: FileFormat.M4A,
|
|
30
|
+
batchDurationSeconds: 0,
|
|
31
|
+
preset: FilePreset.High,
|
|
32
|
+
androidFlushIntervalMs: 500,
|
|
25
33
|
...inOptions,
|
|
26
|
-
ios: {
|
|
27
|
-
format: IOSFormat.M4A,
|
|
28
|
-
quality: IOSAudioQuality.High,
|
|
29
|
-
...(inOptions.ios ?? {}),
|
|
30
|
-
},
|
|
31
|
-
android: {
|
|
32
|
-
format: AndroidFormat.M4A,
|
|
33
|
-
...(inOptions.android ?? {}),
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function parseFileOptions(inOptions: AudioRecorderFileOptions) {
|
|
39
|
-
const { sampleRate, channels, bitRate, directory, bitDepth, ios, android } =
|
|
40
|
-
withDefaultOptions(inOptions);
|
|
41
|
-
|
|
42
|
-
const iosFlags = encodeFlags(
|
|
43
|
-
ios.format,
|
|
44
|
-
ios.quality,
|
|
45
|
-
ios.flacCompressionLevel || 0,
|
|
46
|
-
directory,
|
|
47
|
-
bitDepth
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
// TODO: ensure directory and bitDepth are last in the bitmask
|
|
51
|
-
const androidFlags = encodeFlags(android.format, directory, bitDepth);
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
sampleRate,
|
|
55
|
-
channels,
|
|
56
|
-
bitRate,
|
|
57
|
-
ios: iosFlags,
|
|
58
|
-
android: androidFlags,
|
|
59
34
|
};
|
|
60
35
|
}
|
|
61
36
|
|
|
62
37
|
export default class AudioRecorder {
|
|
63
38
|
protected onAudioReadySubscription: AudioEventSubscription | null = null;
|
|
39
|
+
protected onErrorSubscription: AudioEventSubscription | null = null;
|
|
64
40
|
protected readonly recorder: IAudioRecorder;
|
|
65
41
|
protected options_: AudioRecorderFileOptions | null = null;
|
|
66
42
|
private isFileOutputEnabled: boolean = false;
|
|
@@ -73,18 +49,16 @@ export default class AudioRecorder {
|
|
|
73
49
|
this.recorder = global.createAudioRecorder();
|
|
74
50
|
}
|
|
75
51
|
|
|
76
|
-
enableFileOutput(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.options_ = options;
|
|
84
|
-
|
|
85
|
-
const parsedOptions = parseFileOptions(options);
|
|
86
|
-
this.recorder.enableFileOutput(parsedOptions);
|
|
52
|
+
enableFileOutput(
|
|
53
|
+
// TODO: Re-enable 'batchDurationSeconds' once supported
|
|
54
|
+
options?: Omit<AudioRecorderFileOptions, 'batchDurationSeconds'>
|
|
55
|
+
): Result<{ path: string }> {
|
|
56
|
+
this.options_ = options || {};
|
|
57
|
+
const parsedOptions = withDefaultOptions(this.options_);
|
|
58
|
+
const result = this.recorder.enableFileOutput(parsedOptions);
|
|
87
59
|
this.isFileOutputEnabled = true;
|
|
60
|
+
|
|
61
|
+
return result;
|
|
88
62
|
}
|
|
89
63
|
|
|
90
64
|
public get options(): AudioRecorderFileOptions | null {
|
|
@@ -98,17 +72,17 @@ export default class AudioRecorder {
|
|
|
98
72
|
}
|
|
99
73
|
|
|
100
74
|
/** Starts the audio recording process with configured output options */
|
|
101
|
-
start(): string
|
|
75
|
+
start(): Result<{ path: string }> {
|
|
102
76
|
if (!this.isFileOutputEnabled) {
|
|
103
77
|
this.recorder.start();
|
|
104
|
-
return;
|
|
78
|
+
return { status: 'success', path: '' };
|
|
105
79
|
}
|
|
106
80
|
|
|
107
81
|
return this.recorder.start();
|
|
108
82
|
}
|
|
109
83
|
|
|
110
84
|
/** Stops the audio recording process and releases internal resources */
|
|
111
|
-
stop(): FileInfo {
|
|
85
|
+
stop(): Result<FileInfo> {
|
|
112
86
|
return this.recorder.stop();
|
|
113
87
|
}
|
|
114
88
|
|
|
@@ -132,17 +106,12 @@ export default class AudioRecorder {
|
|
|
132
106
|
* @throws If the node has already been connected.
|
|
133
107
|
*/
|
|
134
108
|
connect(node: RecorderAdapterNode): void {
|
|
135
|
-
if (this.recorder.isRecording()) {
|
|
136
|
-
throw new Error(
|
|
137
|
-
'Cannot connect adapter node while recording is in progress. Please stop the recorder before connecting new nodes.'
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
109
|
if (node.wasConnected) {
|
|
142
110
|
throw new Error(
|
|
143
111
|
'RecorderAdapterNode cannot be connected more than once. Refer to the documentation for more details.'
|
|
144
112
|
);
|
|
145
113
|
}
|
|
114
|
+
|
|
146
115
|
node.wasConnected = true;
|
|
147
116
|
this.recorder.connect(node.getNode());
|
|
148
117
|
}
|
|
@@ -176,13 +145,7 @@ export default class AudioRecorder {
|
|
|
176
145
|
onAudioReady(
|
|
177
146
|
options: AudioRecorderCallbackOptions,
|
|
178
147
|
callback: (event: OnAudioReadyEventType) => void
|
|
179
|
-
): void {
|
|
180
|
-
if (this.recorder.isRecording()) {
|
|
181
|
-
throw new Error(
|
|
182
|
-
'Cannot set onAudioReady callback while recording is in progress. Please stop the recorder before setting a new callback.'
|
|
183
|
-
);
|
|
184
|
-
}
|
|
185
|
-
|
|
148
|
+
): Result<void> {
|
|
186
149
|
if (this.onAudioReadySubscription) {
|
|
187
150
|
this.recorder.clearOnAudioReady();
|
|
188
151
|
this.onAudioReadySubscription.remove();
|
|
@@ -198,7 +161,7 @@ export default class AudioRecorder {
|
|
|
198
161
|
});
|
|
199
162
|
});
|
|
200
163
|
|
|
201
|
-
this.recorder.setOnAudioReady({
|
|
164
|
+
return this.recorder.setOnAudioReady({
|
|
202
165
|
sampleRate: options.sampleRate,
|
|
203
166
|
bufferLength: options.bufferLength,
|
|
204
167
|
channelCount: options.channelCount,
|
|
@@ -214,12 +177,6 @@ export default class AudioRecorder {
|
|
|
214
177
|
* registered.
|
|
215
178
|
*/
|
|
216
179
|
clearOnAudioReady(): void {
|
|
217
|
-
if (this.recorder.isRecording()) {
|
|
218
|
-
throw new Error(
|
|
219
|
-
'Cannot clear onAudioReady callback while recording is in progress. Please stop the recorder before clearing the callback.'
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
180
|
if (!this.onAudioReadySubscription) {
|
|
224
181
|
return;
|
|
225
182
|
}
|
|
@@ -241,4 +198,32 @@ export default class AudioRecorder {
|
|
|
241
198
|
getCurrentDuration(): number {
|
|
242
199
|
return this.recorder.getCurrentDuration();
|
|
243
200
|
}
|
|
201
|
+
|
|
202
|
+
onError(callback: (error: OnRecorderErrorEventType) => void): void {
|
|
203
|
+
if (this.onErrorSubscription) {
|
|
204
|
+
this.recorder.clearOnError();
|
|
205
|
+
this.onErrorSubscription.remove();
|
|
206
|
+
this.onErrorSubscription = null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
this.onErrorSubscription = this.audioEventEmitter.addAudioEventListener(
|
|
210
|
+
'recorderError',
|
|
211
|
+
callback
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
this.recorder.setOnError({
|
|
215
|
+
callbackId: this.onErrorSubscription.subscriptionId,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
clearOnError(): void {
|
|
220
|
+
if (!this.onErrorSubscription) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
this.recorder.clearOnError();
|
|
225
|
+
|
|
226
|
+
this.onErrorSubscription.remove();
|
|
227
|
+
this.onErrorSubscription = null;
|
|
228
|
+
}
|
|
244
229
|
}
|
|
@@ -1,29 +1,39 @@
|
|
|
1
|
-
import
|
|
1
|
+
import AudioAPIModule from '../AudioAPIModule';
|
|
2
|
+
import {
|
|
3
|
+
InvalidAccessError,
|
|
4
|
+
InvalidStateError,
|
|
5
|
+
NotSupportedError,
|
|
6
|
+
} from '../errors';
|
|
2
7
|
import { IBaseAudioContext } from '../interfaces';
|
|
3
8
|
import {
|
|
4
9
|
AudioBufferBaseSourceNodeOptions,
|
|
10
|
+
AudioWorkletRuntime,
|
|
5
11
|
ContextState,
|
|
12
|
+
ConvolverNodeOptions,
|
|
13
|
+
IIRFilterNodeOptions,
|
|
6
14
|
PeriodicWaveConstraints,
|
|
7
|
-
AudioWorkletRuntime,
|
|
8
15
|
} from '../types';
|
|
9
|
-
import {
|
|
10
|
-
import WorkletSourceNode from './WorkletSourceNode';
|
|
11
|
-
import WorkletProcessingNode from './WorkletProcessingNode';
|
|
16
|
+
import { assertWorkletsEnabled } from '../utils';
|
|
12
17
|
import AnalyserNode from './AnalyserNode';
|
|
13
18
|
import AudioBuffer from './AudioBuffer';
|
|
14
19
|
import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
|
|
15
20
|
import AudioBufferSourceNode from './AudioBufferSourceNode';
|
|
21
|
+
import { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
|
|
16
22
|
import AudioDestinationNode from './AudioDestinationNode';
|
|
17
23
|
import BiquadFilterNode from './BiquadFilterNode';
|
|
18
24
|
import ConstantSourceNode from './ConstantSourceNode';
|
|
25
|
+
import ConvolverNode from './ConvolverNode';
|
|
26
|
+
import DelayNode from './DelayNode';
|
|
19
27
|
import GainNode from './GainNode';
|
|
28
|
+
import IIRFilterNode from './IIRFilterNode';
|
|
20
29
|
import OscillatorNode from './OscillatorNode';
|
|
21
30
|
import PeriodicWave from './PeriodicWave';
|
|
22
31
|
import RecorderAdapterNode from './RecorderAdapterNode';
|
|
23
32
|
import StereoPannerNode from './StereoPannerNode';
|
|
24
33
|
import StreamerNode from './StreamerNode';
|
|
25
34
|
import WorkletNode from './WorkletNode';
|
|
26
|
-
import
|
|
35
|
+
import WorkletProcessingNode from './WorkletProcessingNode';
|
|
36
|
+
import WorkletSourceNode from './WorkletSourceNode';
|
|
27
37
|
|
|
28
38
|
export default class BaseAudioContext {
|
|
29
39
|
readonly destination: AudioDestinationNode;
|
|
@@ -79,14 +89,17 @@ export default class BaseAudioContext {
|
|
|
79
89
|
`The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`
|
|
80
90
|
);
|
|
81
91
|
}
|
|
92
|
+
|
|
82
93
|
if (bufferLength < 1) {
|
|
83
94
|
throw new NotSupportedError(
|
|
84
95
|
`The buffer length provided (${bufferLength}) can not be less than 1`
|
|
85
96
|
);
|
|
86
97
|
}
|
|
87
98
|
|
|
88
|
-
|
|
89
|
-
|
|
99
|
+
assertWorkletsEnabled();
|
|
100
|
+
|
|
101
|
+
const shareableWorklet =
|
|
102
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
90
103
|
(audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
|
|
91
104
|
'worklet';
|
|
92
105
|
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
@@ -95,19 +108,15 @@ export default class BaseAudioContext {
|
|
|
95
108
|
callback(floatAudioData, channelCount);
|
|
96
109
|
}
|
|
97
110
|
);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
107
|
-
}
|
|
108
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
109
|
-
throw new Error(
|
|
110
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
111
|
+
|
|
112
|
+
return new WorkletNode(
|
|
113
|
+
this,
|
|
114
|
+
this.context.createWorkletNode(
|
|
115
|
+
shareableWorklet,
|
|
116
|
+
workletRuntime === 'UIRuntime',
|
|
117
|
+
bufferLength,
|
|
118
|
+
inputChannelCount
|
|
119
|
+
)
|
|
111
120
|
);
|
|
112
121
|
}
|
|
113
122
|
|
|
@@ -120,8 +129,10 @@ export default class BaseAudioContext {
|
|
|
120
129
|
) => void,
|
|
121
130
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
122
131
|
): WorkletProcessingNode {
|
|
123
|
-
|
|
124
|
-
|
|
132
|
+
assertWorkletsEnabled();
|
|
133
|
+
|
|
134
|
+
const shareableWorklet =
|
|
135
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
125
136
|
(
|
|
126
137
|
inputBuffers: Array<ArrayBuffer>,
|
|
127
138
|
outputBuffers: Array<ArrayBuffer>,
|
|
@@ -138,17 +149,13 @@ export default class BaseAudioContext {
|
|
|
138
149
|
callback(inputData, outputData, framesToProcess, currentTime);
|
|
139
150
|
}
|
|
140
151
|
);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
)
|
|
148
|
-
}
|
|
149
|
-
/// User does not have worklets as a dependency so he cannot use the worklet API.
|
|
150
|
-
throw new Error(
|
|
151
|
-
'[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
|
|
152
|
+
|
|
153
|
+
return new WorkletProcessingNode(
|
|
154
|
+
this,
|
|
155
|
+
this.context.createWorkletProcessingNode(
|
|
156
|
+
shareableWorklet,
|
|
157
|
+
workletRuntime === 'UIRuntime'
|
|
158
|
+
)
|
|
152
159
|
);
|
|
153
160
|
}
|
|
154
161
|
|
|
@@ -161,26 +168,23 @@ export default class BaseAudioContext {
|
|
|
161
168
|
) => void,
|
|
162
169
|
workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
|
|
163
170
|
): WorkletSourceNode {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
171
|
+
assertWorkletsEnabled();
|
|
172
|
+
const shareableWorklet =
|
|
173
|
+
AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
|
|
174
|
+
(
|
|
175
|
+
audioBuffers: Array<ArrayBuffer>,
|
|
176
|
+
framesToProcess: number,
|
|
177
|
+
currentTime: number,
|
|
178
|
+
startOffset: number
|
|
179
|
+
) => {
|
|
180
|
+
'worklet';
|
|
181
|
+
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
182
|
+
(buffer) => new Float32Array(buffer)
|
|
183
|
+
);
|
|
184
|
+
callback(floatAudioData, framesToProcess, currentTime, startOffset);
|
|
185
|
+
}
|
|
168
186
|
);
|
|
169
|
-
|
|
170
|
-
const shareableWorklet = workletsModule.makeShareableCloneRecursive(
|
|
171
|
-
(
|
|
172
|
-
audioBuffers: Array<ArrayBuffer>,
|
|
173
|
-
framesToProcess: number,
|
|
174
|
-
currentTime: number,
|
|
175
|
-
startOffset: number
|
|
176
|
-
) => {
|
|
177
|
-
'worklet';
|
|
178
|
-
const floatAudioData: Array<Float32Array> = audioBuffers.map(
|
|
179
|
-
(buffer) => new Float32Array(buffer)
|
|
180
|
-
);
|
|
181
|
-
callback(floatAudioData, framesToProcess, currentTime, startOffset);
|
|
182
|
-
}
|
|
183
|
-
);
|
|
187
|
+
|
|
184
188
|
return new WorkletSourceNode(
|
|
185
189
|
this,
|
|
186
190
|
this.context.createWorkletSourceNode(
|
|
@@ -199,7 +203,11 @@ export default class BaseAudioContext {
|
|
|
199
203
|
}
|
|
200
204
|
|
|
201
205
|
createStreamer(): StreamerNode {
|
|
202
|
-
|
|
206
|
+
const streamer = this.context.createStreamer();
|
|
207
|
+
if (!streamer) {
|
|
208
|
+
throw new NotSupportedError('StreamerNode requires FFmpeg build');
|
|
209
|
+
}
|
|
210
|
+
return new StreamerNode(this, streamer);
|
|
203
211
|
}
|
|
204
212
|
|
|
205
213
|
createConstantSource(): ConstantSourceNode {
|
|
@@ -210,6 +218,11 @@ export default class BaseAudioContext {
|
|
|
210
218
|
return new GainNode(this, this.context.createGain());
|
|
211
219
|
}
|
|
212
220
|
|
|
221
|
+
createDelay(maxDelayTime?: number): DelayNode {
|
|
222
|
+
const maxTime = maxDelayTime ?? 1.0;
|
|
223
|
+
return new DelayNode(this, this.context.createDelay(maxTime));
|
|
224
|
+
}
|
|
225
|
+
|
|
213
226
|
createStereoPanner(): StereoPannerNode {
|
|
214
227
|
return new StereoPannerNode(this, this.context.createStereoPanner());
|
|
215
228
|
}
|
|
@@ -218,6 +231,38 @@ export default class BaseAudioContext {
|
|
|
218
231
|
return new BiquadFilterNode(this, this.context.createBiquadFilter());
|
|
219
232
|
}
|
|
220
233
|
|
|
234
|
+
createIIRFilter(options: IIRFilterNodeOptions): IIRFilterNode {
|
|
235
|
+
const feedforward = options.feedforward;
|
|
236
|
+
const feedback = options.feedback;
|
|
237
|
+
if (feedforward.length < 1 || feedforward.length > 20) {
|
|
238
|
+
throw new NotSupportedError(
|
|
239
|
+
`The provided feedforward array has length (${feedforward.length}) outside the range [1, 20]`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
if (feedback.length < 1 || feedback.length > 20) {
|
|
243
|
+
throw new NotSupportedError(
|
|
244
|
+
`The provided feedback array has length (${feedback.length}) outside the range [1, 20]`
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (feedforward.every((value) => value === 0)) {
|
|
249
|
+
throw new InvalidStateError(
|
|
250
|
+
`Feedforward array must contain at least one non-zero value`
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (feedback[0] === 0) {
|
|
255
|
+
throw new InvalidStateError(
|
|
256
|
+
`First value of feedback array cannot be zero`
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return new IIRFilterNode(
|
|
261
|
+
this,
|
|
262
|
+
this.context.createIIRFilter(feedforward, feedback)
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
221
266
|
createBufferSource(
|
|
222
267
|
options?: AudioBufferBaseSourceNodeOptions
|
|
223
268
|
): AudioBufferSourceNode {
|
|
@@ -289,4 +334,25 @@ export default class BaseAudioContext {
|
|
|
289
334
|
createAnalyser(): AnalyserNode {
|
|
290
335
|
return new AnalyserNode(this, this.context.createAnalyser());
|
|
291
336
|
}
|
|
337
|
+
|
|
338
|
+
createConvolver(options?: ConvolverNodeOptions): ConvolverNode {
|
|
339
|
+
if (options?.buffer) {
|
|
340
|
+
const numberOfChannels = options.buffer.numberOfChannels;
|
|
341
|
+
if (
|
|
342
|
+
numberOfChannels !== 1 &&
|
|
343
|
+
numberOfChannels !== 2 &&
|
|
344
|
+
numberOfChannels !== 4
|
|
345
|
+
) {
|
|
346
|
+
throw new NotSupportedError(
|
|
347
|
+
`The number of channels provided (${numberOfChannels}) in impulse response for ConvolverNode buffer must be 1 or 2 or 4.`
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const buffer = options?.buffer ?? null;
|
|
352
|
+
const disableNormalization = options?.disableNormalization ?? false;
|
|
353
|
+
return new ConvolverNode(
|
|
354
|
+
this,
|
|
355
|
+
this.context.createConvolver(buffer?.buffer, disableNormalization)
|
|
356
|
+
);
|
|
357
|
+
}
|
|
292
358
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { IConvolverNode } from '../interfaces';
|
|
2
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
3
|
+
import AudioNode from './AudioNode';
|
|
4
|
+
import AudioBuffer from './AudioBuffer';
|
|
5
|
+
|
|
6
|
+
export default class ConvolverNode extends AudioNode {
|
|
7
|
+
constructor(context: BaseAudioContext, node: IConvolverNode) {
|
|
8
|
+
super(context, node);
|
|
9
|
+
this.normalize = node.normalize;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public get buffer(): AudioBuffer | null {
|
|
13
|
+
const buffer = (this.node as IConvolverNode).buffer;
|
|
14
|
+
if (!buffer) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return new AudioBuffer(buffer);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public set buffer(buffer: AudioBuffer | null) {
|
|
21
|
+
if (!buffer) {
|
|
22
|
+
(this.node as IConvolverNode).setBuffer(null);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
(this.node as IConvolverNode).setBuffer(buffer.buffer);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public get normalize(): boolean {
|
|
29
|
+
return (this.node as IConvolverNode).normalize;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public set normalize(value: boolean) {
|
|
33
|
+
(this.node as IConvolverNode).normalize = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IDelayNode } from '../interfaces';
|
|
2
|
+
import AudioNode from './AudioNode';
|
|
3
|
+
import AudioParam from './AudioParam';
|
|
4
|
+
import BaseAudioContext from './BaseAudioContext';
|
|
5
|
+
|
|
6
|
+
export default class DelayNode extends AudioNode {
|
|
7
|
+
readonly delayTime: AudioParam;
|
|
8
|
+
|
|
9
|
+
constructor(context: BaseAudioContext, delay: IDelayNode) {
|
|
10
|
+
super(context, delay);
|
|
11
|
+
this.delayTime = new AudioParam(delay.delayTime, context);
|
|
12
|
+
}
|
|
13
|
+
}
|