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
|
@@ -11,24 +11,52 @@
|
|
|
11
11
|
#pragma once
|
|
12
12
|
|
|
13
13
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
14
|
+
#include <audioapi/utils/AudioBus.h>
|
|
14
15
|
|
|
15
|
-
#
|
|
16
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
16
17
|
extern "C" {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
#include <libavcodec/avcodec.h>
|
|
19
|
+
#include <libavformat/avformat.h>
|
|
20
|
+
#include <libavutil/channel_layout.h>
|
|
21
|
+
#include <libavutil/opt.h>
|
|
22
|
+
#include <libavutil/samplefmt.h>
|
|
23
|
+
#include <libswresample/swresample.h>
|
|
23
24
|
}
|
|
24
|
-
#endif
|
|
25
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
25
26
|
|
|
27
|
+
#include <atomic>
|
|
26
28
|
#include <cmath>
|
|
27
29
|
#include <memory>
|
|
28
30
|
#include <string>
|
|
29
|
-
#include <
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
#include <utility>
|
|
32
|
+
#ifndef AUDIO_API_TEST_SUITE
|
|
33
|
+
#include <audioapi/utils/SpscChannel.hpp>
|
|
34
|
+
|
|
35
|
+
static constexpr audioapi::channels::spsc::OverflowStrategy STREAMER_NODE_SPSC_OVERFLOW_STRATEGY =
|
|
36
|
+
audioapi::channels::spsc::OverflowStrategy::WAIT_ON_FULL;
|
|
37
|
+
static constexpr audioapi::channels::spsc::WaitStrategy STREAMER_NODE_SPSC_WAIT_STRATEGY =
|
|
38
|
+
audioapi::channels::spsc::WaitStrategy::ATOMIC_WAIT;
|
|
39
|
+
#endif // AUDIO_API_TEST_SUITE
|
|
40
|
+
|
|
41
|
+
static constexpr bool VERBOSE = false;
|
|
42
|
+
static constexpr int CHANNEL_CAPACITY = 32;
|
|
43
|
+
|
|
44
|
+
struct StreamingData {
|
|
45
|
+
audioapi::AudioBus bus;
|
|
46
|
+
size_t size;
|
|
47
|
+
StreamingData() = default;
|
|
48
|
+
StreamingData(audioapi::AudioBus b, size_t s) : bus(b), size(s) {}
|
|
49
|
+
StreamingData(const StreamingData &data) : bus(data.bus), size(data.size) {}
|
|
50
|
+
StreamingData(StreamingData &&data) noexcept : bus(std::move(data.bus)), size(data.size) {}
|
|
51
|
+
StreamingData &operator=(const StreamingData &data) {
|
|
52
|
+
if (this == &data) {
|
|
53
|
+
return *this;
|
|
54
|
+
}
|
|
55
|
+
bus = data.bus;
|
|
56
|
+
size = data.size;
|
|
57
|
+
return *this;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
32
60
|
|
|
33
61
|
namespace audioapi {
|
|
34
62
|
|
|
@@ -42,33 +70,41 @@ class StreamerNode : public AudioScheduledSourceNode {
|
|
|
42
70
|
/**
|
|
43
71
|
* @brief Initialize all necessary ffmpeg components for streaming audio
|
|
44
72
|
*/
|
|
45
|
-
bool initialize(const std::string&
|
|
46
|
-
void stop(double when) override;
|
|
73
|
+
bool initialize(const std::string &inputUrl);
|
|
47
74
|
|
|
48
75
|
protected:
|
|
49
|
-
std::shared_ptr<AudioBus> processNode(
|
|
76
|
+
std::shared_ptr<AudioBus> processNode(
|
|
77
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
78
|
+
int framesToProcess) override;
|
|
50
79
|
|
|
51
80
|
private:
|
|
52
|
-
|
|
53
|
-
AVFormatContext*
|
|
54
|
-
AVCodecContext*
|
|
55
|
-
const AVCodec*
|
|
56
|
-
AVCodecParameters*
|
|
57
|
-
AVPacket*
|
|
58
|
-
AVFrame*
|
|
59
|
-
|
|
81
|
+
#if !RN_AUDIO_API_FFMPEG_DISABLED
|
|
82
|
+
AVFormatContext *fmtCtx_;
|
|
83
|
+
AVCodecContext *codecCtx_;
|
|
84
|
+
const AVCodec *decoder_;
|
|
85
|
+
AVCodecParameters *codecpar_;
|
|
86
|
+
AVPacket *pkt_;
|
|
87
|
+
AVFrame *frame_; // Frame that is currently being processed
|
|
88
|
+
SwrContext *swrCtx_;
|
|
89
|
+
uint8_t **resampledData_; // weird ffmpeg way of using raw byte pointers for resampled data
|
|
90
|
+
|
|
60
91
|
std::shared_ptr<AudioBus> bufferedBus_; // audio bus for buffering hls frames
|
|
61
|
-
size_t
|
|
62
|
-
|
|
63
|
-
int audio_stream_index_; // index of the audio stream channel in the input
|
|
64
|
-
SwrContext* swrCtx_;
|
|
65
|
-
uint8_t** resampledData_; // weird ffmpeg way of using raw byte pointers for resampled data
|
|
92
|
+
size_t bufferedBusSize_; // size of currently buffered bus
|
|
93
|
+
int audio_stream_index_; // index of the audio stream channel in the input
|
|
66
94
|
int maxResampledSamples_;
|
|
67
|
-
|
|
95
|
+
size_t processedSamples_;
|
|
96
|
+
|
|
68
97
|
std::thread streamingThread_;
|
|
69
|
-
std::atomic<bool>
|
|
70
|
-
static constexpr float BUFFER_LENGTH_SECONDS = 5.0f; // Length of the buffer in seconds
|
|
98
|
+
std::atomic<bool> isNodeFinished_; // Flag to control the streaming thread
|
|
71
99
|
static constexpr int INITIAL_MAX_RESAMPLED_SAMPLES = 8192; // Initial size for resampled data
|
|
100
|
+
channels::spsc::
|
|
101
|
+
Sender<StreamingData, STREAMER_NODE_SPSC_OVERFLOW_STRATEGY, STREAMER_NODE_SPSC_WAIT_STRATEGY>
|
|
102
|
+
sender_;
|
|
103
|
+
channels::spsc::Receiver<
|
|
104
|
+
StreamingData,
|
|
105
|
+
STREAMER_NODE_SPSC_OVERFLOW_STRATEGY,
|
|
106
|
+
STREAMER_NODE_SPSC_WAIT_STRATEGY>
|
|
107
|
+
receiver_;
|
|
72
108
|
|
|
73
109
|
/**
|
|
74
110
|
* @brief Setting up the resampler
|
|
@@ -81,7 +117,7 @@ class StreamerNode : public AudioScheduledSourceNode {
|
|
|
81
117
|
* @param frame The AVFrame to resample
|
|
82
118
|
* @return true if successful, false otherwise
|
|
83
119
|
*/
|
|
84
|
-
bool processFrameWithResampler(AVFrame*
|
|
120
|
+
bool processFrameWithResampler(AVFrame *frame);
|
|
85
121
|
|
|
86
122
|
/**
|
|
87
123
|
* @brief Thread function to continuously read and process audio frames
|
|
@@ -100,7 +136,7 @@ class StreamerNode : public AudioScheduledSourceNode {
|
|
|
100
136
|
* @return true if successful, false otherwise
|
|
101
137
|
* @note This function initializes the FFmpeg libraries and opens the input stream
|
|
102
138
|
*/
|
|
103
|
-
bool openInput(const std::string&
|
|
139
|
+
bool openInput(const std::string &inputUrl);
|
|
104
140
|
|
|
105
141
|
/**
|
|
106
142
|
* @brief Find the audio stream channel in the input
|
|
@@ -113,6 +149,6 @@ class StreamerNode : public AudioScheduledSourceNode {
|
|
|
113
149
|
* @return true if successful, false otherwise
|
|
114
150
|
*/
|
|
115
151
|
bool setupDecoder();
|
|
116
|
-
|
|
152
|
+
#endif // RN_AUDIO_API_FFMPEG_DISABLED
|
|
117
153
|
};
|
|
118
154
|
} // namespace audioapi
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
#include <audioapi/core/sources/WorkletSourceNode.h>
|
|
2
2
|
#include <audioapi/core/utils/Constants.h>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <utility>
|
|
3
5
|
|
|
4
6
|
namespace audioapi {
|
|
5
7
|
|
|
6
|
-
WorkletSourceNode::WorkletSourceNode(
|
|
7
|
-
|
|
8
|
-
WorkletsRunner &&workletRunner)
|
|
9
|
-
: AudioScheduledSourceNode(context),
|
|
10
|
-
workletRunner_(std::move(workletRunner)) {
|
|
8
|
+
WorkletSourceNode::WorkletSourceNode(BaseAudioContext *context, WorkletsRunner &&workletRunner)
|
|
9
|
+
: AudioScheduledSourceNode(context), workletRunner_(std::move(workletRunner)) {
|
|
11
10
|
isInitialized_ = true;
|
|
12
11
|
|
|
13
12
|
// Prepare buffers for audio processing
|
|
@@ -30,8 +29,7 @@ std::shared_ptr<AudioBus> WorkletSourceNode::processNode(
|
|
|
30
29
|
size_t startOffset = 0;
|
|
31
30
|
size_t nonSilentFramesToProcess = framesToProcess;
|
|
32
31
|
|
|
33
|
-
updatePlaybackInfo(
|
|
34
|
-
processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
|
|
32
|
+
updatePlaybackInfo(processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
|
|
35
33
|
|
|
36
34
|
if (nonSilentFramesToProcess == 0) {
|
|
37
35
|
processingBus->zero();
|
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
#pragma once
|
|
2
|
-
#include <jsi/jsi.h>
|
|
3
2
|
#include <audioapi/core/BaseAudioContext.h>
|
|
4
|
-
#include <audioapi/utils/AudioBus.h>
|
|
5
3
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
6
4
|
#include <audioapi/core/utils/worklets/SafeIncludes.h>
|
|
7
5
|
#include <audioapi/core/utils/worklets/WorkletsRunner.h>
|
|
8
6
|
#include <audioapi/jsi/AudioArrayBuffer.h>
|
|
9
7
|
#include <audioapi/utils/AudioArray.h>
|
|
8
|
+
#include <audioapi/utils/AudioBus.h>
|
|
9
|
+
#include <jsi/jsi.h>
|
|
10
10
|
|
|
11
|
-
#include <vector>
|
|
12
11
|
#include <memory>
|
|
12
|
+
#include <vector>
|
|
13
13
|
|
|
14
14
|
namespace audioapi {
|
|
15
15
|
|
|
16
16
|
#if RN_AUDIO_API_TEST
|
|
17
17
|
class WorkletSourceNode : public AudioScheduledSourceNode {
|
|
18
18
|
public:
|
|
19
|
-
explicit WorkletSourceNode(
|
|
20
|
-
|
|
21
|
-
WorkletsRunner &&workletRunner
|
|
22
|
-
) : AudioScheduledSourceNode(context) {}
|
|
19
|
+
explicit WorkletSourceNode(BaseAudioContext *context, WorkletsRunner &&workletRunner)
|
|
20
|
+
: AudioScheduledSourceNode(context) {}
|
|
23
21
|
|
|
24
22
|
protected:
|
|
25
|
-
std::shared_ptr<AudioBus> processNode(
|
|
23
|
+
std::shared_ptr<AudioBus> processNode(
|
|
24
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
25
|
+
int framesToProcess) override {
|
|
26
|
+
return processingBus;
|
|
27
|
+
}
|
|
26
28
|
};
|
|
27
29
|
#else
|
|
28
30
|
|
|
29
31
|
class WorkletSourceNode : public AudioScheduledSourceNode {
|
|
30
32
|
public:
|
|
31
|
-
explicit WorkletSourceNode(
|
|
32
|
-
BaseAudioContext *context,
|
|
33
|
-
WorkletsRunner &&workletRunner
|
|
34
|
-
);
|
|
33
|
+
explicit WorkletSourceNode(BaseAudioContext *context, WorkletsRunner &&workletRunner);
|
|
35
34
|
|
|
36
35
|
protected:
|
|
37
|
-
std::shared_ptr<AudioBus> processNode(
|
|
36
|
+
std::shared_ptr<AudioBus> processNode(
|
|
37
|
+
const std::shared_ptr<AudioBus> &processingBus,
|
|
38
|
+
int framesToProcess) override;
|
|
39
|
+
|
|
38
40
|
private:
|
|
39
41
|
WorkletsRunner workletRunner_;
|
|
40
42
|
std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;
|
|
@@ -18,16 +18,23 @@ class AudioDecoder {
|
|
|
18
18
|
public:
|
|
19
19
|
AudioDecoder() = delete;
|
|
20
20
|
|
|
21
|
-
[[nodiscard]] static std::shared_ptr<AudioBuffer> decodeWithFilePath(
|
|
21
|
+
[[nodiscard]] static std::shared_ptr<AudioBuffer> decodeWithFilePath(
|
|
22
|
+
const std::string &path,
|
|
23
|
+
float sampleRate);
|
|
22
24
|
[[nodiscard]] static std::shared_ptr<AudioBuffer>
|
|
23
25
|
decodeWithMemoryBlock(const void *data, size_t size, float sampleRate);
|
|
24
|
-
[[nodiscard]] static std::shared_ptr<AudioBuffer>
|
|
25
|
-
|
|
26
|
+
[[nodiscard]] static std::shared_ptr<AudioBuffer> decodeWithPCMInBase64(
|
|
27
|
+
const std::string &data,
|
|
28
|
+
float inputSampleRate,
|
|
29
|
+
int inputChannelCount,
|
|
30
|
+
bool interleaved);
|
|
26
31
|
|
|
27
32
|
private:
|
|
28
33
|
static std::vector<float> readAllPcmFrames(ma_decoder &decoder, int outputChannels);
|
|
29
|
-
static std::shared_ptr<AudioBuffer>
|
|
30
|
-
|
|
34
|
+
static std::shared_ptr<AudioBuffer> makeAudioBufferFromFloatBuffer(
|
|
35
|
+
const std::vector<float> &buffer,
|
|
36
|
+
float outputSampleRate,
|
|
37
|
+
int outputChannels);
|
|
31
38
|
|
|
32
39
|
static AudioFormat detectAudioFormat(const void *data, size_t size) {
|
|
33
40
|
if (size < 12)
|
|
@@ -66,7 +73,9 @@ class AudioDecoder {
|
|
|
66
73
|
return AudioFormat::UNKNOWN;
|
|
67
74
|
}
|
|
68
75
|
|
|
69
|
-
static inline bool pathHasExtension(
|
|
76
|
+
static inline bool pathHasExtension(
|
|
77
|
+
const std::string &path,
|
|
78
|
+
const std::vector<std::string> &extensions) {
|
|
70
79
|
std::string pathLower = path;
|
|
71
80
|
std::transform(pathLower.begin(), pathLower.end(), pathLower.begin(), ::tolower);
|
|
72
81
|
for (const auto &ext : extensions) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#include <audioapi/core/utils/AudioFileWriter.h>
|
|
2
|
+
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <string>
|
|
5
|
+
#include <unordered_map>
|
|
6
|
+
|
|
7
|
+
namespace audioapi {
|
|
8
|
+
|
|
9
|
+
AudioFileWriter::AudioFileWriter(
|
|
10
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
11
|
+
const std::shared_ptr<AudioFileProperties> &fileProperties)
|
|
12
|
+
: audioEventHandlerRegistry_(audioEventHandlerRegistry), fileProperties_(fileProperties) {}
|
|
13
|
+
|
|
14
|
+
void AudioFileWriter::setOnErrorCallback(uint64_t callbackId) {
|
|
15
|
+
errorCallbackId_.store(callbackId, std::memory_order_release);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
void AudioFileWriter::clearOnErrorCallback() {
|
|
19
|
+
errorCallbackId_.store(0, std::memory_order_release);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void AudioFileWriter::invokeOnErrorCallback(const std::string &message) {
|
|
23
|
+
uint64_t callbackId = errorCallbackId_.load(std::memory_order_acquire);
|
|
24
|
+
|
|
25
|
+
// TODO: only the line above is atomic, which means that between reading the callbackId and invoking the callback,
|
|
26
|
+
// the callback could be cleared. We need to ensure that the callback is still valid when invoking it.
|
|
27
|
+
// TL;DR: atomic szpont
|
|
28
|
+
if (audioEventHandlerRegistry_ == nullptr || callbackId == 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
std::unordered_map<std::string, EventValue> eventPayload = {};
|
|
33
|
+
eventPayload.insert({"message", message});
|
|
34
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody("error", callbackId, eventPayload);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
bool AudioFileWriter::isFileOpen() {
|
|
38
|
+
return isFileOpen_.load(std::memory_order_acquire);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
} // namespace audioapi
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <audioapi/utils/Result.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <tuple>
|
|
7
|
+
|
|
8
|
+
namespace audioapi {
|
|
9
|
+
|
|
10
|
+
class AudioFileProperties;
|
|
11
|
+
class AudioEventHandlerRegistry;
|
|
12
|
+
|
|
13
|
+
typedef Result<std::string, std::string> OpenFileResult;
|
|
14
|
+
typedef Result<std::tuple<double, double>, std::string> CloseFileResult;
|
|
15
|
+
|
|
16
|
+
class AudioFileWriter {
|
|
17
|
+
public:
|
|
18
|
+
AudioFileWriter(
|
|
19
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
|
|
20
|
+
const std::shared_ptr<AudioFileProperties> &fileProperties);
|
|
21
|
+
virtual ~AudioFileWriter() = default;
|
|
22
|
+
|
|
23
|
+
virtual CloseFileResult closeFile() = 0;
|
|
24
|
+
|
|
25
|
+
virtual std::string getFilePath() const = 0;
|
|
26
|
+
virtual double getCurrentDuration() const = 0;
|
|
27
|
+
|
|
28
|
+
void setOnErrorCallback(uint64_t callbackId);
|
|
29
|
+
void clearOnErrorCallback();
|
|
30
|
+
void invokeOnErrorCallback(const std::string &message);
|
|
31
|
+
|
|
32
|
+
protected:
|
|
33
|
+
bool isFileOpen();
|
|
34
|
+
|
|
35
|
+
std::atomic<bool> isFileOpen_{false};
|
|
36
|
+
std::atomic<size_t> framesWritten_{0};
|
|
37
|
+
std::atomic<uint64_t> errorCallbackId_{0};
|
|
38
|
+
|
|
39
|
+
std::shared_ptr<AudioFileProperties> fileProperties_;
|
|
40
|
+
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
} // namespace audioapi
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#include <audioapi/core/AudioNode.h>
|
|
2
2
|
#include <audioapi/core/utils/AudioNodeDestructor.h>
|
|
3
3
|
#include <audioapi/core/utils/Locker.h>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <utility>
|
|
4
6
|
|
|
5
7
|
namespace audioapi {
|
|
6
8
|
|
|
@@ -11,8 +13,7 @@ AudioNodeDestructor::AudioNodeDestructor() {
|
|
|
11
13
|
channels::spsc::OverflowStrategy::WAIT_ON_FULL,
|
|
12
14
|
channels::spsc::WaitStrategy::ATOMIC_WAIT>(kChannelCapacity);
|
|
13
15
|
sender_ = std::move(sender);
|
|
14
|
-
workerHandle_ =
|
|
15
|
-
std::thread(&AudioNodeDestructor::process, this, std::move(receiver));
|
|
16
|
+
workerHandle_ = std::thread(&AudioNodeDestructor::process, this, std::move(receiver));
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
AudioNodeDestructor::~AudioNodeDestructor() {
|
|
@@ -25,10 +26,8 @@ AudioNodeDestructor::~AudioNodeDestructor() {
|
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
bool AudioNodeDestructor::tryAddNodeForDeconstruction(
|
|
29
|
-
|
|
30
|
-
return sender_.try_send(std::move(node)) ==
|
|
31
|
-
channels::spsc::ResponseStatus::SUCCESS;
|
|
29
|
+
bool AudioNodeDestructor::tryAddNodeForDeconstruction(std::shared_ptr<AudioNode> &&node) {
|
|
30
|
+
return sender_.try_send(std::move(node)) == channels::spsc::ResponseStatus::SUCCESS;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
void AudioNodeDestructor::process(
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include <
|
|
3
|
+
#include <audioapi/utils/SpscChannel.hpp>
|
|
4
4
|
#include <atomic>
|
|
5
|
-
#include <vector>
|
|
6
5
|
#include <memory>
|
|
7
|
-
#include <
|
|
6
|
+
#include <thread>
|
|
7
|
+
#include <vector>
|
|
8
8
|
|
|
9
9
|
namespace audioapi {
|
|
10
10
|
|
|
11
11
|
class AudioNode;
|
|
12
12
|
|
|
13
13
|
#define AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS \
|
|
14
|
-
std::shared_ptr<AudioNode>, \
|
|
15
|
-
|
|
16
|
-
channels::spsc::WaitStrategy::ATOMIC_WAIT
|
|
14
|
+
std::shared_ptr<AudioNode>, channels::spsc::OverflowStrategy::WAIT_ON_FULL, \
|
|
15
|
+
channels::spsc::WaitStrategy::ATOMIC_WAIT
|
|
17
16
|
|
|
18
17
|
class AudioNodeDestructor {
|
|
19
18
|
public:
|
|
@@ -32,13 +31,11 @@ class AudioNodeDestructor {
|
|
|
32
31
|
std::thread workerHandle_;
|
|
33
32
|
std::atomic<bool> isExiting_;
|
|
34
33
|
|
|
35
|
-
channels::spsc::Sender<
|
|
36
|
-
AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS> sender_;
|
|
34
|
+
channels::spsc::Sender<AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS> sender_;
|
|
37
35
|
|
|
38
36
|
/// @brief Processes audio nodes for deconstruction.
|
|
39
37
|
/// @param receiver The receiver channel for incoming audio nodes.
|
|
40
|
-
void process(channels::spsc::Receiver<
|
|
41
|
-
AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS> &&receiver);
|
|
38
|
+
void process(channels::spsc::Receiver<AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS> &&receiver);
|
|
42
39
|
};
|
|
43
40
|
|
|
44
41
|
#undef AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
#include <audioapi/core/AudioNode.h>
|
|
2
2
|
#include <audioapi/core/AudioParam.h>
|
|
3
|
+
#include <audioapi/core/effects/ConvolverNode.h>
|
|
4
|
+
#include <audioapi/core/effects/DelayNode.h>
|
|
3
5
|
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
|
|
4
6
|
#include <audioapi/core/utils/AudioNodeManager.h>
|
|
5
7
|
#include <audioapi/core/utils/Locker.h>
|
|
8
|
+
#include <memory>
|
|
9
|
+
#include <utility>
|
|
10
|
+
#include <vector>
|
|
6
11
|
|
|
7
12
|
namespace audioapi {
|
|
8
13
|
|
|
@@ -116,8 +121,7 @@ void AudioNodeManager::preProcessGraph() {
|
|
|
116
121
|
prepareNodesForDestruction(processingNodes_);
|
|
117
122
|
}
|
|
118
123
|
|
|
119
|
-
void AudioNodeManager::addProcessingNode(
|
|
120
|
-
const std::shared_ptr<AudioNode> &node) {
|
|
124
|
+
void AudioNodeManager::addProcessingNode(const std::shared_ptr<AudioNode> &node) {
|
|
121
125
|
auto event = std::make_unique<Event>();
|
|
122
126
|
event->type = ConnectionType::ADD;
|
|
123
127
|
event->payloadType = EventPayloadType::NODE;
|
|
@@ -126,8 +130,7 @@ void AudioNodeManager::addProcessingNode(
|
|
|
126
130
|
sender_.send(std::move(event));
|
|
127
131
|
}
|
|
128
132
|
|
|
129
|
-
void AudioNodeManager::addSourceNode(
|
|
130
|
-
const std::shared_ptr<AudioScheduledSourceNode> &node) {
|
|
133
|
+
void AudioNodeManager::addSourceNode(const std::shared_ptr<AudioScheduledSourceNode> &node) {
|
|
131
134
|
auto event = std::make_unique<Event>();
|
|
132
135
|
event->type = ConnectionType::ADD;
|
|
133
136
|
event->payloadType = EventPayloadType::SOURCE_NODE;
|
|
@@ -147,8 +150,7 @@ void AudioNodeManager::addAudioParam(const std::shared_ptr<AudioParam> ¶m) {
|
|
|
147
150
|
|
|
148
151
|
void AudioNodeManager::settlePendingConnections() {
|
|
149
152
|
std::unique_ptr<Event> value;
|
|
150
|
-
while (receiver_.try_receive(value) !=
|
|
151
|
-
channels::spsc::ResponseStatus::CHANNEL_EMPTY) {
|
|
153
|
+
while (receiver_.try_receive(value) != channels::spsc::ResponseStatus::CHANNEL_EMPTY) {
|
|
152
154
|
switch (value->type) {
|
|
153
155
|
case ConnectionType::CONNECT:
|
|
154
156
|
handleConnectEvent(std::move(value));
|
|
@@ -196,8 +198,7 @@ void AudioNodeManager::handleDisconnectAllEvent(std::unique_ptr<Event> event) {
|
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
200
|
|
|
199
|
-
void AudioNodeManager::handleAddToDeconstructionEvent(
|
|
200
|
-
std::unique_ptr<Event> event) {
|
|
201
|
+
void AudioNodeManager::handleAddToDeconstructionEvent(std::unique_ptr<Event> event) {
|
|
201
202
|
switch (event->payloadType) {
|
|
202
203
|
case EventPayloadType::NODE:
|
|
203
204
|
processingNodes_.push_back(event->payload.node);
|
|
@@ -214,20 +215,20 @@ void AudioNodeManager::handleAddToDeconstructionEvent(
|
|
|
214
215
|
}
|
|
215
216
|
|
|
216
217
|
template <typename U>
|
|
217
|
-
inline bool AudioNodeManager::nodeCanBeDestructed(
|
|
218
|
-
std::shared_ptr<U> const &node) {
|
|
218
|
+
inline bool AudioNodeManager::nodeCanBeDestructed(std::shared_ptr<U> const &node) {
|
|
219
219
|
// If the node is an AudioScheduledSourceNode, we need to check if it is
|
|
220
220
|
// playing
|
|
221
221
|
if constexpr (std::is_base_of_v<AudioScheduledSourceNode, U>) {
|
|
222
|
-
return node.use_count() == 1 &&
|
|
223
|
-
|
|
222
|
+
return node.use_count() == 1 && (node->isUnscheduled() || node->isFinished());
|
|
223
|
+
} else if (node->requiresTailProcessing()) {
|
|
224
|
+
// if the node requires tail processing, its own implementation handles disabling it at the right time
|
|
225
|
+
return node.use_count() == 1 && !node->isEnabled();
|
|
224
226
|
}
|
|
225
227
|
return node.use_count() == 1;
|
|
226
228
|
}
|
|
227
229
|
|
|
228
230
|
template <typename U>
|
|
229
|
-
void AudioNodeManager::prepareNodesForDestruction(
|
|
230
|
-
std::vector<std::shared_ptr<U>> &vec) {
|
|
231
|
+
void AudioNodeManager::prepareNodesForDestruction(std::vector<std::shared_ptr<U>> &vec) {
|
|
231
232
|
if (vec.empty()) {
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
@@ -279,14 +280,11 @@ void AudioNodeManager::prepareNodesForDestruction(
|
|
|
279
280
|
}
|
|
280
281
|
|
|
281
282
|
void AudioNodeManager::cleanup() {
|
|
282
|
-
for (auto it = sourceNodes_.begin(), end = sourceNodes_.end(); it != end;
|
|
283
|
-
++it) {
|
|
283
|
+
for (auto it = sourceNodes_.begin(), end = sourceNodes_.end(); it != end; ++it) {
|
|
284
284
|
it->get()->cleanup();
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
-
for (auto it = processingNodes_.begin(), end = processingNodes_.end();
|
|
288
|
-
it != end;
|
|
289
|
-
++it) {
|
|
287
|
+
for (auto it = processingNodes_.begin(), end = processingNodes_.end(); it != end; ++it) {
|
|
290
288
|
it->get()->cleanup();
|
|
291
289
|
}
|
|
292
290
|
|
|
@@ -16,9 +16,8 @@ class AudioScheduledSourceNode;
|
|
|
16
16
|
class AudioParam;
|
|
17
17
|
|
|
18
18
|
#define AUDIO_NODE_MANAGER_SPSC_OPTIONS \
|
|
19
|
-
std::unique_ptr<Event>, \
|
|
20
|
-
|
|
21
|
-
channels::spsc::WaitStrategy::BUSY_LOOP
|
|
19
|
+
std::unique_ptr<Event>, channels::spsc::OverflowStrategy::WAIT_ON_FULL, \
|
|
20
|
+
channels::spsc::WaitStrategy::BUSY_LOOP
|
|
22
21
|
|
|
23
22
|
class AudioNodeManager {
|
|
24
23
|
public:
|
|
@@ -49,8 +48,8 @@ class AudioNodeManager {
|
|
|
49
48
|
EventPayloadType payloadType;
|
|
50
49
|
EventPayload payload;
|
|
51
50
|
|
|
52
|
-
Event(Event&&
|
|
53
|
-
Event&
|
|
51
|
+
Event(Event &&other);
|
|
52
|
+
Event &operator=(Event &&other);
|
|
54
53
|
Event() : type(ConnectionType::CONNECT), payloadType(EventPayloadType::NODES), payload() {}
|
|
55
54
|
~Event();
|
|
56
55
|
};
|
|
@@ -78,7 +77,7 @@ class AudioNodeManager {
|
|
|
78
77
|
void addPendingParamConnection(
|
|
79
78
|
const std::shared_ptr<AudioNode> &from,
|
|
80
79
|
const std::shared_ptr<AudioParam> &to,
|
|
81
|
-
|
|
80
|
+
ConnectionType type);
|
|
82
81
|
|
|
83
82
|
/// @brief Adds a processing node to the manager.
|
|
84
83
|
/// @param node The processing node to add.
|
|
@@ -112,11 +111,9 @@ class AudioNodeManager {
|
|
|
112
111
|
std::vector<std::shared_ptr<AudioNode>> processingNodes_;
|
|
113
112
|
std::vector<std::shared_ptr<AudioParam>> audioParams_;
|
|
114
113
|
|
|
115
|
-
channels::spsc::Receiver<
|
|
116
|
-
AUDIO_NODE_MANAGER_SPSC_OPTIONS> receiver_;
|
|
114
|
+
channels::spsc::Receiver<AUDIO_NODE_MANAGER_SPSC_OPTIONS> receiver_;
|
|
117
115
|
|
|
118
|
-
channels::spsc::Sender<
|
|
119
|
-
AUDIO_NODE_MANAGER_SPSC_OPTIONS> sender_;
|
|
116
|
+
channels::spsc::Sender<AUDIO_NODE_MANAGER_SPSC_OPTIONS> sender_;
|
|
120
117
|
|
|
121
118
|
void settlePendingConnections();
|
|
122
119
|
void handleConnectEvent(std::unique_ptr<Event> event);
|
|
@@ -128,7 +125,7 @@ class AudioNodeManager {
|
|
|
128
125
|
void prepareNodesForDestruction(std::vector<std::shared_ptr<U>> &vec);
|
|
129
126
|
|
|
130
127
|
template <typename U>
|
|
131
|
-
inline static bool nodeCanBeDestructed(std::shared_ptr<U> const&
|
|
128
|
+
inline static bool nodeCanBeDestructed(std::shared_ptr<U> const &node);
|
|
132
129
|
};
|
|
133
130
|
|
|
134
131
|
#undef AUDIO_NODE_MANAGER_SPSC_OPTIONS
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#include <audioapi/core/utils/AudioParamEventQueue.h>
|
|
2
|
+
#include <algorithm>
|
|
3
|
+
#include <utility>
|
|
2
4
|
|
|
3
5
|
namespace audioapi {
|
|
4
6
|
|
|
@@ -42,9 +44,7 @@ void AudioParamEventQueue::cancelScheduledValues(double cancelTime) {
|
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
void AudioParamEventQueue::cancelAndHoldAtTime(
|
|
46
|
-
double cancelTime,
|
|
47
|
-
double &endTimeCache) {
|
|
47
|
+
void AudioParamEventQueue::cancelAndHoldAtTime(double cancelTime, double &endTimeCache) {
|
|
48
48
|
while (!eventQueue_.isEmpty()) {
|
|
49
49
|
auto &back = eventQueue_.peekBack();
|
|
50
50
|
if (back.getEndTime() < cancelTime || back.getStartTime() <= cancelTime) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include <audioapi/core/utils/ParamChangeEvent.h>
|
|
4
3
|
#include <audioapi/core/types/ParamChangeEventType.h>
|
|
4
|
+
#include <audioapi/core/utils/ParamChangeEvent.h>
|
|
5
5
|
#include <audioapi/utils/RingBiDirectionalBuffer.hpp>
|
|
6
6
|
|
|
7
7
|
namespace audioapi {
|
|
@@ -16,7 +16,7 @@ class AudioParamEventQueue {
|
|
|
16
16
|
|
|
17
17
|
/// @brief Push a new event to the back of the queue.
|
|
18
18
|
/// @note Handles connecting the start value of the new event to the end value of the last event in the queue.
|
|
19
|
-
void pushBack(ParamChangeEvent&&
|
|
19
|
+
void pushBack(ParamChangeEvent &&event);
|
|
20
20
|
|
|
21
21
|
/// @brief Pop the front event from the queue.
|
|
22
22
|
/// @return The front event in the queue.
|
|
@@ -28,17 +28,17 @@ class AudioParamEventQueue {
|
|
|
28
28
|
|
|
29
29
|
/// @brief Cancel scheduled parameter changes and hold the current value at the given time.
|
|
30
30
|
/// @param cancelTime The time at which to cancel scheduled changes.
|
|
31
|
-
void cancelAndHoldAtTime(double cancelTime, double&
|
|
31
|
+
void cancelAndHoldAtTime(double cancelTime, double &endTimeCache);
|
|
32
32
|
|
|
33
33
|
/// @brief Get the first event in the queue.
|
|
34
34
|
/// @return The first event in the queue.
|
|
35
|
-
inline const ParamChangeEvent&
|
|
35
|
+
inline const ParamChangeEvent &front() const noexcept {
|
|
36
36
|
return eventQueue_.peekFront();
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/// @brief Get the last event in the queue.
|
|
40
40
|
/// @return The last event in the queue.
|
|
41
|
-
inline const ParamChangeEvent&
|
|
41
|
+
inline const ParamChangeEvent &back() const noexcept {
|
|
42
42
|
return eventQueue_.peekBack();
|
|
43
43
|
}
|
|
44
44
|
|