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
|
@@ -1,29 +1,55 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2010 Google Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
|
5
|
+
* modification, are permitted provided that the following conditions
|
|
6
|
+
* are met:
|
|
7
|
+
*
|
|
8
|
+
* 1. Redistributions of source code must retain the above copyright
|
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
|
10
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
12
|
+
* documentation and/or other materials provided with the distribution.
|
|
13
|
+
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
|
|
14
|
+
* its contributors may be used to endorse or promote products derived
|
|
15
|
+
* from this software without specific prior written permission.
|
|
16
|
+
*
|
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
|
|
18
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
19
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
20
|
+
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
21
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
22
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
23
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
24
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
25
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
26
|
+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
1
29
|
#include <audioapi/core/BaseAudioContext.h>
|
|
2
30
|
#include <audioapi/core/effects/BiquadFilterNode.h>
|
|
3
31
|
#include <audioapi/utils/AudioArray.h>
|
|
4
32
|
#include <audioapi/utils/AudioBus.h>
|
|
33
|
+
#include <memory>
|
|
34
|
+
#include <string>
|
|
5
35
|
|
|
6
36
|
// https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html - math
|
|
7
37
|
// formulas for filters
|
|
8
38
|
|
|
9
39
|
namespace audioapi {
|
|
10
40
|
|
|
11
|
-
BiquadFilterNode::BiquadFilterNode(BaseAudioContext *context)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
350.0, 0.0f, context->getNyquistFrequency(), context);
|
|
41
|
+
BiquadFilterNode::BiquadFilterNode(BaseAudioContext *context) : AudioNode(context) {
|
|
42
|
+
frequencyParam_ =
|
|
43
|
+
std::make_shared<AudioParam>(350.0, 0.0f, context->getNyquistFrequency(), context);
|
|
15
44
|
detuneParam_ = std::make_shared<AudioParam>(
|
|
16
|
-
0.
|
|
45
|
+
0.0f,
|
|
17
46
|
-1200 * LOG2_MOST_POSITIVE_SINGLE_FLOAT,
|
|
18
47
|
1200 * LOG2_MOST_POSITIVE_SINGLE_FLOAT,
|
|
19
48
|
context);
|
|
20
49
|
QParam_ = std::make_shared<AudioParam>(
|
|
21
|
-
1.
|
|
50
|
+
1.0f, MOST_NEGATIVE_SINGLE_FLOAT, MOST_POSITIVE_SINGLE_FLOAT, context);
|
|
22
51
|
gainParam_ = std::make_shared<AudioParam>(
|
|
23
|
-
0.
|
|
24
|
-
MOST_NEGATIVE_SINGLE_FLOAT,
|
|
25
|
-
40 * LOG10_MOST_POSITIVE_SINGLE_FLOAT,
|
|
26
|
-
context);
|
|
52
|
+
0.0f, MOST_NEGATIVE_SINGLE_FLOAT, 40 * LOG10_MOST_POSITIVE_SINGLE_FLOAT, context);
|
|
27
53
|
type_ = BiquadFilterType::LOWPASS;
|
|
28
54
|
isInitialized_ = true;
|
|
29
55
|
channelCountMode_ = ChannelCountMode::MAX;
|
|
@@ -76,30 +102,36 @@ void BiquadFilterNode::getFrequencyResponse(
|
|
|
76
102
|
const float *frequencyArray,
|
|
77
103
|
float *magResponseOutput,
|
|
78
104
|
float *phaseResponseOutput,
|
|
79
|
-
const
|
|
105
|
+
const size_t length) {
|
|
106
|
+
#ifndef AUDIO_API_TEST_SUITE
|
|
80
107
|
applyFilter();
|
|
108
|
+
#endif
|
|
81
109
|
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
110
|
+
// Use double precision for later calculations
|
|
111
|
+
double b0 = static_cast<double>(b0_);
|
|
112
|
+
double b1 = static_cast<double>(b1_);
|
|
113
|
+
double b2 = static_cast<double>(b2_);
|
|
114
|
+
double a1 = static_cast<double>(a1_);
|
|
115
|
+
double a2 = static_cast<double>(a2_);
|
|
116
|
+
|
|
117
|
+
float nyquist = context_->getNyquistFrequency();
|
|
88
118
|
|
|
89
119
|
for (size_t i = 0; i < length; i++) {
|
|
90
|
-
|
|
120
|
+
// Convert from frequency in Hz to normalized frequency [0, 1]
|
|
121
|
+
float normalizedFreq = frequencyArray[i] / nyquist;
|
|
122
|
+
|
|
123
|
+
if (normalizedFreq < 0.0f || normalizedFreq > 1.0f) {
|
|
124
|
+
// Out-of-bounds frequencies should return NaN.
|
|
91
125
|
magResponseOutput[i] = std::nanf("");
|
|
92
126
|
phaseResponseOutput[i] = std::nanf("");
|
|
93
127
|
continue;
|
|
94
128
|
}
|
|
95
129
|
|
|
96
|
-
|
|
97
|
-
auto z = std::complex<
|
|
98
|
-
auto response = (b0 + (b1 + b2 * z) * z) /
|
|
99
|
-
(std::complex<float>(1, 0) + (a1 + a2 * z) * z);
|
|
130
|
+
double omega = -PI * normalizedFreq;
|
|
131
|
+
auto z = std::complex<double>(std::cos(omega), std::sin(omega));
|
|
132
|
+
auto response = (b0 + (b1 + b2 * z) * z) / (std::complex<double>(1, 0) + (a1 + a2 * z) * z);
|
|
100
133
|
magResponseOutput[i] = static_cast<float>(std::abs(response));
|
|
101
|
-
phaseResponseOutput[i] =
|
|
102
|
-
static_cast<float>(atan2(imag(response), real(response)));
|
|
134
|
+
phaseResponseOutput[i] = static_cast<float>(atan2(imag(response), real(response)));
|
|
103
135
|
}
|
|
104
136
|
}
|
|
105
137
|
|
|
@@ -120,17 +152,16 @@ void BiquadFilterNode::setNormalizedCoefficients(
|
|
|
120
152
|
|
|
121
153
|
void BiquadFilterNode::setLowpassCoefficients(float frequency, float Q) {
|
|
122
154
|
// Limit frequency to [0, 1] range
|
|
123
|
-
if (frequency >= 1.
|
|
155
|
+
if (frequency >= 1.0f) {
|
|
124
156
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
125
157
|
return;
|
|
126
158
|
}
|
|
127
159
|
|
|
128
|
-
if (frequency <= 0.
|
|
160
|
+
if (frequency <= 0.0f) {
|
|
129
161
|
setNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
130
162
|
return;
|
|
131
163
|
}
|
|
132
164
|
|
|
133
|
-
Q = std::max(0.0f, Q);
|
|
134
165
|
float g = std::pow(10.0f, 0.05f * Q);
|
|
135
166
|
|
|
136
167
|
float theta = PI * frequency;
|
|
@@ -138,21 +169,19 @@ void BiquadFilterNode::setLowpassCoefficients(float frequency, float Q) {
|
|
|
138
169
|
float cosW = std::cos(theta);
|
|
139
170
|
float beta = (1 - cosW) / 2;
|
|
140
171
|
|
|
141
|
-
setNormalizedCoefficients(
|
|
142
|
-
beta, 2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
172
|
+
setNormalizedCoefficients(beta, 2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
143
173
|
}
|
|
144
174
|
|
|
145
175
|
void BiquadFilterNode::setHighpassCoefficients(float frequency, float Q) {
|
|
146
|
-
if (frequency >= 1.
|
|
176
|
+
if (frequency >= 1.0f) {
|
|
147
177
|
setNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
148
178
|
return;
|
|
149
179
|
}
|
|
150
|
-
if (frequency <= 0.
|
|
180
|
+
if (frequency <= 0.0f) {
|
|
151
181
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
152
182
|
return;
|
|
153
183
|
}
|
|
154
184
|
|
|
155
|
-
Q = std::max(0.0f, Q);
|
|
156
185
|
float g = std::pow(10.0f, 0.05f * Q);
|
|
157
186
|
|
|
158
187
|
float theta = PI * frequency;
|
|
@@ -160,19 +189,18 @@ void BiquadFilterNode::setHighpassCoefficients(float frequency, float Q) {
|
|
|
160
189
|
float cosW = std::cos(theta);
|
|
161
190
|
float beta = (1 + cosW) / 2;
|
|
162
191
|
|
|
163
|
-
setNormalizedCoefficients(
|
|
164
|
-
beta, -2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
192
|
+
setNormalizedCoefficients(beta, -2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
165
193
|
}
|
|
166
194
|
|
|
167
195
|
void BiquadFilterNode::setBandpassCoefficients(float frequency, float Q) {
|
|
168
196
|
// Limit frequency to [0, 1] range
|
|
169
|
-
if (frequency <= 0.
|
|
197
|
+
if (frequency <= 0.0f || frequency >= 1.0f) {
|
|
170
198
|
setNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
171
199
|
return;
|
|
172
200
|
}
|
|
173
201
|
|
|
174
202
|
// Limit Q to positive values
|
|
175
|
-
if (Q <= 0.
|
|
203
|
+
if (Q <= 0.0f) {
|
|
176
204
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
177
205
|
return;
|
|
178
206
|
}
|
|
@@ -181,19 +209,18 @@ void BiquadFilterNode::setBandpassCoefficients(float frequency, float Q) {
|
|
|
181
209
|
float alpha = std::sin(w0) / (2 * Q);
|
|
182
210
|
float cosW = std::cos(w0);
|
|
183
211
|
|
|
184
|
-
setNormalizedCoefficients(
|
|
185
|
-
alpha, 0.0f, -alpha, 1.0f + alpha, -2 * cosW, 1.0f - alpha);
|
|
212
|
+
setNormalizedCoefficients(alpha, 0.0f, -alpha, 1.0f + alpha, -2 * cosW, 1.0f - alpha);
|
|
186
213
|
}
|
|
187
214
|
|
|
188
215
|
void BiquadFilterNode::setLowshelfCoefficients(float frequency, float gain) {
|
|
189
216
|
float A = std::pow(10.0f, gain / 40.0f);
|
|
190
217
|
|
|
191
|
-
if (frequency >= 1.
|
|
218
|
+
if (frequency >= 1.0f) {
|
|
192
219
|
setNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
193
220
|
return;
|
|
194
221
|
}
|
|
195
222
|
|
|
196
|
-
if (frequency <= 0.
|
|
223
|
+
if (frequency <= 0.0f) {
|
|
197
224
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
198
225
|
return;
|
|
199
226
|
}
|
|
@@ -215,12 +242,12 @@ void BiquadFilterNode::setLowshelfCoefficients(float frequency, float gain) {
|
|
|
215
242
|
void BiquadFilterNode::setHighshelfCoefficients(float frequency, float gain) {
|
|
216
243
|
float A = std::pow(10.0f, gain / 40.0f);
|
|
217
244
|
|
|
218
|
-
if (frequency >= 1.
|
|
245
|
+
if (frequency >= 1.0f) {
|
|
219
246
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
220
247
|
return;
|
|
221
248
|
}
|
|
222
249
|
|
|
223
|
-
if (frequency <= 0.
|
|
250
|
+
if (frequency <= 0.0f) {
|
|
224
251
|
setNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
225
252
|
return;
|
|
226
253
|
}
|
|
@@ -241,18 +268,15 @@ void BiquadFilterNode::setHighshelfCoefficients(float frequency, float gain) {
|
|
|
241
268
|
A + 1 - (A - 1) * cosW - gamma);
|
|
242
269
|
}
|
|
243
270
|
|
|
244
|
-
void BiquadFilterNode::setPeakingCoefficients(
|
|
245
|
-
float frequency,
|
|
246
|
-
float Q,
|
|
247
|
-
float gain) {
|
|
271
|
+
void BiquadFilterNode::setPeakingCoefficients(float frequency, float Q, float gain) {
|
|
248
272
|
float A = std::pow(10.0f, gain / 40.0f);
|
|
249
273
|
|
|
250
|
-
if (frequency <= 0.
|
|
274
|
+
if (frequency <= 0.0f || frequency >= 1.0f) {
|
|
251
275
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
252
276
|
return;
|
|
253
277
|
}
|
|
254
278
|
|
|
255
|
-
if (Q <= 0.
|
|
279
|
+
if (Q <= 0.0f) {
|
|
256
280
|
setNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
257
281
|
return;
|
|
258
282
|
}
|
|
@@ -262,21 +286,16 @@ void BiquadFilterNode::setPeakingCoefficients(
|
|
|
262
286
|
float cosW = std::cos(w0);
|
|
263
287
|
|
|
264
288
|
setNormalizedCoefficients(
|
|
265
|
-
1 + alpha * A,
|
|
266
|
-
-2 * cosW,
|
|
267
|
-
1 - alpha * A,
|
|
268
|
-
1 + alpha / A,
|
|
269
|
-
-2 * cosW,
|
|
270
|
-
1 - alpha / A);
|
|
289
|
+
1 + alpha * A, -2 * cosW, 1 - alpha * A, 1 + alpha / A, -2 * cosW, 1 - alpha / A);
|
|
271
290
|
}
|
|
272
291
|
|
|
273
292
|
void BiquadFilterNode::setNotchCoefficients(float frequency, float Q) {
|
|
274
|
-
if (frequency <= 0.
|
|
293
|
+
if (frequency <= 0.0f || frequency >= 1.0f) {
|
|
275
294
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
276
295
|
return;
|
|
277
296
|
}
|
|
278
297
|
|
|
279
|
-
if (Q <= 0.
|
|
298
|
+
if (Q <= 0.0f) {
|
|
280
299
|
setNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
281
300
|
return;
|
|
282
301
|
}
|
|
@@ -285,17 +304,16 @@ void BiquadFilterNode::setNotchCoefficients(float frequency, float Q) {
|
|
|
285
304
|
float alpha = std::sin(w0) / (2 * Q);
|
|
286
305
|
float cosW = std::cos(w0);
|
|
287
306
|
|
|
288
|
-
setNormalizedCoefficients(
|
|
289
|
-
1.0f, -2 * cosW, 1.0f, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
307
|
+
setNormalizedCoefficients(1.0f, -2 * cosW, 1.0f, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
290
308
|
}
|
|
291
309
|
|
|
292
310
|
void BiquadFilterNode::setAllpassCoefficients(float frequency, float Q) {
|
|
293
|
-
if (frequency <= 0.
|
|
311
|
+
if (frequency <= 0.0f || frequency >= 1.0f) {
|
|
294
312
|
setNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
295
313
|
return;
|
|
296
314
|
}
|
|
297
315
|
|
|
298
|
-
if (Q <= 0.
|
|
316
|
+
if (Q <= 0.0f) {
|
|
299
317
|
setNormalizedCoefficients(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
|
|
300
318
|
return;
|
|
301
319
|
}
|
|
@@ -304,20 +322,20 @@ void BiquadFilterNode::setAllpassCoefficients(float frequency, float Q) {
|
|
|
304
322
|
float alpha = std::sin(w0) / (2 * Q);
|
|
305
323
|
float cosW = std::cos(w0);
|
|
306
324
|
|
|
307
|
-
setNormalizedCoefficients(
|
|
308
|
-
1 - alpha, -2 * cosW, 1 + alpha, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
325
|
+
setNormalizedCoefficients(1 - alpha, -2 * cosW, 1 + alpha, 1 + alpha, -2 * cosW, 1 - alpha);
|
|
309
326
|
}
|
|
310
327
|
|
|
311
328
|
void BiquadFilterNode::applyFilter() {
|
|
312
329
|
double currentTime = context_->getCurrentTime();
|
|
313
330
|
|
|
314
|
-
float frequency =
|
|
315
|
-
|
|
316
|
-
float detune =
|
|
317
|
-
detuneParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);
|
|
331
|
+
float frequency = frequencyParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);
|
|
332
|
+
float detune = detuneParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);
|
|
318
333
|
auto Q = QParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);
|
|
319
334
|
auto gain = gainParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);
|
|
320
335
|
|
|
336
|
+
// NyquistFrequency is half of the sample rate.
|
|
337
|
+
// Normalized frequency is therefore:
|
|
338
|
+
// frequency / (sampleRate / 2) = (2 * frequency) / sampleRate
|
|
321
339
|
float normalizedFrequency = frequency / context_->getNyquistFrequency();
|
|
322
340
|
if (detune != 0.0f) {
|
|
323
341
|
normalizedFrequency *= std::pow(2.0f, detune / 1200.0f);
|
|
@@ -1,8 +1,39 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2010 Google Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
|
5
|
+
* modification, are permitted provided that the following conditions
|
|
6
|
+
* are met:
|
|
7
|
+
*
|
|
8
|
+
* 1. Redistributions of source code must retain the above copyright
|
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
|
10
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
12
|
+
* documentation and/or other materials provided with the distribution.
|
|
13
|
+
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
|
|
14
|
+
* its contributors may be used to endorse or promote products derived
|
|
15
|
+
* from this software without specific prior written permission.
|
|
16
|
+
*
|
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
|
|
18
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
19
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
20
|
+
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
|
|
21
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
22
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
23
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
24
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
25
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
26
|
+
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
1
29
|
#pragma once
|
|
2
30
|
|
|
3
31
|
#include <audioapi/core/AudioNode.h>
|
|
4
32
|
#include <audioapi/core/AudioParam.h>
|
|
5
33
|
#include <audioapi/core/types/BiquadFilterType.h>
|
|
34
|
+
#ifdef AUDIO_API_TEST_SUITE
|
|
35
|
+
#include <gtest/gtest_prod.h>
|
|
36
|
+
#endif
|
|
6
37
|
|
|
7
38
|
#include <algorithm>
|
|
8
39
|
#include <cmath>
|
|
@@ -17,6 +48,11 @@ namespace audioapi {
|
|
|
17
48
|
class AudioBus;
|
|
18
49
|
|
|
19
50
|
class BiquadFilterNode : public AudioNode {
|
|
51
|
+
#ifdef AUDIO_API_TEST_SUITE
|
|
52
|
+
friend class BiquadFilterTest;
|
|
53
|
+
FRIEND_TEST(BiquadFilterTest, GetFrequencyResponse);
|
|
54
|
+
#endif
|
|
55
|
+
|
|
20
56
|
public:
|
|
21
57
|
explicit BiquadFilterNode(BaseAudioContext *context);
|
|
22
58
|
|
|
@@ -30,7 +66,7 @@ class BiquadFilterNode : public AudioNode {
|
|
|
30
66
|
const float *frequencyArray,
|
|
31
67
|
float *magResponseOutput,
|
|
32
68
|
float *phaseResponseOutput,
|
|
33
|
-
|
|
69
|
+
size_t length);
|
|
34
70
|
|
|
35
71
|
protected:
|
|
36
72
|
std::shared_ptr<AudioBus> processNode(
|
|
@@ -59,8 +95,7 @@ class BiquadFilterNode : public AudioNode {
|
|
|
59
95
|
|
|
60
96
|
static BiquadFilterType fromString(const std::string &type) {
|
|
61
97
|
std::string lowerType = type;
|
|
62
|
-
std::transform(
|
|
63
|
-
lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
|
|
98
|
+
std::transform(lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
|
|
64
99
|
|
|
65
100
|
if (lowerType == "lowpass")
|
|
66
101
|
return BiquadFilterType::LOWPASS;
|
|
@@ -105,13 +140,7 @@ class BiquadFilterNode : public AudioNode {
|
|
|
105
140
|
}
|
|
106
141
|
}
|
|
107
142
|
|
|
108
|
-
void setNormalizedCoefficients(
|
|
109
|
-
float b0,
|
|
110
|
-
float b1,
|
|
111
|
-
float b2,
|
|
112
|
-
float a0,
|
|
113
|
-
float a1,
|
|
114
|
-
float a2);
|
|
143
|
+
void setNormalizedCoefficients(float b0, float b1, float b2, float a0, float a1, float a2);
|
|
115
144
|
void setLowpassCoefficients(float frequency, float Q);
|
|
116
145
|
void setHighpassCoefficients(float frequency, float Q);
|
|
117
146
|
void setBandpassCoefficients(float frequency, float Q);
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#include <audioapi/core/BaseAudioContext.h>
|
|
2
|
+
#include <audioapi/core/effects/ConvolverNode.h>
|
|
3
|
+
#include <audioapi/core/sources/AudioBuffer.h>
|
|
4
|
+
#include <audioapi/core/utils/Constants.h>
|
|
5
|
+
#include <audioapi/dsp/AudioUtils.h>
|
|
6
|
+
#include <audioapi/dsp/FFT.h>
|
|
7
|
+
#include <audioapi/utils/AudioArray.h>
|
|
8
|
+
#include <iostream>
|
|
9
|
+
#include <memory>
|
|
10
|
+
#include <thread>
|
|
11
|
+
#include <vector>
|
|
12
|
+
|
|
13
|
+
namespace audioapi {
|
|
14
|
+
ConvolverNode::ConvolverNode(
|
|
15
|
+
BaseAudioContext *context,
|
|
16
|
+
const std::shared_ptr<AudioBuffer> &buffer,
|
|
17
|
+
bool disableNormalization)
|
|
18
|
+
: AudioNode(context),
|
|
19
|
+
remainingSegments_(0),
|
|
20
|
+
internalBufferIndex_(0),
|
|
21
|
+
signalledToStop_(false),
|
|
22
|
+
scaleFactor_(1.0f),
|
|
23
|
+
intermediateBus_(nullptr),
|
|
24
|
+
buffer_(nullptr),
|
|
25
|
+
internalBuffer_(nullptr) {
|
|
26
|
+
channelCount_ = 2;
|
|
27
|
+
channelCountMode_ = ChannelCountMode::CLAMPED_MAX;
|
|
28
|
+
normalize_ = !disableNormalization;
|
|
29
|
+
gainCalibrationSampleRate_ = context->getSampleRate();
|
|
30
|
+
setBuffer(buffer);
|
|
31
|
+
audioBus_ =
|
|
32
|
+
std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, context->getSampleRate());
|
|
33
|
+
requiresTailProcessing_ = true;
|
|
34
|
+
isInitialized_ = true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
bool ConvolverNode::getNormalize_() const {
|
|
38
|
+
return normalize_;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const std::shared_ptr<AudioBuffer> &ConvolverNode::getBuffer() const {
|
|
42
|
+
return buffer_;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void ConvolverNode::setNormalize(bool normalize) {
|
|
46
|
+
if (normalize_ != normalize) {
|
|
47
|
+
normalize_ = normalize;
|
|
48
|
+
if (normalize_ && buffer_)
|
|
49
|
+
calculateNormalizationScale();
|
|
50
|
+
}
|
|
51
|
+
if (!normalize_) {
|
|
52
|
+
scaleFactor_ = 1.0f;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void ConvolverNode::setBuffer(const std::shared_ptr<AudioBuffer> &buffer) {
|
|
57
|
+
if (buffer_ != buffer && buffer != nullptr) {
|
|
58
|
+
buffer_ = buffer;
|
|
59
|
+
if (normalize_)
|
|
60
|
+
calculateNormalizationScale();
|
|
61
|
+
threadPool_ = std::make_shared<ThreadPool>(4);
|
|
62
|
+
convolvers_.clear();
|
|
63
|
+
for (int i = 0; i < buffer->getNumberOfChannels(); ++i) {
|
|
64
|
+
convolvers_.emplace_back();
|
|
65
|
+
AudioArray channelData(buffer->getLength());
|
|
66
|
+
memcpy(channelData.getData(), buffer->getChannelData(i), buffer->getLength() * sizeof(float));
|
|
67
|
+
convolvers_.back().init(RENDER_QUANTUM_SIZE, channelData, buffer->getLength());
|
|
68
|
+
}
|
|
69
|
+
if (buffer->getNumberOfChannels() == 1) {
|
|
70
|
+
// add one more convolver, because right now input is always stereo
|
|
71
|
+
convolvers_.emplace_back();
|
|
72
|
+
AudioArray channelData(buffer->getLength());
|
|
73
|
+
memcpy(channelData.getData(), buffer->getChannelData(0), buffer->getLength() * sizeof(float));
|
|
74
|
+
convolvers_.back().init(RENDER_QUANTUM_SIZE, channelData, buffer->getLength());
|
|
75
|
+
}
|
|
76
|
+
internalBuffer_ =
|
|
77
|
+
std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE * 2, channelCount_, buffer->getSampleRate());
|
|
78
|
+
intermediateBus_ = std::make_shared<AudioBus>(
|
|
79
|
+
RENDER_QUANTUM_SIZE, convolvers_.size(), buffer->getSampleRate());
|
|
80
|
+
internalBufferIndex_ = 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void ConvolverNode::onInputDisabled() {
|
|
85
|
+
numberOfEnabledInputNodes_ -= 1;
|
|
86
|
+
if (isEnabled() && numberOfEnabledInputNodes_ == 0) {
|
|
87
|
+
signalledToStop_ = true;
|
|
88
|
+
remainingSegments_ = convolvers_.at(0).getSegCount();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
std::shared_ptr<AudioBus> ConvolverNode::processInputs(
|
|
93
|
+
const std::shared_ptr<AudioBus> &outputBus,
|
|
94
|
+
int framesToProcess,
|
|
95
|
+
bool checkIsAlreadyProcessed) {
|
|
96
|
+
if (internalBufferIndex_ < framesToProcess) {
|
|
97
|
+
return AudioNode::processInputs(outputBus, RENDER_QUANTUM_SIZE, false);
|
|
98
|
+
}
|
|
99
|
+
return AudioNode::processInputs(outputBus, 0, false);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// processing pipeline: processingBus -> intermediateBus_ -> audioBus_ (mixing
|
|
103
|
+
// with intermediateBus_)
|
|
104
|
+
std::shared_ptr<AudioBus> ConvolverNode::processNode(
|
|
105
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
106
|
+
int framesToProcess) {
|
|
107
|
+
if (signalledToStop_) {
|
|
108
|
+
if (remainingSegments_ > 0) {
|
|
109
|
+
remainingSegments_--;
|
|
110
|
+
} else {
|
|
111
|
+
disable();
|
|
112
|
+
signalledToStop_ = false;
|
|
113
|
+
internalBufferIndex_ = 0;
|
|
114
|
+
return processingBus;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (internalBufferIndex_ < framesToProcess) {
|
|
118
|
+
performConvolution(processingBus); // result returned to intermediateBus_
|
|
119
|
+
audioBus_->sum(intermediateBus_.get());
|
|
120
|
+
|
|
121
|
+
internalBuffer_->copy(audioBus_.get(), 0, internalBufferIndex_, RENDER_QUANTUM_SIZE);
|
|
122
|
+
internalBufferIndex_ += RENDER_QUANTUM_SIZE;
|
|
123
|
+
}
|
|
124
|
+
audioBus_->zero();
|
|
125
|
+
audioBus_->copy(internalBuffer_.get(), 0, 0, framesToProcess);
|
|
126
|
+
int remainingFrames = internalBufferIndex_ - framesToProcess;
|
|
127
|
+
if (remainingFrames > 0) {
|
|
128
|
+
for (int i = 0; i < internalBuffer_->getNumberOfChannels(); ++i) {
|
|
129
|
+
memmove(
|
|
130
|
+
internalBuffer_->getChannel(i)->getData(),
|
|
131
|
+
internalBuffer_->getChannel(i)->getData() + framesToProcess,
|
|
132
|
+
remainingFrames * sizeof(float));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
internalBufferIndex_ -= framesToProcess;
|
|
136
|
+
|
|
137
|
+
for (int i = 0; i < audioBus_->getNumberOfChannels(); ++i) {
|
|
138
|
+
dsp::multiplyByScalar(
|
|
139
|
+
audioBus_->getChannel(i)->getData(),
|
|
140
|
+
scaleFactor_,
|
|
141
|
+
audioBus_->getChannel(i)->getData(),
|
|
142
|
+
framesToProcess);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return audioBus_;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void ConvolverNode::calculateNormalizationScale() {
|
|
149
|
+
int numberOfChannels = buffer_->getNumberOfChannels();
|
|
150
|
+
int length = buffer_->getLength();
|
|
151
|
+
|
|
152
|
+
float power = 0;
|
|
153
|
+
|
|
154
|
+
for (int channel = 0; channel < numberOfChannels; ++channel) {
|
|
155
|
+
float channelPower = 0;
|
|
156
|
+
auto channelData = buffer_->getChannelData(channel);
|
|
157
|
+
for (int i = 0; i < length; ++i) {
|
|
158
|
+
float sample = channelData[i];
|
|
159
|
+
channelPower += sample * sample;
|
|
160
|
+
}
|
|
161
|
+
power += channelPower;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
power = std::sqrt(power / (numberOfChannels * length));
|
|
165
|
+
if (power < MIN_IR_POWER) {
|
|
166
|
+
power = MIN_IR_POWER;
|
|
167
|
+
}
|
|
168
|
+
scaleFactor_ = 1 / power;
|
|
169
|
+
scaleFactor_ *= std::pow(10, GAIN_CALIBRATION * 0.05f);
|
|
170
|
+
scaleFactor_ *= gainCalibrationSampleRate_ / buffer_->getSampleRate();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
void ConvolverNode::performConvolution(const std::shared_ptr<AudioBus> &processingBus) {
|
|
174
|
+
if (processingBus->getNumberOfChannels() == 1) {
|
|
175
|
+
for (int i = 0; i < convolvers_.size(); ++i) {
|
|
176
|
+
threadPool_->schedule([&, i] {
|
|
177
|
+
convolvers_[i].process(
|
|
178
|
+
processingBus->getChannel(0)->getData(), intermediateBus_->getChannel(i)->getData());
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
} else if (processingBus->getNumberOfChannels() == 2) {
|
|
182
|
+
std::vector<int> inputChannelMap;
|
|
183
|
+
std::vector<int> outputChannelMap;
|
|
184
|
+
if (convolvers_.size() == 2) {
|
|
185
|
+
inputChannelMap = {0, 1};
|
|
186
|
+
outputChannelMap = {0, 1};
|
|
187
|
+
} else { // 4 channel IR
|
|
188
|
+
inputChannelMap = {0, 0, 1, 1};
|
|
189
|
+
outputChannelMap = {0, 3, 2, 1};
|
|
190
|
+
}
|
|
191
|
+
for (int i = 0; i < convolvers_.size(); ++i) {
|
|
192
|
+
threadPool_->schedule([this, i, inputChannelMap, outputChannelMap, &processingBus] {
|
|
193
|
+
convolvers_[i].process(
|
|
194
|
+
processingBus->getChannel(inputChannelMap[i])->getData(),
|
|
195
|
+
intermediateBus_->getChannel(outputChannelMap[i])->getData());
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
threadPool_->wait();
|
|
200
|
+
}
|
|
201
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/core/AudioNode.h>
|
|
4
|
+
#include <audioapi/core/AudioParam.h>
|
|
5
|
+
#include <audioapi/dsp/Convolver.h>
|
|
6
|
+
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include <audioapi/utils/ThreadPool.hpp>
|
|
11
|
+
|
|
12
|
+
static constexpr int GAIN_CALIBRATION =
|
|
13
|
+
-58; // magic number so that processed signal and dry signal have roughly the same volume
|
|
14
|
+
static constexpr double MIN_IR_POWER = 0.000125;
|
|
15
|
+
|
|
16
|
+
namespace audioapi {
|
|
17
|
+
|
|
18
|
+
class AudioBus;
|
|
19
|
+
class AudioBuffer;
|
|
20
|
+
|
|
21
|
+
class ConvolverNode : public AudioNode {
|
|
22
|
+
public:
|
|
23
|
+
explicit ConvolverNode(
|
|
24
|
+
BaseAudioContext *context,
|
|
25
|
+
const std::shared_ptr<AudioBuffer> &buffer,
|
|
26
|
+
bool disableNormalization);
|
|
27
|
+
|
|
28
|
+
[[nodiscard]] bool getNormalize_() const;
|
|
29
|
+
[[nodiscard]] const std::shared_ptr<AudioBuffer> &getBuffer() const;
|
|
30
|
+
void setNormalize(bool normalize);
|
|
31
|
+
void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);
|
|
32
|
+
|
|
33
|
+
protected:
|
|
34
|
+
std::shared_ptr<AudioBus> processNode(
|
|
35
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
36
|
+
int framesToProcess) override;
|
|
37
|
+
|
|
38
|
+
private:
|
|
39
|
+
std::shared_ptr<AudioBus> processInputs(
|
|
40
|
+
const std::shared_ptr<AudioBus> &outputBus,
|
|
41
|
+
int framesToProcess,
|
|
42
|
+
bool checkIsAlreadyProcessed) override;
|
|
43
|
+
void onInputDisabled() override;
|
|
44
|
+
float gainCalibrationSampleRate_;
|
|
45
|
+
size_t remainingSegments_;
|
|
46
|
+
size_t internalBufferIndex_;
|
|
47
|
+
bool normalize_;
|
|
48
|
+
bool signalledToStop_;
|
|
49
|
+
float scaleFactor_;
|
|
50
|
+
std::shared_ptr<AudioBus> intermediateBus_;
|
|
51
|
+
|
|
52
|
+
// impulse response buffer
|
|
53
|
+
std::shared_ptr<AudioBuffer> buffer_;
|
|
54
|
+
// buffer to hold internal processed data
|
|
55
|
+
std::shared_ptr<AudioBus> internalBuffer_;
|
|
56
|
+
// vectors of convolvers, one per channel
|
|
57
|
+
std::vector<Convolver> convolvers_;
|
|
58
|
+
std::shared_ptr<ThreadPool> threadPool_;
|
|
59
|
+
|
|
60
|
+
void calculateNormalizationScale();
|
|
61
|
+
void performConvolution(const std::shared_ptr<AudioBus> &processingBus);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
} // namespace audioapi
|