react-native-audio-api 0.11.0-alpha.1 → 0.11.0-alpha.2
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 +24 -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 +41 -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
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
4
4
|
#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
|
|
5
5
|
|
|
6
|
+
#include <atomic>
|
|
6
7
|
#include <memory>
|
|
7
8
|
#include <mutex>
|
|
8
|
-
#include <atomic>
|
|
9
9
|
|
|
10
10
|
namespace audioapi {
|
|
11
11
|
|
|
@@ -19,55 +19,58 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
|
|
|
19
19
|
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
20
20
|
[[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
|
|
21
21
|
|
|
22
|
-
void clearOnPositionChangedCallback();
|
|
23
22
|
void setOnPositionChangedCallbackId(uint64_t callbackId);
|
|
24
23
|
void setOnPositionChangedInterval(int interval);
|
|
25
24
|
[[nodiscard]] int getOnPositionChangedInterval() const;
|
|
25
|
+
[[nodiscard]] double getInputLatency() const;
|
|
26
|
+
[[nodiscard]] double getOutputLatency() const;
|
|
26
27
|
|
|
27
28
|
protected:
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
// pitch correction
|
|
30
|
+
bool pitchCorrection_;
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
std::mutex bufferLock_;
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
// pitch correction
|
|
35
|
+
std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
|
|
36
|
+
std::shared_ptr<AudioBus> playbackRateBus_;
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
// k-rate params
|
|
39
|
+
std::shared_ptr<AudioParam> detuneParam_;
|
|
40
|
+
std::shared_ptr<AudioParam> playbackRateParam_;
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
// internal helper
|
|
43
|
+
double vReadIndex_;
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
std::atomic<uint64_t> onPositionChangedCallbackId_ = 0; // 0 means no callback
|
|
46
|
+
int onPositionChangedInterval_;
|
|
47
|
+
int onPositionChangedTime_ = 0;
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
std::mutex &getBufferLock();
|
|
50
|
+
virtual double getCurrentPosition() const = 0;
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
void sendOnPositionChangedEvent();
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
void processWithPitchCorrection(
|
|
55
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
56
|
+
int framesToProcess);
|
|
57
|
+
void processWithoutPitchCorrection(
|
|
58
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
59
|
+
int framesToProcess);
|
|
57
60
|
|
|
58
|
-
|
|
61
|
+
float getComputedPlaybackRateValue(int framesToProcess);
|
|
59
62
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
virtual void processWithoutInterpolation(
|
|
64
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
65
|
+
size_t startOffset,
|
|
66
|
+
size_t offsetLength,
|
|
67
|
+
float playbackRate) = 0;
|
|
65
68
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
virtual void processWithInterpolation(
|
|
70
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
71
|
+
size_t startOffset,
|
|
72
|
+
size_t offsetLength,
|
|
73
|
+
float playbackRate) = 0;
|
|
71
74
|
};
|
|
72
75
|
|
|
73
76
|
} // namespace audioapi
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
#include <audioapi/utils/AudioArray.h>
|
|
9
9
|
#include <audioapi/utils/AudioBus.h>
|
|
10
10
|
|
|
11
|
+
#include <algorithm>
|
|
12
|
+
#include <memory>
|
|
13
|
+
#include <queue>
|
|
14
|
+
#include <string>
|
|
15
|
+
#include <unordered_map>
|
|
16
|
+
#include <utility>
|
|
17
|
+
|
|
11
18
|
namespace audioapi {
|
|
12
19
|
|
|
13
20
|
AudioBufferQueueSourceNode::AudioBufferQueueSourceNode(
|
|
@@ -17,6 +24,18 @@ AudioBufferQueueSourceNode::AudioBufferQueueSourceNode(
|
|
|
17
24
|
buffers_ = {};
|
|
18
25
|
stretch_->presetDefault(channelCount_, context_->getSampleRate());
|
|
19
26
|
|
|
27
|
+
if (pitchCorrection) {
|
|
28
|
+
// If pitch correction is enabled, add extra frames at the end
|
|
29
|
+
// to compensate for processing latency.
|
|
30
|
+
addExtraTailFrames_ = true;
|
|
31
|
+
|
|
32
|
+
int extraTailFrames = static_cast<int>(stretch_->inputLatency() + stretch_->outputLatency());
|
|
33
|
+
tailBuffer_ =
|
|
34
|
+
std::make_shared<AudioBuffer>(channelCount_, extraTailFrames, context_->getSampleRate());
|
|
35
|
+
|
|
36
|
+
tailBuffer_->bus_->zero();
|
|
37
|
+
}
|
|
38
|
+
|
|
20
39
|
isInitialized_ = true;
|
|
21
40
|
}
|
|
22
41
|
|
|
@@ -31,13 +50,29 @@ void AudioBufferQueueSourceNode::stop(double when) {
|
|
|
31
50
|
isPaused_ = false;
|
|
32
51
|
}
|
|
33
52
|
|
|
53
|
+
void AudioBufferQueueSourceNode::start(double when) {
|
|
54
|
+
isPaused_ = false;
|
|
55
|
+
stopTime_ = -1.0;
|
|
56
|
+
AudioScheduledSourceNode::start(when);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void AudioBufferQueueSourceNode::start(double when, double offset) {
|
|
60
|
+
start(when);
|
|
61
|
+
|
|
62
|
+
if (buffers_.empty()) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
offset = std::min(offset, buffers_.front().second->getDuration());
|
|
67
|
+
vReadIndex_ = static_cast<double>(buffers_.front().second->getSampleRate() * offset);
|
|
68
|
+
}
|
|
69
|
+
|
|
34
70
|
void AudioBufferQueueSourceNode::pause() {
|
|
35
71
|
AudioScheduledSourceNode::stop(0.0);
|
|
36
72
|
isPaused_ = true;
|
|
37
73
|
}
|
|
38
74
|
|
|
39
|
-
std::string AudioBufferQueueSourceNode::enqueueBuffer(
|
|
40
|
-
const std::shared_ptr<AudioBuffer> &buffer) {
|
|
75
|
+
std::string AudioBufferQueueSourceNode::enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer) {
|
|
41
76
|
auto locker = Locker(getBufferLock());
|
|
42
77
|
buffers_.emplace(bufferId_, buffer);
|
|
43
78
|
|
|
@@ -79,6 +114,7 @@ void AudioBufferQueueSourceNode::disable() {
|
|
|
79
114
|
playbackState_ = PlaybackState::UNSCHEDULED;
|
|
80
115
|
startTime_ = -1.0;
|
|
81
116
|
stopTime_ = -1.0;
|
|
117
|
+
isPaused_ = false;
|
|
82
118
|
|
|
83
119
|
return;
|
|
84
120
|
}
|
|
@@ -112,8 +148,7 @@ std::shared_ptr<AudioBus> AudioBufferQueueSourceNode::processNode(
|
|
|
112
148
|
}
|
|
113
149
|
|
|
114
150
|
double AudioBufferQueueSourceNode::getCurrentPosition() const {
|
|
115
|
-
return dsp::sampleFrameToTime(
|
|
116
|
-
static_cast<int>(vReadIndex_), context_->getSampleRate()) +
|
|
151
|
+
return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), context_->getSampleRate()) +
|
|
117
152
|
playedBuffersDuration_;
|
|
118
153
|
}
|
|
119
154
|
|
|
@@ -145,8 +180,7 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
|
|
|
145
180
|
assert(readIndex + framesToCopy <= buffer->getLength());
|
|
146
181
|
assert(writeIndex + framesToCopy <= processingBus->getSize());
|
|
147
182
|
|
|
148
|
-
processingBus->copy(
|
|
149
|
-
buffer->bus_.get(), readIndex, writeIndex, framesToCopy);
|
|
183
|
+
processingBus->copy(buffer->bus_.get(), readIndex, writeIndex, framesToCopy);
|
|
150
184
|
|
|
151
185
|
writeIndex += framesToCopy;
|
|
152
186
|
readIndex += framesToCopy;
|
|
@@ -162,10 +196,17 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
|
|
|
162
196
|
"ended", onEndedCallbackId_, body);
|
|
163
197
|
|
|
164
198
|
if (buffers_.empty()) {
|
|
165
|
-
|
|
166
|
-
|
|
199
|
+
if (addExtraTailFrames_) {
|
|
200
|
+
buffers_.emplace(bufferId_, tailBuffer_);
|
|
201
|
+
bufferId_++;
|
|
167
202
|
|
|
168
|
-
|
|
203
|
+
addExtraTailFrames_ = false;
|
|
204
|
+
} else if (buffers_.empty()) {
|
|
205
|
+
processingBus->zero(writeIndex, framesLeft);
|
|
206
|
+
readIndex = 0;
|
|
207
|
+
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
169
210
|
}
|
|
170
211
|
|
|
171
212
|
data = buffers_.front();
|
|
@@ -194,8 +235,7 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
|
|
|
194
235
|
while (framesLeft > 0) {
|
|
195
236
|
auto readIndex = static_cast<size_t>(vReadIndex_);
|
|
196
237
|
size_t nextReadIndex = readIndex + 1;
|
|
197
|
-
auto factor =
|
|
198
|
-
static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
|
|
238
|
+
auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
|
|
199
239
|
|
|
200
240
|
bool crossBufferInterpolation = false;
|
|
201
241
|
std::shared_ptr<AudioBuffer> nextBuffer = nullptr;
|
|
@@ -220,11 +260,10 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
|
|
|
220
260
|
const float *nextSource = nextBuffer->bus_->getChannel(i)->getData();
|
|
221
261
|
float currentSample = currentSource[readIndex];
|
|
222
262
|
float nextSample = nextSource[nextReadIndex];
|
|
223
|
-
destination[writeIndex] =
|
|
224
|
-
currentSample + factor * (nextSample - currentSample);
|
|
263
|
+
destination[writeIndex] = currentSample + factor * (nextSample - currentSample);
|
|
225
264
|
} else {
|
|
226
|
-
destination[writeIndex] =
|
|
227
|
-
currentSource, readIndex, nextReadIndex, factor);
|
|
265
|
+
destination[writeIndex] =
|
|
266
|
+
dsp::linearInterpolate(currentSource, readIndex, nextReadIndex, factor);
|
|
228
267
|
}
|
|
229
268
|
}
|
|
230
269
|
|
|
@@ -237,8 +276,7 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
|
|
|
237
276
|
playedBuffersDuration_ += buffer->getDuration();
|
|
238
277
|
buffers_.pop();
|
|
239
278
|
|
|
240
|
-
std::unordered_map<std::string, EventValue> body = {
|
|
241
|
-
{"bufferId", std::to_string(bufferId)}};
|
|
279
|
+
std::unordered_map<std::string, EventValue> body = {{"bufferId", std::to_string(bufferId)}};
|
|
242
280
|
context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
243
281
|
"ended", onEndedCallbackId_, body);
|
|
244
282
|
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
|
|
5
5
|
#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
|
|
6
6
|
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <cstddef>
|
|
9
7
|
#include <algorithm>
|
|
10
|
-
#include <
|
|
8
|
+
#include <cstddef>
|
|
9
|
+
#include <memory>
|
|
11
10
|
#include <queue>
|
|
11
|
+
#include <string>
|
|
12
12
|
|
|
13
13
|
namespace audioapi {
|
|
14
14
|
|
|
@@ -17,41 +17,48 @@ class AudioParam;
|
|
|
17
17
|
|
|
18
18
|
class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode {
|
|
19
19
|
public:
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
explicit AudioBufferQueueSourceNode(BaseAudioContext *context, bool pitchCorrection);
|
|
21
|
+
~AudioBufferQueueSourceNode() override;
|
|
22
|
+
|
|
23
|
+
void stop(double when) override;
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
void start(double when) override;
|
|
26
|
+
void start(double when, double offset);
|
|
27
|
+
void pause();
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
std::string enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer);
|
|
30
|
+
void dequeueBuffer(size_t bufferId);
|
|
31
|
+
void clearBuffers();
|
|
32
|
+
void disable() override;
|
|
30
33
|
|
|
31
34
|
protected:
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
std::shared_ptr<AudioBus> processNode(
|
|
36
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
37
|
+
int framesToProcess) override;
|
|
38
|
+
double getCurrentPosition() const override;
|
|
34
39
|
|
|
35
40
|
private:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
// User provided buffers
|
|
42
|
+
std::queue<std::pair<size_t, std::shared_ptr<AudioBuffer>>> buffers_;
|
|
43
|
+
size_t bufferId_ = 0;
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
bool isPaused_ = false;
|
|
46
|
+
bool addExtraTailFrames_ = false;
|
|
47
|
+
std::shared_ptr<AudioBuffer> tailBuffer_;
|
|
41
48
|
|
|
42
|
-
|
|
49
|
+
double playedBuffersDuration_ = 0;
|
|
43
50
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
void processWithoutInterpolation(
|
|
52
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
53
|
+
size_t startOffset,
|
|
54
|
+
size_t offsetLength,
|
|
55
|
+
float playbackRate) override;
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
void processWithInterpolation(
|
|
58
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
59
|
+
size_t startOffset,
|
|
60
|
+
size_t offsetLength,
|
|
61
|
+
float playbackRate) override;
|
|
55
62
|
};
|
|
56
63
|
|
|
57
64
|
} // namespace audioapi
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
8
8
|
#include <audioapi/utils/AudioArray.h>
|
|
9
9
|
#include <audioapi/utils/AudioBus.h>
|
|
10
|
+
#include <algorithm>
|
|
11
|
+
#include <memory>
|
|
10
12
|
|
|
11
13
|
namespace audioapi {
|
|
12
14
|
|
|
13
|
-
AudioBufferSourceNode::AudioBufferSourceNode(
|
|
14
|
-
BaseAudioContext *context,
|
|
15
|
-
bool pitchCorrection)
|
|
15
|
+
AudioBufferSourceNode::AudioBufferSourceNode(BaseAudioContext *context, bool pitchCorrection)
|
|
16
16
|
: AudioBufferBaseSourceNode(context, pitchCorrection),
|
|
17
17
|
loop_(false),
|
|
18
18
|
loopSkip_(false),
|
|
@@ -70,8 +70,7 @@ void AudioBufferSourceNode::setLoopEnd(double loopEnd) {
|
|
|
70
70
|
loopEnd_ = loopEnd;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
void AudioBufferSourceNode::setBuffer(
|
|
74
|
-
const std::shared_ptr<AudioBuffer> &buffer) {
|
|
73
|
+
void AudioBufferSourceNode::setBuffer(const std::shared_ptr<AudioBuffer> &buffer) {
|
|
75
74
|
Locker locker(getBufferLock());
|
|
76
75
|
|
|
77
76
|
if (!buffer) {
|
|
@@ -82,17 +81,29 @@ void AudioBufferSourceNode::setBuffer(
|
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
buffer_ = buffer;
|
|
85
|
-
alignedBus_ = std::make_shared<AudioBus>(*buffer_->bus_);
|
|
86
84
|
channelCount_ = buffer_->getNumberOfChannels();
|
|
87
85
|
|
|
88
|
-
|
|
89
|
-
RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
|
|
90
|
-
playbackRateBus_ = std::make_shared<AudioBus>(
|
|
91
|
-
RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
86
|
+
stretch_->presetDefault(channelCount_, buffer_->getSampleRate());
|
|
92
87
|
|
|
93
|
-
|
|
88
|
+
if (pitchCorrection_) {
|
|
89
|
+
int extraTailFrames =
|
|
90
|
+
static_cast<int>((getInputLatency() + getOutputLatency()) * context_->getSampleRate());
|
|
91
|
+
size_t totalSize = buffer_->getLength() + extraTailFrames;
|
|
94
92
|
|
|
95
|
-
|
|
93
|
+
alignedBus_ = std::make_shared<AudioBus>(totalSize, channelCount_, buffer_->getSampleRate());
|
|
94
|
+
alignedBus_->copy(buffer_->bus_.get(), 0, 0, buffer_->getLength());
|
|
95
|
+
|
|
96
|
+
alignedBus_->zero(buffer_->getLength(), extraTailFrames);
|
|
97
|
+
} else {
|
|
98
|
+
alignedBus_ = std::make_shared<AudioBus>(*buffer_->bus_);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
audioBus_ =
|
|
102
|
+
std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
|
|
103
|
+
playbackRateBus_ =
|
|
104
|
+
std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
|
|
105
|
+
|
|
106
|
+
loopEnd_ = buffer_->getDuration();
|
|
96
107
|
}
|
|
97
108
|
|
|
98
109
|
void AudioBufferSourceNode::start(double when, double offset, double duration) {
|
|
@@ -106,10 +117,8 @@ void AudioBufferSourceNode::start(double when, double offset, double duration) {
|
|
|
106
117
|
return;
|
|
107
118
|
}
|
|
108
119
|
|
|
109
|
-
offset =
|
|
110
|
-
offset,
|
|
111
|
-
static_cast<double>(alignedBus_->getSize()) /
|
|
112
|
-
alignedBus_->getSampleRate());
|
|
120
|
+
offset =
|
|
121
|
+
std::min(offset, static_cast<double>(alignedBus_->getSize()) / alignedBus_->getSampleRate());
|
|
113
122
|
|
|
114
123
|
if (loop_) {
|
|
115
124
|
offset = std::min(offset, loopEnd_);
|
|
@@ -123,19 +132,12 @@ void AudioBufferSourceNode::disable() {
|
|
|
123
132
|
alignedBus_.reset();
|
|
124
133
|
}
|
|
125
134
|
|
|
126
|
-
void AudioBufferSourceNode::clearOnLoopEndedCallback() {
|
|
127
|
-
if (onLoopEndedCallbackId_ == 0 || context_ == nullptr ||
|
|
128
|
-
context_->audioEventHandlerRegistry_ == nullptr) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
133
|
-
"loopEnded", onLoopEndedCallbackId_);
|
|
134
|
-
onLoopEndedCallbackId_ = 0;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
135
|
void AudioBufferSourceNode::setOnLoopEndedCallbackId(uint64_t callbackId) {
|
|
138
|
-
|
|
136
|
+
auto oldCallbackId = onLoopEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
|
|
137
|
+
|
|
138
|
+
if (oldCallbackId != 0) {
|
|
139
|
+
audioEventHandlerRegistry_->unregisterHandler("loopEnded", oldCallbackId);
|
|
140
|
+
}
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
std::shared_ptr<AudioBus> AudioBufferSourceNode::processNode(
|
|
@@ -163,16 +165,13 @@ std::shared_ptr<AudioBus> AudioBufferSourceNode::processNode(
|
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
double AudioBufferSourceNode::getCurrentPosition() const {
|
|
166
|
-
return dsp::sampleFrameToTime(
|
|
167
|
-
static_cast<int>(vReadIndex_), buffer_->getSampleRate());
|
|
168
|
+
return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), buffer_->getSampleRate());
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
void AudioBufferSourceNode::sendOnLoopEndedEvent() {
|
|
171
|
-
auto onLoopEndedCallbackId =
|
|
172
|
-
onLoopEndedCallbackId_.load(std::memory_order_acquire);
|
|
172
|
+
auto onLoopEndedCallbackId = onLoopEndedCallbackId_.load(std::memory_order_acquire);
|
|
173
173
|
if (onLoopEndedCallbackId != 0) {
|
|
174
|
-
|
|
175
|
-
"loopEnded", onLoopEndedCallbackId_, {});
|
|
174
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody("loopEnded", onLoopEndedCallbackId, {});
|
|
176
175
|
}
|
|
177
176
|
}
|
|
178
177
|
|
|
@@ -199,10 +198,9 @@ void AudioBufferSourceNode::processWithoutInterpolation(
|
|
|
199
198
|
// if we are moving towards loop, we do nothing because we will achieve it
|
|
200
199
|
// otherwise, we wrap to the start of the loop if necessary
|
|
201
200
|
if (loop_ &&
|
|
202
|
-
((readIndex >= frameEnd && direction == 1) ||
|
|
203
|
-
(readIndex < frameStart && direction == -1))) {
|
|
201
|
+
((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1))) {
|
|
204
202
|
readIndex = frameStart +
|
|
205
|
-
((
|
|
203
|
+
(static_cast<int64_t>(readIndex) - static_cast<int64_t>(frameStart)) % frameDelta;
|
|
206
204
|
}
|
|
207
205
|
|
|
208
206
|
while (framesLeft > 0) {
|
|
@@ -217,8 +215,7 @@ void AudioBufferSourceNode::processWithoutInterpolation(
|
|
|
217
215
|
|
|
218
216
|
// Direction is forward, we can normally copy the data
|
|
219
217
|
if (direction == 1) {
|
|
220
|
-
processingBus->copy(
|
|
221
|
-
alignedBus_.get(), readIndex, writeIndex, framesToCopy);
|
|
218
|
+
processingBus->copy(alignedBus_.get(), readIndex, writeIndex, framesToCopy);
|
|
222
219
|
} else {
|
|
223
220
|
for (int i = 0; i < framesToCopy; i += 1) {
|
|
224
221
|
for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
|
|
@@ -234,8 +231,7 @@ void AudioBufferSourceNode::processWithoutInterpolation(
|
|
|
234
231
|
|
|
235
232
|
// if we are moving towards loop, we do nothing because we will achieve it
|
|
236
233
|
// otherwise, we wrap to the start of the loop if necessary
|
|
237
|
-
if ((readIndex >= frameEnd && direction == 1) ||
|
|
238
|
-
(readIndex < frameStart && direction == -1)) {
|
|
234
|
+
if ((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1)) {
|
|
239
235
|
readIndex -= direction * frameDelta;
|
|
240
236
|
|
|
241
237
|
if (!loop_) {
|
|
@@ -272,15 +268,13 @@ void AudioBufferSourceNode::processWithInterpolation(
|
|
|
272
268
|
|
|
273
269
|
// Wrap to the start of the loop if necessary
|
|
274
270
|
if (loop_ && (vReadIndex_ >= vFrameEnd || vReadIndex_ < vFrameStart)) {
|
|
275
|
-
vReadIndex_ =
|
|
276
|
-
vFrameStart + std::fmod(vReadIndex_ - vFrameStart, vFrameDelta);
|
|
271
|
+
vReadIndex_ = vFrameStart + std::fmod(vReadIndex_ - vFrameStart, vFrameDelta);
|
|
277
272
|
}
|
|
278
273
|
|
|
279
274
|
while (framesLeft > 0) {
|
|
280
275
|
auto readIndex = static_cast<size_t>(vReadIndex_);
|
|
281
276
|
size_t nextReadIndex = readIndex + 1;
|
|
282
|
-
auto factor =
|
|
283
|
-
static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
|
|
277
|
+
auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
|
|
284
278
|
|
|
285
279
|
if (nextReadIndex >= frameEnd) {
|
|
286
280
|
nextReadIndex = loop_ ? frameStart : readIndex;
|
|
@@ -290,8 +284,7 @@ void AudioBufferSourceNode::processWithInterpolation(
|
|
|
290
284
|
float *destination = processingBus->getChannel(i)->getData();
|
|
291
285
|
const float *source = alignedBus_->getChannel(i)->getData();
|
|
292
286
|
|
|
293
|
-
destination[writeIndex] =
|
|
294
|
-
dsp::linearInterpolate(source, readIndex, nextReadIndex, factor);
|
|
287
|
+
destination[writeIndex] = dsp::linearInterpolate(source, readIndex, nextReadIndex, factor);
|
|
295
288
|
}
|
|
296
289
|
|
|
297
290
|
writeIndex += 1;
|
|
@@ -315,8 +308,7 @@ void AudioBufferSourceNode::processWithInterpolation(
|
|
|
315
308
|
double AudioBufferSourceNode::getVirtualStartFrame() {
|
|
316
309
|
auto loopStartFrame = loopStart_ * context_->getSampleRate();
|
|
317
310
|
|
|
318
|
-
return loop_ && loopStartFrame >= 0 && loopStart_ < loopEnd_ ? loopStartFrame
|
|
319
|
-
: 0.0;
|
|
311
|
+
return loop_ && loopStartFrame >= 0 && loopStart_ < loopEnd_ ? loopStartFrame : 0.0;
|
|
320
312
|
}
|
|
321
313
|
|
|
322
314
|
double AudioBufferSourceNode::getVirtualEndFrame() {
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
|
|
5
5
|
#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
|
|
6
6
|
|
|
7
|
-
#include <memory>
|
|
8
|
-
#include <cstddef>
|
|
9
7
|
#include <algorithm>
|
|
8
|
+
#include <cstddef>
|
|
9
|
+
#include <memory>
|
|
10
10
|
#include <string>
|
|
11
11
|
|
|
12
12
|
namespace audioapi {
|
|
@@ -31,14 +31,16 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
|
|
|
31
31
|
void setLoopEnd(double loopEnd);
|
|
32
32
|
void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);
|
|
33
33
|
|
|
34
|
+
using AudioScheduledSourceNode::start;
|
|
34
35
|
void start(double when, double offset, double duration = -1);
|
|
35
36
|
void disable() override;
|
|
36
37
|
|
|
37
|
-
void clearOnLoopEndedCallback();
|
|
38
38
|
void setOnLoopEndedCallbackId(uint64_t callbackId);
|
|
39
39
|
|
|
40
40
|
protected:
|
|
41
|
-
std::shared_ptr<AudioBus> processNode(
|
|
41
|
+
std::shared_ptr<AudioBus> processNode(
|
|
42
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
43
|
+
int framesToProcess) override;
|
|
42
44
|
double getCurrentPosition() const override;
|
|
43
45
|
|
|
44
46
|
private:
|
|
@@ -56,13 +58,13 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
|
|
|
56
58
|
void sendOnLoopEndedEvent();
|
|
57
59
|
|
|
58
60
|
void processWithoutInterpolation(
|
|
59
|
-
const std::shared_ptr<AudioBus
|
|
61
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
60
62
|
size_t startOffset,
|
|
61
63
|
size_t offsetLength,
|
|
62
64
|
float playbackRate) override;
|
|
63
65
|
|
|
64
66
|
void processWithInterpolation(
|
|
65
|
-
const std::shared_ptr<AudioBus
|
|
67
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
66
68
|
size_t startOffset,
|
|
67
69
|
size_t offsetLength,
|
|
68
70
|
float playbackRate) override;
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
#include <audioapi/utils/AudioArray.h>
|
|
7
7
|
#include <audioapi/utils/AudioBus.h>
|
|
8
8
|
|
|
9
|
+
#if !RN_AUDIO_API_TEST
|
|
10
|
+
#include <audioapi/core/AudioContext.h>
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#include <algorithm>
|
|
14
|
+
#include <limits>
|
|
15
|
+
#include <memory>
|
|
16
|
+
|
|
9
17
|
namespace audioapi {
|
|
10
18
|
|
|
11
19
|
AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
|
|
@@ -14,9 +22,16 @@ AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
|
|
|
14
22
|
stopTime_(-1.0),
|
|
15
23
|
playbackState_(PlaybackState::UNSCHEDULED) {
|
|
16
24
|
numberOfInputs_ = 0;
|
|
25
|
+
audioEventHandlerRegistry_ = context_->audioEventHandlerRegistry_;
|
|
17
26
|
}
|
|
18
27
|
|
|
19
28
|
void AudioScheduledSourceNode::start(double when) {
|
|
29
|
+
#if !RN_AUDIO_API_TEST
|
|
30
|
+
if (auto context = dynamic_cast<AudioContext *>(context_)) {
|
|
31
|
+
context->start();
|
|
32
|
+
}
|
|
33
|
+
#endif
|
|
34
|
+
|
|
20
35
|
playbackState_ = PlaybackState::SCHEDULED;
|
|
21
36
|
startTime_ = when;
|
|
22
37
|
}
|
|
@@ -45,19 +60,12 @@ bool AudioScheduledSourceNode::isStopScheduled() {
|
|
|
45
60
|
return playbackState_ == PlaybackState::STOP_SCHEDULED;
|
|
46
61
|
}
|
|
47
62
|
|
|
48
|
-
void AudioScheduledSourceNode::clearOnEndedCallback() {
|
|
49
|
-
if (onEndedCallbackId_ == 0 || context_ == nullptr ||
|
|
50
|
-
context_->audioEventHandlerRegistry_ == nullptr) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
55
|
-
"ended", onEndedCallbackId_);
|
|
56
|
-
onEndedCallbackId_ = 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
63
|
void AudioScheduledSourceNode::setOnEndedCallbackId(const uint64_t callbackId) {
|
|
60
|
-
|
|
64
|
+
auto oldCallbackId = onEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
|
|
65
|
+
|
|
66
|
+
if (oldCallbackId != 0) {
|
|
67
|
+
audioEventHandlerRegistry_->unregisterHandler("ended", oldCallbackId);
|
|
68
|
+
}
|
|
61
69
|
}
|
|
62
70
|
|
|
63
71
|
void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
@@ -76,14 +84,11 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
76
84
|
auto sampleRate = context_->getSampleRate();
|
|
77
85
|
|
|
78
86
|
size_t firstFrame = context_->getCurrentSampleFrame();
|
|
79
|
-
size_t lastFrame = firstFrame + framesToProcess;
|
|
80
|
-
|
|
81
|
-
size_t startFrame =
|
|
82
|
-
std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
|
|
83
|
-
size_t stopFrame = stopTime_ == -1.0
|
|
84
|
-
? std::numeric_limits<size_t>::max()
|
|
85
|
-
: dsp::timeToSampleFrame(stopTime_, sampleRate);
|
|
87
|
+
size_t lastFrame = firstFrame + framesToProcess - 1;
|
|
86
88
|
|
|
89
|
+
size_t startFrame = std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
|
|
90
|
+
size_t stopFrame = stopTime_ == -1.0 ? std::numeric_limits<size_t>::max()
|
|
91
|
+
: dsp::timeToSampleFrame(stopTime_, sampleRate);
|
|
87
92
|
if (isFinished()) {
|
|
88
93
|
startOffset = 0;
|
|
89
94
|
nonSilentFramesToProcess = 0;
|
|
@@ -105,7 +110,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
105
110
|
? std::max(startFrame, firstFrame) - firstFrame
|
|
106
111
|
: 0;
|
|
107
112
|
nonSilentFramesToProcess =
|
|
108
|
-
std::max(std::min(lastFrame, stopFrame), startFrame) - startFrame;
|
|
113
|
+
std::max(std::min(lastFrame, stopFrame) + 1, startFrame) - startFrame;
|
|
109
114
|
|
|
110
115
|
assert(startOffset <= framesToProcess);
|
|
111
116
|
assert(nonSilentFramesToProcess <= framesToProcess);
|
|
@@ -124,7 +129,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
124
129
|
|
|
125
130
|
// stop will happen in this render quantum
|
|
126
131
|
// zero remaining frames after stop frame
|
|
127
|
-
if (stopFrame
|
|
132
|
+
if (stopFrame <= lastFrame && stopFrame >= firstFrame) {
|
|
128
133
|
playbackState_ = PlaybackState::STOP_SCHEDULED;
|
|
129
134
|
startOffset = 0;
|
|
130
135
|
nonSilentFramesToProcess = stopFrame - firstFrame;
|
|
@@ -160,9 +165,9 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
160
165
|
void AudioScheduledSourceNode::disable() {
|
|
161
166
|
AudioNode::disable();
|
|
162
167
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
auto onEndedCallbackId = onEndedCallbackId_.load(std::memory_order_acquire);
|
|
169
|
+
if (onEndedCallbackId != 0) {
|
|
170
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody("ended", onEndedCallbackId, {});
|
|
166
171
|
}
|
|
167
172
|
}
|
|
168
173
|
|