react-native-audio-api 0.11.0-alpha.0 → 0.11.0-alpha.10

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.
Files changed (623) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +353 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +32 -19
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +15 -15
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +170 -0
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +46 -0
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +46 -58
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +366 -304
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +49 -91
  19. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +56 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +114 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +154 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +10 -16
  24. package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +2 -1
  25. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +189 -14
  26. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioPlayer.kt +10 -8
  27. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +10 -8
  28. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -2
  29. package/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt +128 -0
  30. package/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt +116 -0
  31. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +115 -107
  32. package/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt +2 -1
  33. package/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt +47 -0
  34. package/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt +191 -0
  35. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +669 -0
  36. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +33 -0
  37. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt +303 -0
  38. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +45 -0
  39. package/android/src/main/java/com/swmansion/audioapi/system/notification/SimpleNotification.kt +119 -0
  40. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  42. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  43. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  44. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  45. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  46. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  47. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  48. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  49. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  50. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  51. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  52. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  53. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  54. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  55. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  56. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +100 -76
  57. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  58. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  59. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  60. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  61. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  62. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  63. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  64. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  65. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  66. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  68. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  69. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  70. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  71. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  72. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  73. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  74. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  75. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  76. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  77. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  78. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  79. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  80. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  81. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  82. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  83. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  84. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +109 -44
  85. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -2
  86. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  87. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  88. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  89. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  90. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  91. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  92. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  93. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  94. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  95. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  96. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  97. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  98. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  99. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  100. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  101. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  102. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  103. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  104. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  105. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  106. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  107. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  108. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  109. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  110. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  111. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  112. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  113. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  114. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  115. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  116. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  117. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  118. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  119. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +96 -74
  120. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +44 -15
  121. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  122. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  123. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  124. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  125. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  126. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  127. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  128. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  129. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  130. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  131. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  132. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  133. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  134. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  135. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  136. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  137. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +39 -108
  138. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +47 -46
  139. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  140. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  141. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  142. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  143. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  144. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  145. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  146. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  147. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  148. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  149. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  150. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  151. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  152. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  153. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  154. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  155. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +105 -87
  156. package/common/cpp/audioapi/core/sources/StreamerNode.h +67 -33
  157. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  158. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  159. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  160. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  161. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  162. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +44 -0
  163. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  164. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  165. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  166. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  167. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  168. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  169. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  170. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +52 -0
  171. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  172. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  173. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  174. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  175. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  176. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  177. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  178. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  179. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  180. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  181. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  182. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  183. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  184. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  185. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  186. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  187. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  188. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  189. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  190. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  217. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  218. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  219. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  220. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  221. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  222. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  223. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  224. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  225. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  226. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  227. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  228. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  229. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  230. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  231. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  232. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  233. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  234. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  235. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  236. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  237. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  238. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  239. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  240. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  241. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  242. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  243. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  244. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  245. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  246. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  247. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  248. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +53 -0
  249. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  250. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  251. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  252. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  253. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  254. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  255. package/common/cpp/audioapi/utils/Benchmark.hpp +50 -47
  256. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  257. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  258. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  259. package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +12 -9
  260. package/common/cpp/audioapi/utils/MoveOnlyFunction.hpp +17 -15
  261. package/common/cpp/audioapi/utils/Result.hpp +323 -0
  262. package/common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp +22 -28
  263. package/common/cpp/audioapi/utils/SpscChannel.hpp +329 -305
  264. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -20
  265. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  266. package/common/cpp/test/CMakeLists.txt +15 -15
  267. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  268. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  269. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  270. package/common/cpp/test/src/DelayTest.cpp +108 -0
  271. package/common/cpp/test/src/GainTest.cpp +4 -5
  272. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  273. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  274. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  275. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  276. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  277. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  278. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  279. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  280. package/ios/audioapi/ios/AudioAPIModule.h +4 -3
  281. package/ios/audioapi/ios/AudioAPIModule.mm +148 -34
  282. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  283. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  284. package/ios/audioapi/ios/core/IOSAudioRecorder.h +28 -11
  285. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +280 -45
  286. package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
  287. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  288. package/ios/audioapi/ios/core/NativeAudioRecorder.m +74 -6
  289. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -4
  290. package/ios/audioapi/ios/core/utils/FileOptions.h +33 -0
  291. package/ios/audioapi/ios/core/utils/FileOptions.mm +195 -0
  292. package/ios/audioapi/ios/core/utils/IOSFileWriter.h +53 -0
  293. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
  294. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  295. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +185 -0
  296. package/ios/audioapi/ios/system/AudioEngine.h +21 -16
  297. package/ios/audioapi/ios/system/AudioEngine.mm +153 -132
  298. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  299. package/ios/audioapi/ios/system/AudioSessionManager.mm +277 -203
  300. package/ios/audioapi/ios/system/NotificationManager.mm +47 -53
  301. package/ios/audioapi/ios/system/notification/BaseNotification.h +58 -0
  302. package/ios/audioapi/ios/system/notification/NotificationRegistry.h +70 -0
  303. package/ios/audioapi/ios/system/notification/NotificationRegistry.mm +172 -0
  304. package/ios/audioapi/ios/system/notification/PlaybackNotification.h +27 -0
  305. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +427 -0
  306. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  307. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  308. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  309. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  310. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  311. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  312. package/lib/commonjs/api.js +89 -12
  313. package/lib/commonjs/api.js.map +1 -1
  314. package/lib/commonjs/api.web.js +35 -14
  315. package/lib/commonjs/api.web.js.map +1 -1
  316. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  317. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  318. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  319. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  320. package/lib/commonjs/core/AudioContext.js +5 -8
  321. package/lib/commonjs/core/AudioContext.js.map +1 -1
  322. package/lib/commonjs/core/AudioNode.js +1 -1
  323. package/lib/commonjs/core/AudioNode.js.map +1 -1
  324. package/lib/commonjs/core/AudioParam.js +18 -11
  325. package/lib/commonjs/core/AudioParam.js.map +1 -1
  326. package/lib/commonjs/core/AudioRecorder.js +56 -55
  327. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  328. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  329. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  330. package/lib/commonjs/core/ConvolverNode.js +37 -0
  331. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  332. package/lib/commonjs/core/DelayNode.js +17 -0
  333. package/lib/commonjs/core/DelayNode.js.map +1 -0
  334. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  335. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  336. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  337. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  338. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  339. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  340. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  341. package/lib/commonjs/system/AudioManager.js +9 -15
  342. package/lib/commonjs/system/AudioManager.js.map +1 -1
  343. package/lib/commonjs/system/index.js +13 -0
  344. package/lib/commonjs/system/index.js.map +1 -1
  345. package/lib/commonjs/system/notification/PlaybackNotificationManager.js +138 -0
  346. package/lib/commonjs/system/notification/PlaybackNotificationManager.js.map +1 -0
  347. package/lib/commonjs/system/notification/RecordingNotificationManager.js +185 -0
  348. package/lib/commonjs/system/notification/RecordingNotificationManager.js.map +1 -0
  349. package/lib/commonjs/system/notification/SimpleNotificationManager.js +125 -0
  350. package/lib/commonjs/system/notification/SimpleNotificationManager.js.map +1 -0
  351. package/lib/commonjs/system/notification/index.js +45 -0
  352. package/lib/commonjs/system/notification/index.js.map +1 -0
  353. package/lib/commonjs/system/notification/types.js +6 -0
  354. package/lib/commonjs/system/notification/types.js.map +1 -0
  355. package/lib/commonjs/types.js +28 -35
  356. package/lib/commonjs/types.js.map +1 -1
  357. package/lib/commonjs/utils/filePresets.js +43 -0
  358. package/lib/commonjs/utils/filePresets.js.map +1 -0
  359. package/lib/commonjs/utils/index.js +12 -27
  360. package/lib/commonjs/utils/index.js.map +1 -1
  361. package/lib/commonjs/web-core/AudioContext.js +21 -1
  362. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  363. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  364. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  365. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  366. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  367. package/lib/commonjs/web-core/DelayNode.js +17 -0
  368. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  369. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  370. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  371. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  372. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  373. package/lib/commonjs/web-system/index.js +17 -0
  374. package/lib/commonjs/web-system/index.js.map +1 -0
  375. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js +37 -0
  376. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  377. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js +37 -0
  378. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js.map +1 -0
  379. package/lib/commonjs/web-system/notification/index.js +21 -0
  380. package/lib/commonjs/web-system/notification/index.js.map +1 -0
  381. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  382. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  383. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  384. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  385. package/lib/module/AudioAPIModule/index.js +4 -0
  386. package/lib/module/AudioAPIModule/index.js.map +1 -0
  387. package/lib/module/api.js +7 -12
  388. package/lib/module/api.js.map +1 -1
  389. package/lib/module/api.web.js +4 -1
  390. package/lib/module/api.web.js.map +1 -1
  391. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  392. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  393. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  394. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  395. package/lib/module/core/AudioContext.js +5 -8
  396. package/lib/module/core/AudioContext.js.map +1 -1
  397. package/lib/module/core/AudioNode.js +1 -1
  398. package/lib/module/core/AudioNode.js.map +1 -1
  399. package/lib/module/core/AudioParam.js +18 -11
  400. package/lib/module/core/AudioParam.js.map +1 -1
  401. package/lib/module/core/AudioRecorder.js +57 -56
  402. package/lib/module/core/AudioRecorder.js.map +1 -1
  403. package/lib/module/core/BaseAudioContext.js +63 -32
  404. package/lib/module/core/BaseAudioContext.js.map +1 -1
  405. package/lib/module/core/ConvolverNode.js +31 -0
  406. package/lib/module/core/ConvolverNode.js.map +1 -0
  407. package/lib/module/core/DelayNode.js +11 -0
  408. package/lib/module/core/DelayNode.js.map +1 -0
  409. package/lib/module/core/IIRFilterNode.js +13 -0
  410. package/lib/module/core/IIRFilterNode.js.map +1 -0
  411. package/lib/module/core/OfflineAudioContext.js +3 -6
  412. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  413. package/lib/module/plugin/withAudioAPI.js +47 -1
  414. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  415. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  416. package/lib/module/system/AudioManager.js +9 -15
  417. package/lib/module/system/AudioManager.js.map +1 -1
  418. package/lib/module/system/index.js +1 -0
  419. package/lib/module/system/index.js.map +1 -1
  420. package/lib/module/system/notification/PlaybackNotificationManager.js +134 -0
  421. package/lib/module/system/notification/PlaybackNotificationManager.js.map +1 -0
  422. package/lib/module/system/notification/RecordingNotificationManager.js +181 -0
  423. package/lib/module/system/notification/RecordingNotificationManager.js.map +1 -0
  424. package/lib/module/system/notification/SimpleNotificationManager.js +121 -0
  425. package/lib/module/system/notification/SimpleNotificationManager.js.map +1 -0
  426. package/lib/module/system/notification/index.js +7 -0
  427. package/lib/module/system/notification/index.js.map +1 -0
  428. package/lib/module/system/notification/types.js +4 -0
  429. package/lib/module/system/notification/types.js.map +1 -0
  430. package/lib/module/types.js +27 -34
  431. package/lib/module/types.js.map +1 -1
  432. package/lib/module/utils/filePresets.js +39 -0
  433. package/lib/module/utils/filePresets.js.map +1 -0
  434. package/lib/module/utils/index.js +10 -10
  435. package/lib/module/utils/index.js.map +1 -1
  436. package/lib/module/web-core/AudioContext.js +21 -1
  437. package/lib/module/web-core/AudioContext.js.map +1 -1
  438. package/lib/module/web-core/ConvolverNode.js +34 -0
  439. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  440. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  441. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  442. package/lib/module/web-core/DelayNode.js +11 -0
  443. package/lib/module/web-core/DelayNode.js.map +1 -0
  444. package/lib/module/web-core/IIRFilterNode.js +13 -0
  445. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  446. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  447. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  448. package/lib/module/web-system/index.js +4 -0
  449. package/lib/module/web-system/index.js.map +1 -0
  450. package/lib/module/web-system/notification/PlaybackNotificationManager.js +33 -0
  451. package/lib/module/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  452. package/lib/module/web-system/notification/RecordingNotificationManager.js +33 -0
  453. package/lib/module/web-system/notification/RecordingNotificationManager.js.map +1 -0
  454. package/lib/module/web-system/notification/index.js +5 -0
  455. package/lib/module/web-system/notification/index.js.map +1 -0
  456. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  457. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  458. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  459. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  460. package/lib/typescript/api.d.ts +5 -9
  461. package/lib/typescript/api.d.ts.map +1 -1
  462. package/lib/typescript/api.web.d.ts +4 -1
  463. package/lib/typescript/api.web.d.ts.map +1 -1
  464. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  465. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  466. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  467. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  468. package/lib/typescript/core/AudioContext.d.ts +1 -1
  469. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  470. package/lib/typescript/core/AudioNode.d.ts +2 -1
  471. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  472. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  473. package/lib/typescript/core/AudioRecorder.d.ts +16 -6
  474. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  475. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  476. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  477. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  478. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  479. package/lib/typescript/core/DelayNode.d.ts +9 -0
  480. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  481. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  482. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  483. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  484. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  485. package/lib/typescript/events/types.d.ts +6 -2
  486. package/lib/typescript/events/types.d.ts.map +1 -1
  487. package/lib/typescript/interfaces.d.ts +36 -34
  488. package/lib/typescript/interfaces.d.ts.map +1 -1
  489. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  490. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  491. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +18 -6
  492. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  493. package/lib/typescript/system/AudioManager.d.ts +5 -5
  494. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  495. package/lib/typescript/system/index.d.ts +1 -0
  496. package/lib/typescript/system/index.d.ts.map +1 -1
  497. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts +23 -0
  498. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  499. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts +24 -0
  500. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts.map +1 -0
  501. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts +21 -0
  502. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts.map +1 -0
  503. package/lib/typescript/system/notification/index.d.ts +5 -0
  504. package/lib/typescript/system/notification/index.d.ts.map +1 -0
  505. package/lib/typescript/system/notification/types.d.ts +65 -0
  506. package/lib/typescript/system/notification/types.d.ts.map +1 -0
  507. package/lib/typescript/system/types.d.ts +0 -16
  508. package/lib/typescript/system/types.d.ts.map +1 -1
  509. package/lib/typescript/types.d.ts +58 -45
  510. package/lib/typescript/types.d.ts.map +1 -1
  511. package/lib/typescript/utils/filePresets.d.ts +9 -0
  512. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  513. package/lib/typescript/utils/index.d.ts +1 -8
  514. package/lib/typescript/utils/index.d.ts.map +1 -1
  515. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  516. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  517. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  518. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  519. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  520. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  521. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  522. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  523. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  524. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  525. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  526. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  527. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  528. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  529. package/lib/typescript/web-system/index.d.ts +2 -0
  530. package/lib/typescript/web-system/index.d.ts.map +1 -0
  531. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts +20 -0
  532. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  533. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts +20 -0
  534. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts.map +1 -0
  535. package/lib/typescript/web-system/notification/index.d.ts +3 -0
  536. package/lib/typescript/web-system/notification/index.d.ts.map +1 -0
  537. package/package.json +11 -5
  538. package/scripts/download-prebuilt-binaries.sh +61 -0
  539. package/scripts/rnaa_utils.rb +8 -0
  540. package/scripts/validate-worklets-version.js +27 -0
  541. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  542. package/src/AudioAPIModule/globals.d.ts +33 -0
  543. package/src/AudioAPIModule/index.ts +1 -0
  544. package/src/api.ts +21 -52
  545. package/src/api.web.ts +8 -2
  546. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  547. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  548. package/src/core/AudioContext.ts +5 -8
  549. package/src/core/AudioNode.ts +4 -3
  550. package/src/core/AudioParam.ts +18 -11
  551. package/src/core/AudioRecorder.ts +86 -84
  552. package/src/core/BaseAudioContext.ts +120 -54
  553. package/src/core/ConvolverNode.ts +35 -0
  554. package/src/core/DelayNode.ts +13 -0
  555. package/src/core/IIRFilterNode.ts +25 -0
  556. package/src/core/OfflineAudioContext.ts +4 -7
  557. package/src/events/types.ts +7 -3
  558. package/src/interfaces.ts +55 -34
  559. package/src/plugin/withAudioAPI.ts +61 -0
  560. package/src/specs/NativeAudioAPIModule.ts +26 -9
  561. package/src/system/AudioManager.ts +13 -32
  562. package/src/system/index.ts +1 -0
  563. package/src/system/notification/PlaybackNotificationManager.ts +197 -0
  564. package/src/system/notification/RecordingNotificationManager.ts +247 -0
  565. package/src/system/notification/SimpleNotificationManager.ts +175 -0
  566. package/src/system/notification/index.ts +4 -0
  567. package/src/system/notification/types.ts +111 -0
  568. package/src/system/types.ts +0 -18
  569. package/src/types.ts +61 -46
  570. package/src/utils/filePresets.ts +47 -0
  571. package/src/utils/index.ts +13 -19
  572. package/src/web-core/AudioContext.tsx +40 -1
  573. package/src/web-core/BaseAudioContext.tsx +11 -1
  574. package/src/web-core/ConvolverNode.tsx +43 -0
  575. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  576. package/src/web-core/DelayNode.tsx +12 -0
  577. package/src/web-core/IIRFilterNode.tsx +25 -0
  578. package/src/web-core/OfflineAudioContext.tsx +39 -0
  579. package/src/web-system/index.ts +1 -0
  580. package/src/web-system/notification/PlaybackNotificationManager.ts +64 -0
  581. package/src/web-system/notification/RecordingNotificationManager.ts +64 -0
  582. package/src/web-system/notification/index.ts +2 -0
  583. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  584. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  585. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  586. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  587. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  588. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  589. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +0 -325
  590. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +0 -262
  591. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +0 -57
  592. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -61
  593. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  594. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  595. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  596. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
  597. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  598. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  599. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  600. package/ios/audioapi/ios/system/LockScreenManager.h +0 -24
  601. package/ios/audioapi/ios/system/LockScreenManager.mm +0 -310
  602. package/lib/commonjs/utils/bitEnums.js +0 -33
  603. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  604. package/lib/module/utils/bitEnums.js +0 -27
  605. package/lib/module/utils/bitEnums.js.map +0 -1
  606. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  607. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  608. package/metro-config/index.d.ts +0 -5
  609. package/metro-config/index.js +0 -41
  610. package/metro-config/tsconfig.json +0 -3
  611. package/src/utils/bitEnums.ts +0 -51
  612. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  613. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  614. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  615. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  616. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  617. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  618. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  619. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  620. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  621. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  622. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  623. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -2,34 +2,28 @@
