react-native-audio-api 0.11.0-alpha.1 → 0.11.0-nightly-bfab178-20251107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -11
- package/RNAudioAPI.podspec +20 -15
- package/android/build.gradle +33 -3
- package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
- package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +30 -142
- package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +13 -40
- package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
- package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +9 -9
- package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +6 -0
- package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +31 -3
- package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +21 -9
- package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +27 -6
- package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
- package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
- package/common/cpp/audioapi/AudioAPIModuleInstaller.h +30 -2
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +18 -0
- package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
- package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +47 -0
- package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +18 -97
- package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +6 -18
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +1 -1
- package/common/cpp/audioapi/core/AudioNode.h +3 -2
- package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
- package/common/cpp/audioapi/core/BaseAudioContext.cpp +10 -0
- package/common/cpp/audioapi/core/BaseAudioContext.h +2 -0
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +69 -32
- package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +37 -1
- package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +210 -0
- package/common/cpp/audioapi/core/effects/ConvolverNode.h +55 -0
- package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +82 -36
- package/common/cpp/audioapi/core/inputs/AudioRecorder.h +31 -52
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +14 -17
- package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +8 -14
- package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +0 -1
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +14 -18
- package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +2 -2
- package/common/cpp/audioapi/core/sources/StreamerNode.cpp +64 -64
- package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -10
- package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +5 -0
- package/common/cpp/audioapi/core/utils/Constants.h +2 -1
- package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +12 -8
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +3 -3
- package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +1 -1
- package/common/cpp/audioapi/dsp/AudioUtils.cpp +1 -1
- package/common/cpp/audioapi/dsp/Convolver.cpp +213 -0
- package/common/cpp/audioapi/dsp/Convolver.h +45 -0
- package/common/cpp/audioapi/dsp/FFT.cpp +0 -26
- package/common/cpp/audioapi/dsp/FFT.h +26 -2
- package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
- package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
- package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
- package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +2 -3
- package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
- package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
- package/common/cpp/audioapi/utils/AudioBus.cpp +28 -0
- package/common/cpp/audioapi/utils/AudioBus.h +3 -0
- package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
- package/common/cpp/test/CMakeLists.txt +19 -14
- package/common/cpp/test/src/AudioParamTest.cpp +1 -1
- package/common/cpp/test/src/AudioScheduledSourceTest.cpp +134 -0
- package/common/cpp/test/src/ConstantSourceTest.cpp +1 -1
- package/common/cpp/test/src/GainTest.cpp +1 -1
- package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +4 -4
- package/common/cpp/test/src/OscillatorTest.cpp +1 -1
- package/common/cpp/test/src/StereoPannerTest.cpp +1 -1
- package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +389 -0
- package/common/cpp/test/src/biquad/BiquadFilterChromium.h +64 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +284 -0
- package/common/cpp/test/src/biquad/BiquadFilterTest.h +40 -0
- package/ios/audioapi/ios/AudioAPIModule.h +2 -1
- package/ios/audioapi/ios/AudioAPIModule.mm +13 -0
- package/ios/audioapi/ios/core/IOSAudioRecorder.h +10 -28
- package/ios/audioapi/ios/core/IOSAudioRecorder.mm +30 -117
- package/ios/audioapi/ios/core/NativeAudioRecorder.h +9 -4
- package/ios/audioapi/ios/core/NativeAudioRecorder.m +71 -29
- package/ios/audioapi/ios/core/utils/AudioDecoder.mm +0 -1
- package/ios/audioapi/ios/system/AudioEngine.mm +3 -3
- package/ios/audioapi/ios/system/AudioSessionManager.h +2 -0
- package/ios/audioapi/ios/system/AudioSessionManager.mm +24 -0
- package/ios/audioapi/ios/system/LockScreenManager.h +0 -1
- package/ios/audioapi/ios/system/LockScreenManager.mm +6 -19
- package/lib/commonjs/api.js +141 -76
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/api.web.js +8 -0
- package/lib/commonjs/api.web.js.map +1 -1
- package/lib/commonjs/core/AudioContext.js +1 -1
- package/lib/commonjs/core/AudioContext.js.map +1 -1
- package/lib/commonjs/core/AudioRecorder.js +13 -171
- package/lib/commonjs/core/AudioRecorder.js.map +1 -1
- package/lib/commonjs/core/BaseAudioContext.js +28 -25
- package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
- package/lib/commonjs/core/ConvolverNode.js +37 -0
- package/lib/commonjs/core/ConvolverNode.js.map +1 -0
- package/lib/commonjs/core/OfflineAudioContext.js +1 -1
- package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
- package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/commonjs/system/AudioManager.js +3 -0
- package/lib/commonjs/system/AudioManager.js.map +1 -1
- package/lib/commonjs/types.js +0 -46
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/index.js +19 -21
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/web-core/AudioContext.js +12 -0
- package/lib/commonjs/web-core/AudioContext.js.map +1 -1
- package/lib/commonjs/web-core/ConvolverNode.js +40 -0
- package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
- package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
- package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js +12 -0
- package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/module/api.js +16 -15
- package/lib/module/api.js.map +1 -1
- package/lib/module/api.web.js +1 -0
- package/lib/module/api.web.js.map +1 -1
- package/lib/module/core/AudioContext.js +2 -2
- package/lib/module/core/AudioContext.js.map +1 -1
- package/lib/module/core/AudioRecorder.js +13 -171
- package/lib/module/core/AudioRecorder.js.map +1 -1
- package/lib/module/core/BaseAudioContext.js +29 -26
- package/lib/module/core/BaseAudioContext.js.map +1 -1
- package/lib/module/core/ConvolverNode.js +31 -0
- package/lib/module/core/ConvolverNode.js.map +1 -0
- package/lib/module/core/OfflineAudioContext.js +2 -2
- package/lib/module/core/OfflineAudioContext.js.map +1 -1
- package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
- package/lib/module/system/AudioManager.js +3 -0
- package/lib/module/system/AudioManager.js.map +1 -1
- package/lib/module/types.js +1 -45
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/index.js +15 -2
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/web-core/AudioContext.js +12 -0
- package/lib/module/web-core/AudioContext.js.map +1 -1
- package/lib/module/web-core/ConvolverNode.js +34 -0
- package/lib/module/web-core/ConvolverNode.js.map +1 -0
- package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
- package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
- package/lib/module/web-core/OfflineAudioContext.js +12 -0
- package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
- package/lib/typescript/api.d.ts +19 -17
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/api.web.d.ts +1 -0
- package/lib/typescript/api.web.d.ts.map +1 -1
- package/lib/typescript/core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/core/AudioRecorder.d.ts +7 -62
- package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
- package/lib/typescript/core/BaseAudioContext.d.ts +3 -1
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/core/ConvolverNode.d.ts +12 -0
- package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
- package/lib/typescript/events/types.d.ts +0 -16
- package/lib/typescript/events/types.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +9 -42
- package/lib/typescript/interfaces.d.ts.map +1 -1
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -0
- package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
- package/lib/typescript/system/AudioManager.d.ts +1 -0
- package/lib/typescript/system/AudioManager.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +8 -79
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +5 -2
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/web-core/AudioContext.d.ts +3 -0
- package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
- package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
- package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
- package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
- package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
- package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts +3 -0
- package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
- package/package.json +14 -5
- package/scripts/download-prebuilt-binaries.sh +61 -0
- package/scripts/rnaa_utils.rb +8 -0
- package/scripts/validate-worklets-version.js +28 -0
- package/src/api.ts +45 -18
- package/src/api.web.ts +1 -0
- package/src/core/AudioContext.ts +3 -2
- package/src/core/AudioRecorder.ts +24 -211
- package/src/core/BaseAudioContext.ts +67 -60
- package/src/core/ConvolverNode.ts +35 -0
- package/src/core/OfflineAudioContext.ts +2 -2
- package/src/events/types.ts +0 -18
- package/src/interfaces.ts +16 -52
- package/src/specs/NativeAudioAPIModule.ts +1 -0
- package/src/system/AudioManager.ts +4 -0
- package/src/types.ts +9 -90
- package/src/utils/index.ts +22 -2
- package/src/web-core/AudioContext.tsx +25 -0
- package/src/web-core/BaseAudioContext.tsx +2 -0
- package/src/web-core/ConvolverNode.tsx +43 -0
- package/src/web-core/ConvolverNodeOptions.tsx +6 -0
- package/src/web-core/OfflineAudioContext.tsx +25 -0
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +0 -37
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +0 -187
- package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +0 -57
- package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
- package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
- package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +0 -3
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +0 -429
- package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +0 -113
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +0 -269
- package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +0 -47
- package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +0 -31
- package/android/src/main/java/com/swmansion/audioapi/system/NativeFileInfo.kt +0 -18
- package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86/libswresample.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
- package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
- package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libogg.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopus.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libssl.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/arm64-v8a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libogg.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopus.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libssl.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/armeabi-v7a/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphoneos/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libogg.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopus.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libssl.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/iphonesimulator/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/Info.plist +0 -44
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -1
- package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
- package/common/cpp/audioapi/external/x86/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libcrypto.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libogg.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopus.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libopusfile.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libssl.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbis.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisenc.a +0 -0
- package/common/cpp/audioapi/external/x86_64/libvorbisfile.a +0 -0
- package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
- package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
- package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
- package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
- package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
- package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -51
- package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
- package/ios/audioapi/ios/core/IOSRecorderCallback.h +0 -57
- 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/src/utils/bitEnums.ts +0 -51
|
@@ -1,36 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>
|
|
2
|
+
#include <audioapi/core/inputs/AudioRecorder.h>
|
|
3
|
+
#include <audioapi/core/sources/AudioBuffer.h>
|
|
4
|
+
#include <audioapi/core/sources/RecorderAdapterNode.h>
|
|
5
|
+
#include <audioapi/events/AudioEventHandlerRegistry.h>
|
|
6
|
+
#include <audioapi/utils/AudioBus.h>
|
|
7
|
+
#include <audioapi/utils/CircularAudioArray.h>
|
|
8
|
+
#include <audioapi/utils/CircularOverflowableAudioArray.h>
|
|
9
|
+
|
|
10
|
+
namespace audioapi {
|
|
11
|
+
|
|
12
|
+
AudioRecorder::AudioRecorder(
|
|
13
|
+
float sampleRate,
|
|
14
|
+
int bufferLength,
|
|
15
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
|
|
16
|
+
: sampleRate_(sampleRate),
|
|
17
|
+
bufferLength_(bufferLength),
|
|
18
|
+
audioEventHandlerRegistry_(audioEventHandlerRegistry) {
|
|
19
|
+
constexpr int minRingBufferSize = 8192;
|
|
20
|
+
ringBufferSize_ = std::max(2 * bufferLength, minRingBufferSize);
|
|
21
|
+
circularBuffer_ = std::make_shared<CircularAudioArray>(ringBufferSize_);
|
|
22
|
+
isRunning_.store(false);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void AudioRecorder::setOnAudioReadyCallbackId(uint64_t callbackId) {
|
|
26
|
+
onAudioReadyCallbackId_ = callbackId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void AudioRecorder::invokeOnAudioReadyCallback(
|
|
30
|
+
const std::shared_ptr<AudioBus> &bus,
|
|
31
|
+
int numFrames) {
|
|
32
|
+
auto audioBuffer = std::make_shared<AudioBuffer>(bus);
|
|
33
|
+
auto audioBufferHostObject =
|
|
34
|
+
std::make_shared<AudioBufferHostObject>(audioBuffer);
|
|
35
|
+
|
|
36
|
+
std::unordered_map<std::string, EventValue> body = {};
|
|
37
|
+
body.insert({"buffer", audioBufferHostObject});
|
|
38
|
+
body.insert({"numFrames", numFrames});
|
|
39
|
+
|
|
40
|
+
if (audioEventHandlerRegistry_ != nullptr) {
|
|
41
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
42
|
+
"audioReady", onAudioReadyCallbackId_, body);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void AudioRecorder::sendRemainingData() {
|
|
47
|
+
auto bus = std::make_shared<AudioBus>(
|
|
48
|
+
circularBuffer_->getNumberOfAvailableFrames(), 1, sampleRate_);
|
|
49
|
+
auto *outputChannel = bus->getChannel(0)->getData();
|
|
50
|
+
auto availableFrames =
|
|
51
|
+
static_cast<int>(circularBuffer_->getNumberOfAvailableFrames());
|
|
52
|
+
|
|
53
|
+
circularBuffer_->pop_front(
|
|
54
|
+
outputChannel, circularBuffer_->getNumberOfAvailableFrames());
|
|
55
|
+
|
|
56
|
+
invokeOnAudioReadyCallback(bus, availableFrames);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void AudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node) {
|
|
60
|
+
node->init(ringBufferSize_);
|
|
61
|
+
adapterNodeLock_.lock();
|
|
62
|
+
adapterNode_ = node;
|
|
63
|
+
adapterNodeLock_.unlock();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void AudioRecorder::disconnect() {
|
|
67
|
+
adapterNodeLock_.lock();
|
|
68
|
+
adapterNode_ = nullptr;
|
|
69
|
+
adapterNodeLock_.unlock();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
void AudioRecorder::writeToBuffers(const float *data, int numFrames) {
|
|
73
|
+
if (adapterNodeLock_.try_lock()) {
|
|
74
|
+
if (adapterNode_ != nullptr) {
|
|
75
|
+
adapterNode_->buff_->write(data, numFrames);
|
|
76
|
+
}
|
|
77
|
+
adapterNodeLock_.unlock();
|
|
78
|
+
}
|
|
79
|
+
circularBuffer_->push_back(data, numFrames);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
} // namespace audioapi
|
|
@@ -3,82 +3,61 @@
|
|
|
3
3
|
#include <memory>
|
|
4
4
|
#include <atomic>
|
|
5
5
|
#include <mutex>
|
|
6
|
-
#include <string>
|
|
7
|
-
#include <tuple>
|
|
8
6
|
|
|
9
7
|
namespace audioapi {
|
|
10
8
|
|
|
11
9
|
class RecorderAdapterNode;
|
|
12
10
|
class AudioBus;
|
|
13
11
|
class CircularAudioArray;
|
|
12
|
+
class CircularOverflowableAudioArray;
|
|
14
13
|
class AudioEventHandlerRegistry;
|
|
15
14
|
|
|
16
15
|
class AudioRecorder {
|
|
17
16
|
public:
|
|
18
|
-
|
|
19
|
-
explicit AudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry):
|
|
20
|
-
audioEventHandlerRegistry_(audioEventHandlerRegistry) {}
|
|
21
|
-
virtual ~AudioRecorder() = default;
|
|
22
|
-
|
|
23
|
-
virtual std::string start() = 0;
|
|
24
|
-
virtual std::tuple<std::string, double, double> stop() = 0;
|
|
25
|
-
|
|
26
|
-
virtual void enableFileOutput(
|
|
27
|
-
float sampleRate,
|
|
28
|
-
size_t channelCount,
|
|
29
|
-
size_t bitRate,
|
|
30
|
-
size_t iosFlags,
|
|
31
|
-
size_t androidFlags) = 0;
|
|
32
|
-
virtual void disableFileOutput() = 0;
|
|
33
|
-
|
|
34
|
-
virtual void pause() = 0;
|
|
35
|
-
virtual void resume() = 0;
|
|
36
|
-
|
|
37
|
-
void connect(const std::shared_ptr<RecorderAdapterNode> &node) {}
|
|
38
|
-
void disconnect() {}
|
|
39
|
-
|
|
40
|
-
virtual void setOnAudioReadyCallback(
|
|
17
|
+
explicit AudioRecorder(
|
|
41
18
|
float sampleRate,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
virtual void clearOnAudioReadyCallback() = 0;
|
|
46
|
-
|
|
47
|
-
virtual double getCurrentDuration() const = 0;
|
|
19
|
+
int bufferLength,
|
|
20
|
+
const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry
|
|
21
|
+
);
|
|
48
22
|
|
|
49
|
-
|
|
50
|
-
return callbackOutputEnabled_.load();
|
|
51
|
-
}
|
|
23
|
+
virtual ~AudioRecorder() = default;
|
|
52
24
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
25
|
+
void setOnAudioReadyCallbackId(uint64_t callbackId);
|
|
26
|
+
void invokeOnAudioReadyCallback(const std::shared_ptr<AudioBus> &bus, int numFrames);
|
|
27
|
+
void sendRemainingData();
|
|
56
28
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
29
|
+
/// @brief
|
|
30
|
+
/// # Connects the recorder to the adapter node.
|
|
31
|
+
///
|
|
32
|
+
/// The adapter node will be used to read audio data from the recorder.
|
|
33
|
+
/// @note Few frames of audio might not yet be written to the buffer when connecting.
|
|
34
|
+
void connect(const std::shared_ptr<RecorderAdapterNode> &node);
|
|
60
35
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
36
|
+
/// @brief
|
|
37
|
+
/// # Disconnects the recorder from the adapter node.
|
|
38
|
+
///
|
|
39
|
+
/// The adapter node will no longer be used to read audio data from the recorder.
|
|
40
|
+
/// @note Last few frames of audio might be written to the buffer after disconnecting.
|
|
41
|
+
void disconnect();
|
|
64
42
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
43
|
+
virtual void start() = 0;
|
|
44
|
+
virtual void stop() = 0;
|
|
68
45
|
|
|
69
46
|
protected:
|
|
70
|
-
|
|
47
|
+
float sampleRate_;
|
|
48
|
+
int bufferLength_;
|
|
49
|
+
size_t ringBufferSize_;
|
|
71
50
|
|
|
72
|
-
std::atomic<
|
|
73
|
-
std::
|
|
74
|
-
std::atomic<bool> callbackOutputEnabled_{false};
|
|
75
|
-
std::atomic<bool> isConnected_{false};
|
|
76
|
-
// std::shared_ptr<CircularAudioArray> circularBuffer_;
|
|
51
|
+
std::atomic<bool> isRunning_;
|
|
52
|
+
std::shared_ptr<CircularAudioArray> circularBuffer_;
|
|
77
53
|
|
|
78
54
|
mutable std::mutex adapterNodeLock_;
|
|
79
55
|
std::shared_ptr<RecorderAdapterNode> adapterNode_ = nullptr;
|
|
80
56
|
|
|
81
57
|
std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
58
|
+
uint64_t onAudioReadyCallbackId_ = 0;
|
|
59
|
+
|
|
60
|
+
void writeToBuffers(const float *data, int numFrames);
|
|
82
61
|
};
|
|
83
62
|
|
|
84
63
|
} // namespace audioapi
|
|
@@ -36,20 +36,15 @@ std::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getPlaybackRateParam()
|
|
|
36
36
|
return playbackRateParam_;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
void AudioBufferBaseSourceNode::clearOnPositionChangedCallback() {
|
|
40
|
-
if (onPositionChangedCallbackId_ == 0 || context_ == nullptr ||
|
|
41
|
-
context_->audioEventHandlerRegistry_ == nullptr) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
context_->audioEventHandlerRegistry_->unregisterHandler(
|
|
46
|
-
"positionChanged", onPositionChangedCallbackId_);
|
|
47
|
-
onPositionChangedCallbackId_ = 0;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
39
|
void AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(
|
|
51
40
|
uint64_t callbackId) {
|
|
52
|
-
|
|
41
|
+
auto oldCallbackId = onPositionChangedCallbackId_.exchange(
|
|
42
|
+
callbackId, std::memory_order_acq_rel);
|
|
43
|
+
|
|
44
|
+
if (oldCallbackId != 0) {
|
|
45
|
+
audioEventHandlerRegistry_->unregisterHandler(
|
|
46
|
+
"positionChanged", oldCallbackId);
|
|
47
|
+
}
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
void AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {
|
|
@@ -66,14 +61,16 @@ std::mutex &AudioBufferBaseSourceNode::getBufferLock() {
|
|
|
66
61
|
}
|
|
67
62
|
|
|
68
63
|
void AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
auto onPositionChangedCallbackId =
|
|
65
|
+
onPositionChangedCallbackId_.load(std::memory_order_acquire);
|
|
66
|
+
|
|
67
|
+
if (onPositionChangedCallbackId != 0 &&
|
|
68
|
+
onPositionChangedTime_ > onPositionChangedInterval_) {
|
|
72
69
|
std::unordered_map<std::string, EventValue> body = {
|
|
73
70
|
{"value", getCurrentPosition()}};
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
"positionChanged",
|
|
72
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
73
|
+
"positionChanged", onPositionChangedCallbackId, body);
|
|
77
74
|
|
|
78
75
|
onPositionChangedTime_ = 0;
|
|
79
76
|
}
|
|
@@ -19,7 +19,6 @@ 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;
|
|
@@ -123,19 +123,13 @@ void AudioBufferSourceNode::disable() {
|
|
|
123
123
|
alignedBus_.reset();
|
|
124
124
|
}
|
|
125
125
|
|
|
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
126
|
void AudioBufferSourceNode::setOnLoopEndedCallbackId(uint64_t callbackId) {
|
|
138
|
-
|
|
127
|
+
auto oldCallbackId =
|
|
128
|
+
onLoopEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
|
|
129
|
+
|
|
130
|
+
if (oldCallbackId != 0) {
|
|
131
|
+
audioEventHandlerRegistry_->unregisterHandler("loopEnded", oldCallbackId);
|
|
132
|
+
}
|
|
139
133
|
}
|
|
140
134
|
|
|
141
135
|
std::shared_ptr<AudioBus> AudioBufferSourceNode::processNode(
|
|
@@ -171,8 +165,8 @@ void AudioBufferSourceNode::sendOnLoopEndedEvent() {
|
|
|
171
165
|
auto onLoopEndedCallbackId =
|
|
172
166
|
onLoopEndedCallbackId_.load(std::memory_order_acquire);
|
|
173
167
|
if (onLoopEndedCallbackId != 0) {
|
|
174
|
-
|
|
175
|
-
"loopEnded",
|
|
168
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
169
|
+
"loopEnded", onLoopEndedCallbackId, {});
|
|
176
170
|
}
|
|
177
171
|
}
|
|
178
172
|
|
|
@@ -34,7 +34,6 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
|
|
|
34
34
|
void start(double when, double offset, double duration = -1);
|
|
35
35
|
void disable() override;
|
|
36
36
|
|
|
37
|
-
void clearOnLoopEndedCallback();
|
|
38
37
|
void setOnLoopEndedCallbackId(uint64_t callbackId);
|
|
39
38
|
|
|
40
39
|
protected:
|
|
@@ -14,6 +14,7 @@ AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
|
|
|
14
14
|
stopTime_(-1.0),
|
|
15
15
|
playbackState_(PlaybackState::UNSCHEDULED) {
|
|
16
16
|
numberOfInputs_ = 0;
|
|
17
|
+
audioEventHandlerRegistry_ = context_->audioEventHandlerRegistry_;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
void AudioScheduledSourceNode::start(double when) {
|
|
@@ -45,19 +46,13 @@ bool AudioScheduledSourceNode::isStopScheduled() {
|
|
|
45
46
|
return playbackState_ == PlaybackState::STOP_SCHEDULED;
|
|
46
47
|
}
|
|
47
48
|
|
|
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
49
|
void AudioScheduledSourceNode::setOnEndedCallbackId(const uint64_t callbackId) {
|
|
60
|
-
|
|
50
|
+
auto oldCallbackId =
|
|
51
|
+
onEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
|
|
52
|
+
|
|
53
|
+
if (oldCallbackId != 0) {
|
|
54
|
+
audioEventHandlerRegistry_->unregisterHandler("ended", oldCallbackId);
|
|
55
|
+
}
|
|
61
56
|
}
|
|
62
57
|
|
|
63
58
|
void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
@@ -76,7 +71,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
76
71
|
auto sampleRate = context_->getSampleRate();
|
|
77
72
|
|
|
78
73
|
size_t firstFrame = context_->getCurrentSampleFrame();
|
|
79
|
-
size_t lastFrame = firstFrame + framesToProcess;
|
|
74
|
+
size_t lastFrame = firstFrame + framesToProcess - 1;
|
|
80
75
|
|
|
81
76
|
size_t startFrame =
|
|
82
77
|
std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
|
|
@@ -105,7 +100,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
105
100
|
? std::max(startFrame, firstFrame) - firstFrame
|
|
106
101
|
: 0;
|
|
107
102
|
nonSilentFramesToProcess =
|
|
108
|
-
std::max(std::min(lastFrame, stopFrame), startFrame) - startFrame;
|
|
103
|
+
std::max(std::min(lastFrame, stopFrame) + 1, startFrame) - startFrame;
|
|
109
104
|
|
|
110
105
|
assert(startOffset <= framesToProcess);
|
|
111
106
|
assert(nonSilentFramesToProcess <= framesToProcess);
|
|
@@ -124,7 +119,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
124
119
|
|
|
125
120
|
// stop will happen in this render quantum
|
|
126
121
|
// zero remaining frames after stop frame
|
|
127
|
-
if (stopFrame
|
|
122
|
+
if (stopFrame <= lastFrame && stopFrame >= firstFrame) {
|
|
128
123
|
playbackState_ = PlaybackState::STOP_SCHEDULED;
|
|
129
124
|
startOffset = 0;
|
|
130
125
|
nonSilentFramesToProcess = stopFrame - firstFrame;
|
|
@@ -160,9 +155,10 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
|
|
|
160
155
|
void AudioScheduledSourceNode::disable() {
|
|
161
156
|
AudioNode::disable();
|
|
162
157
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
158
|
+
auto onEndedCallbackId = onEndedCallbackId_.load(std::memory_order_acquire);
|
|
159
|
+
if (onEndedCallbackId != 0) {
|
|
160
|
+
audioEventHandlerRegistry_->invokeHandlerWithEventBody(
|
|
161
|
+
"ended", onEndedCallbackId, {});
|
|
166
162
|
}
|
|
167
163
|
}
|
|
168
164
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
namespace audioapi {
|
|
18
18
|
|
|
19
|
-
class
|
|
19
|
+
class IAudioEventHandlerRegistry;
|
|
20
20
|
|
|
21
21
|
class AudioScheduledSourceNode : public AudioNode {
|
|
22
22
|
public:
|
|
@@ -37,7 +37,6 @@ class AudioScheduledSourceNode : public AudioNode {
|
|
|
37
37
|
bool isFinished();
|
|
38
38
|
bool isStopScheduled();
|
|
39
39
|
|
|
40
|
-
void clearOnEndedCallback();
|
|
41
40
|
void setOnEndedCallbackId(uint64_t callbackId);
|
|
42
41
|
|
|
43
42
|
void disable() override;
|
|
@@ -49,6 +48,7 @@ class AudioScheduledSourceNode : public AudioNode {
|
|
|
49
48
|
PlaybackState playbackState_;
|
|
50
49
|
|
|
51
50
|
std::atomic<uint64_t> onEndedCallbackId_ = 0;
|
|
51
|
+
std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
|
|
52
52
|
|
|
53
53
|
void updatePlaybackInfo(
|
|
54
54
|
const std::shared_ptr<AudioBus>& processingBus,
|
|
@@ -25,14 +25,12 @@ StreamerNode::StreamerNode(BaseAudioContext *context)
|
|
|
25
25
|
codecpar_(nullptr),
|
|
26
26
|
pkt_(nullptr),
|
|
27
27
|
frame_(nullptr),
|
|
28
|
-
pendingFrame_(nullptr),
|
|
29
|
-
bufferedBus_(nullptr),
|
|
30
|
-
bufferedBusIndex_(0),
|
|
31
|
-
maxBufferSize_(0),
|
|
32
|
-
audio_stream_index_(-1),
|
|
33
28
|
swrCtx_(nullptr),
|
|
34
29
|
resampledData_(nullptr),
|
|
35
|
-
|
|
30
|
+
bufferedBus_(nullptr),
|
|
31
|
+
audio_stream_index_(-1),
|
|
32
|
+
maxResampledSamples_(0),
|
|
33
|
+
processedSamples_(0) {}
|
|
36
34
|
|
|
37
35
|
StreamerNode::~StreamerNode() {
|
|
38
36
|
cleanup();
|
|
@@ -66,26 +64,22 @@ bool StreamerNode::initialize(const std::string &input_url) {
|
|
|
66
64
|
return false;
|
|
67
65
|
}
|
|
68
66
|
|
|
69
|
-
maxBufferSize_ = BUFFER_LENGTH_SECONDS * codecCtx_->sample_rate;
|
|
70
|
-
// If decoding is faster than playing, we buffer few seconds of audio
|
|
71
|
-
bufferedBus_ = std::make_shared<AudioBus>(
|
|
72
|
-
maxBufferSize_, codecpar_->ch_layout.nb_channels, codecCtx_->sample_rate);
|
|
73
|
-
|
|
74
67
|
channelCount_ = codecpar_->ch_layout.nb_channels;
|
|
75
68
|
audioBus_ = std::make_shared<AudioBus>(
|
|
76
69
|
RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
|
|
77
70
|
|
|
71
|
+
auto [sender, receiver] = channels::spsc::channel<
|
|
72
|
+
StreamingData,
|
|
73
|
+
channels::spsc::OverflowStrategy::WAIT_ON_FULL,
|
|
74
|
+
channels::spsc::WaitStrategy::ATOMIC_WAIT>(CHANNEL_CAPACITY);
|
|
75
|
+
sender_ = std::move(sender);
|
|
76
|
+
receiver_ = std::move(receiver);
|
|
77
|
+
|
|
78
78
|
streamingThread_ = std::thread(&StreamerNode::streamAudio, this);
|
|
79
|
-
streamFlag.store(true);
|
|
80
79
|
isInitialized_ = true;
|
|
81
80
|
return true;
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
void StreamerNode::stop(double when) {
|
|
85
|
-
AudioScheduledSourceNode::stop(when);
|
|
86
|
-
streamFlag.store(false);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
83
|
bool StreamerNode::setupResampler() {
|
|
90
84
|
// Allocate resampler context
|
|
91
85
|
swrCtx_ = swr_alloc();
|
|
@@ -122,30 +116,27 @@ bool StreamerNode::setupResampler() {
|
|
|
122
116
|
}
|
|
123
117
|
|
|
124
118
|
void StreamerNode::streamAudio() {
|
|
125
|
-
while (
|
|
126
|
-
if (
|
|
127
|
-
|
|
119
|
+
while (!isNodeFinished_.load(std::memory_order_acquire)) {
|
|
120
|
+
if (av_read_frame(fmtCtx_, pkt_) < 0) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (pkt_->stream_index == audio_stream_index_) {
|
|
124
|
+
if (avcodec_send_packet(codecCtx_, pkt_) != 0) {
|
|
128
125
|
return;
|
|
129
126
|
}
|
|
130
|
-
|
|
131
|
-
if (av_read_frame(fmtCtx_, pkt_) < 0) {
|
|
127
|
+
if (avcodec_receive_frame(codecCtx_, frame_) != 0) {
|
|
132
128
|
return;
|
|
133
129
|
}
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
if (avcodec_receive_frame(codecCtx_, frame_) != 0) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
if (!processFrameWithResampler(frame_)) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
130
|
+
if (!processFrameWithResampler(frame_)) {
|
|
131
|
+
return;
|
|
144
132
|
}
|
|
145
|
-
av_packet_unref(pkt_);
|
|
146
133
|
}
|
|
147
|
-
|
|
134
|
+
av_packet_unref(pkt_);
|
|
148
135
|
}
|
|
136
|
+
StreamingData dummy;
|
|
137
|
+
while (receiver_.try_receive(dummy) ==
|
|
138
|
+
channels::spsc::ResponseStatus::SUCCESS)
|
|
139
|
+
; // clear the receiver
|
|
149
140
|
}
|
|
150
141
|
|
|
151
142
|
std::shared_ptr<AudioBus> StreamerNode::processNode(
|
|
@@ -154,34 +145,44 @@ std::shared_ptr<AudioBus> StreamerNode::processNode(
|
|
|
154
145
|
size_t startOffset = 0;
|
|
155
146
|
size_t offsetLength = 0;
|
|
156
147
|
updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
|
|
148
|
+
isNodeFinished_.store(isFinished(), std::memory_order_release);
|
|
157
149
|
|
|
158
150
|
if (!isPlaying() && !isStopScheduled()) {
|
|
159
151
|
processingBus->zero();
|
|
160
152
|
return processingBus;
|
|
161
153
|
}
|
|
162
154
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
155
|
+
int bufferRemaining = bufferedBusSize_ - processedSamples_;
|
|
156
|
+
int alreadyProcessed = 0;
|
|
157
|
+
if (bufferRemaining < framesToProcess) {
|
|
158
|
+
if (bufferedBus_ != nullptr) {
|
|
159
|
+
for (int ch = 0; ch < processingBus->getNumberOfChannels(); ch++) {
|
|
160
|
+
memcpy(
|
|
161
|
+
processingBus->getChannel(ch)->getData(),
|
|
162
|
+
bufferedBus_->getChannel(ch)->getData() + processedSamples_,
|
|
163
|
+
bufferRemaining * sizeof(float));
|
|
164
|
+
}
|
|
165
|
+
framesToProcess -= bufferRemaining;
|
|
166
|
+
alreadyProcessed += bufferRemaining;
|
|
167
|
+
}
|
|
168
|
+
StreamingData data;
|
|
169
|
+
auto res = receiver_.try_receive(data);
|
|
170
|
+
if (res == channels::spsc::ResponseStatus::SUCCESS) {
|
|
171
|
+
bufferedBus_ = std::make_shared<AudioBus>(std::move(data.bus));
|
|
172
|
+
bufferedBusSize_ = data.size;
|
|
173
|
+
processedSamples_ = 0;
|
|
174
|
+
} else {
|
|
175
|
+
bufferedBus_ = nullptr;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (bufferedBus_ != nullptr) {
|
|
166
179
|
for (int ch = 0; ch < processingBus->getNumberOfChannels(); ch++) {
|
|
167
180
|
memcpy(
|
|
168
|
-
processingBus->getChannel(ch)->getData(),
|
|
169
|
-
bufferedBus_->getChannel(ch)->getData(),
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
memmove(
|
|
173
|
-
bufferedBus_->getChannel(ch)->getData(),
|
|
174
|
-
bufferedBus_->getChannel(ch)->getData() + offsetLength,
|
|
175
|
-
(maxBufferSize_ - offsetLength) * sizeof(float));
|
|
181
|
+
processingBus->getChannel(ch)->getData() + alreadyProcessed,
|
|
182
|
+
bufferedBus_->getChannel(ch)->getData() + processedSamples_,
|
|
183
|
+
framesToProcess * sizeof(float));
|
|
176
184
|
}
|
|
177
|
-
|
|
178
|
-
} else {
|
|
179
|
-
if (VERBOSE)
|
|
180
|
-
printf(
|
|
181
|
-
"Buffer underrun: have %zu, need %zu\n",
|
|
182
|
-
bufferedBusIndex_,
|
|
183
|
-
(size_t)framesToProcess);
|
|
184
|
-
processingBus->zero();
|
|
185
|
+
processedSamples_ += framesToProcess;
|
|
185
186
|
}
|
|
186
187
|
|
|
187
188
|
return processingBus;
|
|
@@ -220,22 +221,21 @@ bool StreamerNode::processFrameWithResampler(AVFrame *frame) {
|
|
|
220
221
|
return false;
|
|
221
222
|
}
|
|
222
223
|
|
|
223
|
-
//
|
|
224
|
-
if (
|
|
225
|
-
pendingFrame_ = frame;
|
|
224
|
+
// if we would like to finish dont copy anything
|
|
225
|
+
if (this->isFinished()) {
|
|
226
226
|
return true;
|
|
227
|
-
} else {
|
|
228
|
-
pendingFrame_ = nullptr;
|
|
229
227
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
228
|
+
auto bus = AudioBus(
|
|
229
|
+
static_cast<size_t>(converted_samples),
|
|
230
|
+
codecCtx_->ch_layout.nb_channels,
|
|
231
|
+
context_->getSampleRate());
|
|
233
232
|
for (int ch = 0; ch < codecCtx_->ch_layout.nb_channels; ch++) {
|
|
234
233
|
auto *src = reinterpret_cast<float *>(resampledData_[ch]);
|
|
235
|
-
float *dst =
|
|
234
|
+
float *dst = bus.getChannel(ch)->getData();
|
|
236
235
|
memcpy(dst, src, converted_samples * sizeof(float));
|
|
237
236
|
}
|
|
238
|
-
|
|
237
|
+
StreamingData data{std::move(bus), static_cast<size_t>(converted_samples)};
|
|
238
|
+
sender_.send(std::move(data));
|
|
239
239
|
return true;
|
|
240
240
|
}
|
|
241
241
|
|
|
@@ -280,7 +280,7 @@ bool StreamerNode::setupDecoder() {
|
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
void StreamerNode::cleanup() {
|
|
283
|
-
|
|
283
|
+
this->playbackState_ = PlaybackState::FINISHED;
|
|
284
284
|
// cleanup cannot be called from the streaming thread so there is no need to
|
|
285
285
|
// check if we are in the same thread
|
|
286
286
|
streamingThread_.join();
|