2
2
 
3
3
  #include <jsi/jsi.h>
4
4
 
5
- #include <string>
6
5
  #include <memory>
6
+ #include <string>
7
7
 
8
- #ifdef __APPLE__
9
- /// We cannot make any conditional logic inside podspec but it should automatically compile those files
10
- /// they should be accessible if someone has react-native-worklets in node_modules
11
- #if __has_include(<worklets/WorkletRuntime/WorkletRuntime.h>)
12
- #define RN_AUDIO_API_ENABLE_WORKLETS 1
13
- #else
14
- #define RN_AUDIO_API_ENABLE_WORKLETS 0
15
- #endif
8
+ #if ANDROID
9
+ #include <fbjni/detail/Environment.h>
16
10
  #endif
17
11
 
18
12
  #ifndef RN_AUDIO_API_TEST
19
- #define RN_AUDIO_API_TEST 0
13
+ #define RN_AUDIO_API_TEST 0
20
14
  #endif
21
15
 
22
16
  #if RN_AUDIO_API_ENABLE_WORKLETS
23
- #include <worklets/WorkletRuntime/WorkletRuntime.h>
24
- #include <worklets/SharedItems/Serializable.h>
25
- #include <worklets/NativeModules/WorkletsModuleProxy.h>
26
- #if ANDROID
27
- #include <worklets/android/WorkletsModule.h>
28
- #endif
17
+ #include <worklets/NativeModules/WorkletsModuleProxy.h>
18
+ #include <worklets/SharedItems/Serializable.h>
19
+ #include <worklets/WorkletRuntime/WorkletRuntime.h>
20
+ #if ANDROID
21
+ #include <worklets/android/WorkletsModule.h>
22
+ #endif
29
23
  #else
30
24
 
31
25
  #define RN_AUDIO_API_WORKLETS_DISABLED_ERROR \
32
- std::runtime_error( \
26
+ std::runtime_error( \
33
27
  "Worklets are disabled. Please install react-native-worklets or check if you have supported version to enable these features.");
34
28
 
35
29
  /// @brief Dummy implementation of worklets for non-worklet builds they should do nothing and mock necessary methods
@@ -42,28 +36,24 @@ class MessageQueueThread {};
42
36
  class WorkletsModuleProxy {};
43
37
  class WorkletRuntime {
44
38
  public:
45
- explicit WorkletRuntime(uint64_t, const std::shared_ptr<MessageQueueThread> &, const std::string &, const bool) {
46
- throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
47
- }
48
- jsi::Runtime &getJSIRuntime() const {
49
- throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
50
- }
51
- jsi::Value executeSync(jsi::Runtime &rt, const jsi::Value &worklet) const {
52
- throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
53
- }
54
- jsi::Value executeSync(std::function<jsi::Value(jsi::Runtime &)> &&job) const {
55
- throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
56
- }
57
- jsi::Value executeSync(const std::function<jsi::Value(jsi::Runtime &)> &job) const {
39
+ explicit WorkletRuntime(
40
+ uint64_t,
41
+ const std::shared_ptr<MessageQueueThread> &,
42
+ const std::string &,
43
+ const bool){throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Runtime &getJSIRuntime() const {
44
+ throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value
45
+ executeSync(jsi::Runtime &rt, const jsi::Value &worklet) const {
46
+ throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value
47
+ executeSync(std::function<jsi::Value(jsi::Runtime &)> &&job) const {
48
+ throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value
49
+ executeSync(const std::function<jsi::Value(jsi::Runtime &)> &job) const {
58
50
  throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
59
51
  }
60
52
  };
61
53
  class SerializableWorklet {
62
54
  public:
63
- SerializableWorklet(jsi::Runtime*, const jsi::Object &) {
64
- throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
65
- }
66
- jsi::Value toJSValue(jsi::Runtime &rt) {
55
+ SerializableWorklet(jsi::Runtime *, const jsi::Object &){
56
+ throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value toJSValue(jsi::Runtime &rt) {
67
57
  throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR
68
58
  }
69
59
  };
@@ -78,4 +68,13 @@ class SerializableWorklet {
78
68
  struct RuntimeRegistry {
79
69
  std::weak_ptr<worklets::WorkletRuntime> uiRuntime;
80
70
  std::shared_ptr<worklets::WorkletRuntime> audioRuntime;
71
+
72
+ #if ANDROID
73
+ ~RuntimeRegistry() {
74
+ facebook::jni::ThreadScope::WithClassLoader([this]() {
75
+ uiRuntime.reset();
76
+ audioRuntime.reset();
77
+ });
78
+ }
79
+ #endif
81
80
  };
@@ -1,28 +1,28 @@
1
1
  #include <audioapi/core/utils/worklets/WorkletsRunner.h>
2
+ #include <memory>
3
+ #include <utility>
2
4
 
3
5
  namespace audioapi {
4
6
 
5
7
  WorkletsRunner::WorkletsRunner(
6
8
  std::weak_ptr<worklets::WorkletRuntime> weakRuntime,
7
- std::shared_ptr<worklets::SerializableWorklet> shareableWorklet,
9
+ const std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
8
10
  bool shouldLockRuntime)
9
- : weakRuntime_(std::move(weakRuntime)),
10
- shouldLockRuntime(shouldLockRuntime) {
11
+ : weakRuntime_(std::move(weakRuntime)), shouldLockRuntime(shouldLockRuntime) {
11
12
  auto strongRuntime = weakRuntime_.lock();
12
13
  if (strongRuntime == nullptr) {
13
14
  return;
14
15
  }
15
16
  #if RN_AUDIO_API_ENABLE_WORKLETS
16
17
  unsafeRuntimePtr = &strongRuntime->getJSIRuntime();
17
- strongRuntime->executeSync(
18
- [this, shareableWorklet](jsi::Runtime &rt) -> jsi::Value {
19
- /// Placement new to avoid dynamic memory allocation
20
- new (reinterpret_cast<jsi::Function *>(&unsafeWorklet))
21
- jsi::Function(shareableWorklet->toJSValue(*unsafeRuntimePtr)
22
- .asObject(*unsafeRuntimePtr)
23
- .asFunction(*unsafeRuntimePtr));
24
- return jsi::Value::undefined();
25
- });
18
+ strongRuntime->executeSync([this, shareableWorklet](jsi::Runtime &rt) -> jsi::Value {
19
+ /// Placement new to avoid dynamic memory allocation
20
+ new (reinterpret_cast<jsi::Function *>(&unsafeWorklet))
21
+ jsi::Function(shareableWorklet->toJSValue(*unsafeRuntimePtr)
22
+ .asObject(*unsafeRuntimePtr)
23
+ .asFunction(*unsafeRuntimePtr));
24
+ return jsi::Value::undefined();
25
+ });
26
26
  workletInitialized = true;
27
27
  #else
28
28
  unsafeRuntimePtr = nullptr;
@@ -33,8 +33,8 @@ WorkletsRunner::WorkletsRunner(
33
33
  WorkletsRunner::WorkletsRunner(WorkletsRunner &&other)
34
34
  : weakRuntime_(std::move(other.weakRuntime_)),
35
35
  unsafeRuntimePtr(other.unsafeRuntimePtr),
36
- shouldLockRuntime(other.shouldLockRuntime),
37
- workletInitialized(other.workletInitialized) {
36
+ workletInitialized(other.workletInitialized),
37
+ shouldLockRuntime(other.shouldLockRuntime) {
38
38
  if (workletInitialized) {
39
39
  std::memcpy(&unsafeWorklet, &other.unsafeWorklet, sizeof(unsafeWorklet));
40
40
  other.workletInitialized = false;
@@ -56,8 +56,7 @@ WorkletsRunner::~WorkletsRunner() {
56
56
  }
57
57
 
58
58
  std::optional<jsi::Value> WorkletsRunner::executeOnRuntimeGuarded(
59
- const std::function<jsi::Value(jsi::Runtime &)> &&job) const
60
- noexcept(noexcept(job)) {
59
+ const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {
61
60
  auto strongRuntime = weakRuntime_.lock();
62
61
  if (strongRuntime == nullptr) {
63
62
  return std::nullopt;
@@ -70,13 +69,12 @@ std::optional<jsi::Value> WorkletsRunner::executeOnRuntimeGuarded(
70
69
  }
71
70
 
72
71
  std::optional<jsi::Value> WorkletsRunner::executeOnRuntimeUnsafe(
73
- const std::function<jsi::Value(jsi::Runtime &)> &&job) const
74
- noexcept(noexcept(job)) {
72
+ const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {
75
73
  #if RN_AUDIO_API_ENABLE_WORKLETS
76
74
  return job(*unsafeRuntimePtr);
77
75
  #else
78
76
  return std::nullopt;
79
77
  #endif
80
- };
78
+ }
81
79
 
82
80
  }; // namespace audioapi
@@ -1,13 +1,13 @@
1
1
  #pragma once
2
2
 
3
- #include <jsi/jsi.h>
4
3
  #include <audioapi/core/utils/worklets/SafeIncludes.h>
4
+ #include <jsi/jsi.h>
5
5
 
6
- #include <functional>
7
6
  #include <atomic>
7
+ #include <functional>
8
8
  #include <memory>
9
- #include <utility>
10
9
  #include <optional>
10
+ #include <utility>
11
11
 
12
12
  namespace audioapi {
13
13
  using namespace facebook;
@@ -27,10 +27,10 @@ using namespace facebook;
27
27
  class WorkletsRunner {
28
28
  public:
29
29
  explicit WorkletsRunner(
30
- std::weak_ptr<worklets::WorkletRuntime> weakRuntime,
31
- std::shared_ptr<worklets::SerializableWorklet> shareableWorklet,
32
- bool shouldLockRuntime = true);
33
- WorkletsRunner(WorkletsRunner&&);
30
+ std::weak_ptr<worklets::WorkletRuntime> weakRuntime,
31
+ const std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,
32
+ bool shouldLockRuntime = true);
33
+ WorkletsRunner(WorkletsRunner &&);
34
34
  ~WorkletsRunner();
35
35
 
36
36
  /// @brief Call the worklet function with the given arguments.
@@ -38,19 +38,18 @@ class WorkletsRunner {
38
38
  /// @param ...args
39
39
  /// @return The result of the worklet function call.
40
40
  /// @note This method is unsafe and should be used with caution. It assumes that the runtime and worklet are valid and runtime is locked.
41
- template<typename... Args>
42
- inline jsi::Value callUnsafe(Args&&... args) {
41
+ template <typename... Args>
42
+ inline jsi::Value callUnsafe(Args &&...args) {
43
43
  return getUnsafeWorklet().call(*unsafeRuntimePtr, std::forward<Args>(args)...);
44
44
  }
45
45
 
46
-
47
46
  /// @brief Call the worklet function with the given arguments.
48
47
  /// @tparam ...Args
49
48
  /// @param ...args
50
49
  /// @return The result of the worklet function call.
51
50
  /// @note This method is safe and will check if the runtime is available before calling the worklet. If the runtime is not available, it will return nullopt.
52
- template<typename... Args>
53
- inline std::optional<jsi::Value> call(Args&&... args) {
51
+ template <typename... Args>
52
+ inline std::optional<jsi::Value> call(Args &&...args) {
54
53
  return executeOnRuntimeGuarded([this, args...](jsi::Runtime &rt) -> jsi::Value {
55
54
  return callUnsafe(std::forward<Args>(args)...);
56
55
  });
@@ -60,14 +59,17 @@ class WorkletsRunner {
60
59
  /// @param job
61
60
  /// @return nullopt if the runtime is not available or the result of the job execution
62
61
  /// @note Execution is synchronous and will be guarded if shouldLockRuntime is true.
63
- inline std::optional<jsi::Value> executeOnRuntimeSync(const std::function<jsi::Value(jsi::Runtime&)>&& job) const noexcept(noexcept(job)) {
64
- if (shouldLockRuntime) return executeOnRuntimeGuarded(std::move(job));
65
- else return executeOnRuntimeUnsafe(std::move(job));
62
+ inline std::optional<jsi::Value> executeOnRuntimeSync(
63
+ const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {
64
+ if (shouldLockRuntime)
65
+ return executeOnRuntimeGuarded(std::move(job));
66
+ else
67
+ return executeOnRuntimeUnsafe(std::move(job));
66
68
  }
67
69
 
68
70
  private:
69
71
  std::weak_ptr<worklets::WorkletRuntime> weakRuntime_;
70
- jsi::Runtime* unsafeRuntimePtr = nullptr;
72
+ jsi::Runtime *unsafeRuntimePtr = nullptr;
71
73
 
72
74
  /// @note We want to avoid automatic destruction as
73
75
  /// when runtime is destroyed, underlying pointer will be invalid
@@ -76,12 +78,14 @@ class WorkletsRunner {
76
78
  bool shouldLockRuntime = true;
77
79
 
78
80
  inline jsi::Function &getUnsafeWorklet() {
79
- return *reinterpret_cast<jsi::Function*>(&unsafeWorklet);
81
+ return *reinterpret_cast<jsi::Function *>(&unsafeWorklet);
80
82
  }
81
83
 
82
- std::optional<jsi::Value> executeOnRuntimeGuarded(const std::function<jsi::Value(jsi::Runtime&)>&& job) const noexcept(noexcept(job));
84
+ std::optional<jsi::Value> executeOnRuntimeGuarded(
85
+ const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job));
83
86
 
84
- std::optional<jsi::Value> executeOnRuntimeUnsafe(const std::function<jsi::Value(jsi::Runtime&)>&& job) const noexcept(noexcept(job));
87
+ std::optional<jsi::Value> executeOnRuntimeUnsafe(
88
+ const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job));
85
89
  };
86
90
 
87
91
  } // namespace audioapi
@@ -9,18 +9,12 @@ double sampleFrameToTime(int sampleFrame, float sampleRate) {
9
9
  return static_cast<double>(sampleFrame) / sampleRate;
10
10
  }
11
11
 
12
- float linearInterpolate(
13
- const float *source,
14
- size_t firstIndex,
15
- size_t secondIndex,
16
- float factor) {
12
+ float linearInterpolate(const float *source, size_t firstIndex, size_t secondIndex, float factor) {
17
13
  if (firstIndex == secondIndex && firstIndex >= 1) {
18
- return source[firstIndex] +
19
- factor * (source[firstIndex] - source[firstIndex - 1]);
14
+ return source[firstIndex] + factor * (source[firstIndex] - source[firstIndex - 1]);
20
15
  }
21
16
 
22
- return source[firstIndex] +
23
- factor * (source[secondIndex] - source[firstIndex]);
17
+ return source[firstIndex] + factor * (source[secondIndex] - source[firstIndex]);
24
18
  }
25
19
 
26
20
  float linearToDecibels(float value) {
@@ -30,4 +24,4 @@ float linearToDecibels(float value) {
30
24
  float decibelsToLinear(float value) {
31
25
  return pow(10, value / 20);
32
26
  }
33
- } // namespace audioapi::dsp
27
+ } // namespace audioapi::dsp
@@ -1,8 +1,8 @@
1
1
  #pragma once
2
2
 
3
+ #include <cmath>
3
4
  #include <cstddef>
4
5
  #include <cstdint>
5
- #include <cmath>
6
6
 
7
7
  namespace audioapi::dsp {
8
8
 
@@ -0,0 +1,201 @@
1
+ // implementation of linear convolution algorithm described in this paper:
2
+ // https://publications.rwth-aachen.de/record/466561/files/466561.pdf page 110
3
+
4
+ #if defined(__ARM_NEON)
5
+ #include <arm_neon.h>
6
+ #endif
7
+
8
+ #include <audioapi/core/sources/AudioBuffer.h>
9
+ #include <audioapi/dsp/Convolver.h>
10
+ #include <audioapi/dsp/VectorMath.h>
11
+ #include <audioapi/utils/AudioArray.h>
12
+ #include <algorithm>
13
+ #include <chrono>
14
+ #include <iostream>
15
+ #include <memory>
16
+
17
+ namespace audioapi {
18
+
19
+ Convolver::Convolver()
20
+ : _blockSize(0),
21
+ _segSize(0),
22
+ _segCount(0),
23
+ _fftComplexSize(0),
24
+ _segments(),
25
+ _segmentsIR(),
26
+ _fftBuffer(0),
27
+ _fft(nullptr),
28
+ _preMultiplied(),
29
+ _current(0),
30
+ _inputBuffer(0) {}
31
+
32
+ void Convolver::reset() {
33
+ _blockSize = 0;
34
+ _segSize = 0;
35
+ _segCount = 0;
36
+ _fftComplexSize = 0;
37
+ _current = 0;
38
+ _fft = nullptr;
39
+ _segments.clear();
40
+ _segmentsIR.clear();
41
+ _preMultiplied.clear();
42
+ _fftBuffer.zero();
43
+ _inputBuffer.zero();
44
+ }
45
+
46
+ bool Convolver::init(size_t blockSize, const audioapi::AudioArray &ir, size_t irLen) {
47
+ reset();
48
+ // blockSize must be a power of two
49
+ if ((blockSize & (blockSize - 1))) {
50
+ return false;
51
+ }
52
+
53
+ // Ignore zeros at the end of the impulse response because they only waste
54
+ // computation time
55
+ _blockSize = blockSize;
56
+ _trueSegmentCount =
57
+ static_cast<size_t>((std::ceil(static_cast<float>(irLen) / static_cast<float>(_blockSize))));
58
+ while (irLen > 0 && ::fabs(ir[irLen - 1]) < 10e-3) {
59
+ --irLen;
60
+ }
61
+
62
+ if (irLen == 0) {
63
+ return true;
64
+ }
65
+
66
+ // The length-N is split into P = N/B length-B sub filters
67
+ _segCount =
68
+ static_cast<size_t>((std::ceil(static_cast<float>(irLen) / static_cast<float>(_blockSize))));
69
+ _segSize = 2 * _blockSize;
70
+ // size of the FFT is 2B, so the complex size is B+1, due to the
71
+ // complex-conjugate symmetricity
72
+ _fftComplexSize = _segSize / 2 + 1;
73
+ _fft = std::make_shared<dsp::FFT>(static_cast<int>(_segSize));
74
+ _fftBuffer.resize(_segSize);
75
+
76
+ // segments preparation
77
+ for (int i = 0; i < _segCount; ++i) {
78
+ aligned_vec_complex vec(_fftComplexSize, std::complex<float>(0.0f, 0.0f));
79
+ _segments.push_back(vec);
80
+ }
81
+
82
+ // ir preparation
83
+ for (int i = 0; i < _segCount; ++i) {
84
+ aligned_vec_complex segment(_fftComplexSize);
85
+ const size_t remainingSamples = irLen - (i * _blockSize);
86
+ const size_t samplesToCopy = std::min(_blockSize, remainingSamples);
87
+
88
+ if (samplesToCopy > 0) {
89
+ memcpy(_fftBuffer.getData(), ir.getData() + i * _blockSize, samplesToCopy * sizeof(float));
90
+ }
91
+ // Each sub filter is zero-padded to length 2B and transformed using a
92
+ // 2B-point real-to-complex FFT.
93
+ memset(_fftBuffer.getData() + _blockSize, 0, _blockSize * sizeof(float));
94
+ _fft->doFFT(_fftBuffer.getData(), segment);
95
+ segment.at(0).imag(0.0f); // ensure DC component is real
96
+ _segmentsIR.push_back(segment);
97
+ }
98
+
99
+ _preMultiplied = aligned_vec_complex(_fftComplexSize);
100
+ _inputBuffer.resize(_segSize);
101
+ _current = 0;
102
+
103
+ return true;
104
+ }
105
+
106
+ /// @brief Fast pairwise complex multiplication using ARM NEON intrinsics
107
+ /// @param ir Impulse response
108
+ /// @param audio Input audio signal
109
+ /// @param pre Output buffer for pre-multiplied results
110
+ /// @note IMPORTANT: ir, audio, and pre must be the same size and should be
111
+ /// aligned to 16 bytes for optimal performance
112
+ void pairwise_complex_multiply_fast(
113
+ const Convolver::aligned_vec_complex &ir,
114
+ const Convolver::aligned_vec_complex &audio,
115
+ Convolver::aligned_vec_complex &pre) {
116
+ size_t n = ir.size();
117
+
118
+ /// @note Using ARM NEON intrinsics for SIMD optimization
119
+ /// This implementation is on average 2x faster than the scalar version on ARM
120
+ /// architectures With 16-byte alignment it can be even faster up to 2.5x
121
+ #ifdef __ARM_NEON
122
+ size_t j = 0;
123
+
124
+ // Main vector loop: process 4 complex samples (8 floats) per iteration using
125
+ // vld2q/vst2q deinterleave
126
+ for (; j <= n - 4; j += 4) {
127
+ // load de-interleaved real/imag for 4 complex values
128
+ float32x4x2_t ir_de = vld2q_f32(reinterpret_cast<const float *>(&ir[j]));
129
+ float32x4x2_t a_de = vld2q_f32(reinterpret_cast<const float *>(&audio[j]));
130
+ float32x4x2_t pre_de = vld2q_f32(reinterpret_cast<float *>(&pre[j]));
131
+
132
+ float32x4_t ir_re = ir_de.val[0];
133
+ float32x4_t ir_im = ir_de.val[1];
134
+ float32x4_t a_re = a_de.val[0];
135
+ float32x4_t a_im = a_de.val[1];
136
+
137
+ // real = ir_re * a_re - ir_im * a_im
138
+ float32x4_t real = vmulq_f32(ir_re, a_re);
139
+ real = vmlsq_f32(real, ir_im, a_im);
140
+ // imag = ir_re * a_im + ir_im * a_re
141
+ float32x4_t imag = vmulq_f32(ir_re, a_im);
142
+ imag = vmlaq_f32(imag, ir_im, a_re);
143
+
144
+ // accumulate into pre
145
+ float32x4_t new_re = vaddq_f32(pre_de.val[0], real);
146
+ float32x4_t new_im = vaddq_f32(pre_de.val[1], imag);
147
+
148
+ float32x4x2_t out_de;
149
+ out_de.val[0] = new_re;
150
+ out_de.val[1] = new_im;
151
+
152
+ vst2q_f32(reinterpret_cast<float *>(&pre[j]), out_de);
153
+ }
154
+
155
+ // Tail
156
+ for (; j < n; ++j) {
157
+ pre[j] += ir[j] * audio[j];
158
+ }
159
+
160
+ #else
161
+ // Fallback scalar implementation
162
+ for (size_t i = 0; i < n; ++i) {
163
+ pre[i] += ir[i] * audio[i];
164
+ }
165
+ #endif
166
+ }
167
+
168
+ void Convolver::process(float *data, float *outputData) {
169
+ // The input buffer acts as a 2B-point sliding window of the input signal.
170
+ // With each new input block, the right half of the input buffer is shifted
171
+ // to the left and the new block is stored in the right half.
172
+ memmove(_inputBuffer.getData(), _inputBuffer.getData() + _blockSize, _blockSize * sizeof(float));
173
+ memcpy(_inputBuffer.getData() + _blockSize, data, _blockSize * sizeof(float));
174
+
175
+ // All contents (DFT spectra) in the FDL are shifted up by one slot.
176
+ _current = (_current > 0) ? _current - 1 : _segCount - 1;
177
+ // A 2B-point real-to-complex FFT is computed from the input buffer,
178
+ // resulting in B+1 complex-conjugate symmetric DFT coefficients. The
179
+ // result is stored in the first FDL slot.
180
+ // _current marks first FDL slot, which is the current input block.
181
+ _fft->doFFT(_inputBuffer.getData(), _segments[_current]);
182
+ _segments[_current][0].imag(0.0f); // ensure DC component is real
183
+
184
+ // The P sub filter spectra are pairwisely multiplied with the input spectra
185
+ // in the FDL. The results are accumulated in the frequency-domain.
186
+ memset(_preMultiplied.data(), 0, _preMultiplied.size() * sizeof(std::complex<float>));
187
+ // this is a bottleneck of the algorithm
188
+ for (int i = 0; i < _segCount; ++i) {
189
+ const int indexAudio = (_current + i) % _segCount;
190
+ const auto &impulseResponseSegment = _segmentsIR[i];
191
+ const auto &audioSegment = _segments[indexAudio];
192
+ pairwise_complex_multiply_fast(impulseResponseSegment, audioSegment, _preMultiplied);
193
+ }
194
+ // Of the accumulated spectral convolutions, an 2B-point complex-to-real
195
+ // IFFT is computed. From the resulting 2B samples, the left half is
196
+ // discarded and the right half is returned as the next output block.
197
+ _fft->doInverseFFT(_preMultiplied, _fftBuffer.getData());
198
+
199
+ memcpy(outputData, _fftBuffer.getData() + _blockSize, _blockSize * sizeof(float));
200
+ }
201
+ } // namespace audioapi
@@ -0,0 +1,47 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/dsp/FFT.h>
4
+ #include <audioapi/utils/AlignedAllocator.hpp>
5
+ #include <audioapi/utils/AudioArray.h>
6
+ #include <complex>
7
+ #include <cstring>
8
+ #include <memory>
9
+ #include <vector>
10
+
11
+ namespace audioapi {
12
+
13
+ class AudioBuffer;
14
+
15
+ class Convolver {
16
+ using aligned_vec_complex =
17
+ std::vector<std::complex<float>, AlignedAllocator<std::complex<float>, 16>>;
18
+
19
+ public:
20
+ Convolver();
21
+ bool init(size_t blockSize, const AudioArray &ir, size_t irLen);
22
+ void process(float *inputData, float *outputData);
23
+ void reset();
24
+ inline size_t getSegCount() const {
25
+ return _trueSegmentCount;
26
+ }
27
+
28
+ private:
29
+ size_t _trueSegmentCount;
30
+ size_t _blockSize;
31
+ size_t _segSize;
32
+ size_t _segCount;
33
+ size_t _fftComplexSize;
34
+ std::vector<aligned_vec_complex> _segments;
35
+ std::vector<aligned_vec_complex> _segmentsIR;
36
+ AudioArray _fftBuffer;
37
+ std::shared_ptr<dsp::FFT> _fft;
38
+ aligned_vec_complex _preMultiplied;
39
+ size_t _current;
40
+ AudioArray _inputBuffer;
41
+
42
+ friend void pairwise_complex_multiply_fast(
43
+ const aligned_vec_complex &ir,
44
+ const aligned_vec_complex &audio,
45
+ aligned_vec_complex &pre);
46
+ };
47
+ } // namespace audioapi
@@ -4,7 +4,7 @@ namespace audioapi::dsp {
4
4
 
5
5
  FFT::FFT(int size) : size_(size) {
6
6
  pffftSetup_ = pffft_new_setup(size_, PFFFT_REAL);
7
- work_ = (float *)pffft_aligned_malloc(size_ * sizeof(float));
7
+ work_ = reinterpret_cast<float *>(pffft_aligned_malloc(size_ * sizeof(float)));
8
8
  }
9
9
 
10
10
  FFT::~FFT() {
@@ -12,30 +12,4 @@ FFT::~FFT() {
12
12
  pffft_aligned_free(work_);
13
13
  }
14
14
 
15
- void FFT::doFFT(float *in, std::vector<std::complex<float>> &out) {
16
- pffft_transform_ordered(
17
- pffftSetup_,
18
- in,
19
- reinterpret_cast<float *>(&out[0]),
20
- work_,
21
- PFFFT_FORWARD);
22
-
23
- dsp::multiplyByScalar(
24
- reinterpret_cast<float *>(&out[0]),
25
- 0.5f,
26
- reinterpret_cast<float *>(&out[0]),
27
- size_ * 2);
28
- }
29
-
30
- void FFT::doInverseFFT(std::vector<std::complex<float>> &in, float *out) {
31
- pffft_transform_ordered(
32
- pffftSetup_,
33
- reinterpret_cast<float *>(&in[0]),
34
- out,
35
- work_,
36
- PFFFT_BACKWARD);
37
-
38
- dsp::multiplyByScalar(out, 1.0f / static_cast<float>(size_), out, size_);
39
- }
40
-
41
15
  } // namespace audioapi::dsp
@@ -5,8 +5,8 @@
5
5
 
6
6
  #include <algorithm>
7
7
  #include <cmath>
8
- #include <utility>
9
8
  #include <complex>
9
+ #include <utility>
10
10
  #include <vector>
11
11
 
12
12
  namespace audioapi::dsp {
@@ -16,8 +16,24 @@ class FFT {
16
16
  explicit FFT(int size);
17
17
  ~FFT();
18
18
 
19
- void doFFT(float *in, std::vector<std::complex<float>> &out);
20
- void doInverseFFT(std::vector<std::complex<float>> &in, float *out);
19
+ template <typename Allocator>
20
+ void doFFT(float *in, std::vector<std::complex<float>, Allocator> &out) {
21
+ pffft_transform_ordered(
22
+ pffftSetup_, in, reinterpret_cast<float *>(&out[0]), work_, PFFFT_FORWARD);
23
+ // this is a possible place for bugs and mistakes
24
+ // due to pffft implementation and how it stores results
25
+ // keep this information in mind
26
+ // out[0].real = DC component - should be pure real
27
+ // out[0].imag = Nyquist component - should be pure real
28
+ }
29
+
30
+ template <typename Allocator>
31
+ void doInverseFFT(std::vector<std::complex<float>, Allocator> &in, float *out) {
32
+ pffft_transform_ordered(
33
+ pffftSetup_, reinterpret_cast<float *>(&in[0]), out, work_, PFFFT_BACKWARD);
34
+
35
+ dsp::multiplyByScalar(out, 1.0f / static_cast<float>(size_), out, size_);
36
+ }
21
37
 
22
38
  private:
23
39
  int size_;