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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) 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 +257 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +33 -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 +47 -47
  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 +381 -302
  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 +48 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -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 +155 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -16
  24. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
  25. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
  26. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  27. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  28. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  29. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  30. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  31. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  32. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  33. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  34. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  35. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  36. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  37. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  38. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  39. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  40. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  41. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  42. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  43. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  44. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  45. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  46. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  47. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  48. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  49. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  50. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  51. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  52. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  53. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  54. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  55. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  56. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  57. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  58. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  59. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  60. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  61. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  62. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  63. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  64. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  65. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  66. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  68. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  69. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  70. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  71. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +109 -44
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -2
  73. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  74. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  75. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  76. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  77. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  78. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  79. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  80. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  81. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  82. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  83. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  84. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  85. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  86. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  87. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  88. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  89. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  90. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  91. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  92. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  93. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  94. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  95. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  96. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  97. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  98. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  99. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  100. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  101. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  102. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  103. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  104. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  105. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  106. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +84 -66
  107. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
  108. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  109. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  110. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  111. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  112. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  113. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  114. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  115. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  116. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  117. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  118. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  119. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  120. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  121. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  122. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  123. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  124. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +31 -108
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +46 -46
  126. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  127. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  128. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  129. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  130. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  131. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  132. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  133. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  134. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  135. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  136. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  137. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  138. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  139. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  140. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  141. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  142. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +104 -87
  143. package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -33
  144. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  145. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  146. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  147. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  148. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  149. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +43 -0
  150. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  151. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  152. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  153. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  154. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  155. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  156. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  157. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +51 -0
  158. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  159. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  160. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  161. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  162. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  163. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  164. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  165. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  166. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  167. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  168. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  169. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  170. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  171. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  172. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  173. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  174. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  175. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  176. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  177. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  178. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  179. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  180. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  181. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  182. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  183. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  184. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  185. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  186. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  187. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  188. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  189. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  190. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  217. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  218. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  219. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  220. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  221. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  222. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  223. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  224. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  225. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  226. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  227. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  228. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  229. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  230. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  231. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  232. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  233. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  234. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  235. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  236. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  237. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  238. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  239. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  240. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  241. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  242. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  243. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  244. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  245. package/common/cpp/audioapi/utils/Result.hpp +286 -0
  246. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  247. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  248. package/common/cpp/test/CMakeLists.txt +20 -14
  249. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  250. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  251. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  252. package/common/cpp/test/src/DelayTest.cpp +108 -0
  253. package/common/cpp/test/src/GainTest.cpp +4 -5
  254. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  255. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  256. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  257. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  258. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  259. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  260. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  261. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  262. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  263. package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
  264. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  265. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  266. package/ios/audioapi/ios/core/IOSAudioRecorder.h +28 -11
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +229 -44
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +67 -6
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -4
  272. package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
  273. package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
  274. package/ios/audioapi/ios/core/utils/IOSFileWriter.h +53 -0
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  277. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
  278. package/ios/audioapi/ios/system/AudioEngine.h +19 -16
  279. package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
  280. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  281. package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
  282. package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
  283. package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
  284. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  285. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  286. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  287. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  288. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  289. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  290. package/lib/commonjs/api.js +18 -12
  291. package/lib/commonjs/api.js.map +1 -1
  292. package/lib/commonjs/api.web.js +8 -0
  293. package/lib/commonjs/api.web.js.map +1 -1
  294. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  295. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  296. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  297. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  298. package/lib/commonjs/core/AudioContext.js +5 -8
  299. package/lib/commonjs/core/AudioContext.js.map +1 -1
  300. package/lib/commonjs/core/AudioNode.js +1 -1
  301. package/lib/commonjs/core/AudioNode.js.map +1 -1
  302. package/lib/commonjs/core/AudioParam.js +18 -11
  303. package/lib/commonjs/core/AudioParam.js.map +1 -1
  304. package/lib/commonjs/core/AudioRecorder.js +56 -55
  305. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  306. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  307. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  308. package/lib/commonjs/core/ConvolverNode.js +37 -0
  309. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  310. package/lib/commonjs/core/DelayNode.js +17 -0
  311. package/lib/commonjs/core/DelayNode.js.map +1 -0
  312. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  313. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  314. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  315. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  316. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  317. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  318. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  319. package/lib/commonjs/system/AudioManager.js +4 -7
  320. package/lib/commonjs/system/AudioManager.js.map +1 -1
  321. package/lib/commonjs/types.js +16 -23
  322. package/lib/commonjs/types.js.map +1 -1
  323. package/lib/commonjs/utils/filePresets.js +43 -0
  324. package/lib/commonjs/utils/filePresets.js.map +1 -0
  325. package/lib/commonjs/utils/index.js +12 -27
  326. package/lib/commonjs/utils/index.js.map +1 -1
  327. package/lib/commonjs/web-core/AudioContext.js +21 -1
  328. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  329. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  330. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  331. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  332. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  333. package/lib/commonjs/web-core/DelayNode.js +17 -0
  334. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  335. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  336. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  337. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  338. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  339. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  340. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  341. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  342. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  343. package/lib/module/AudioAPIModule/index.js +4 -0
  344. package/lib/module/AudioAPIModule/index.js.map +1 -0
  345. package/lib/module/api.js +3 -12
  346. package/lib/module/api.js.map +1 -1
  347. package/lib/module/api.web.js +1 -0
  348. package/lib/module/api.web.js.map +1 -1
  349. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  350. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  351. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  352. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  353. package/lib/module/core/AudioContext.js +5 -8
  354. package/lib/module/core/AudioContext.js.map +1 -1
  355. package/lib/module/core/AudioNode.js +1 -1
  356. package/lib/module/core/AudioNode.js.map +1 -1
  357. package/lib/module/core/AudioParam.js +18 -11
  358. package/lib/module/core/AudioParam.js.map +1 -1
  359. package/lib/module/core/AudioRecorder.js +57 -56
  360. package/lib/module/core/AudioRecorder.js.map +1 -1
  361. package/lib/module/core/BaseAudioContext.js +63 -32
  362. package/lib/module/core/BaseAudioContext.js.map +1 -1
  363. package/lib/module/core/ConvolverNode.js +31 -0
  364. package/lib/module/core/ConvolverNode.js.map +1 -0
  365. package/lib/module/core/DelayNode.js +11 -0
  366. package/lib/module/core/DelayNode.js.map +1 -0
  367. package/lib/module/core/IIRFilterNode.js +13 -0
  368. package/lib/module/core/IIRFilterNode.js.map +1 -0
  369. package/lib/module/core/OfflineAudioContext.js +3 -6
  370. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  371. package/lib/module/plugin/withAudioAPI.js +47 -1
  372. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  373. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  374. package/lib/module/system/AudioManager.js +4 -7
  375. package/lib/module/system/AudioManager.js.map +1 -1
  376. package/lib/module/types.js +15 -22
  377. package/lib/module/types.js.map +1 -1
  378. package/lib/module/utils/filePresets.js +39 -0
  379. package/lib/module/utils/filePresets.js.map +1 -0
  380. package/lib/module/utils/index.js +10 -10
  381. package/lib/module/utils/index.js.map +1 -1
  382. package/lib/module/web-core/AudioContext.js +21 -1
  383. package/lib/module/web-core/AudioContext.js.map +1 -1
  384. package/lib/module/web-core/ConvolverNode.js +34 -0
  385. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  386. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  387. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  388. package/lib/module/web-core/DelayNode.js +11 -0
  389. package/lib/module/web-core/DelayNode.js.map +1 -0
  390. package/lib/module/web-core/IIRFilterNode.js +13 -0
  391. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  392. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  393. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  394. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  395. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  396. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  397. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  398. package/lib/typescript/api.d.ts +3 -9
  399. package/lib/typescript/api.d.ts.map +1 -1
  400. package/lib/typescript/api.web.d.ts +1 -0
  401. package/lib/typescript/api.web.d.ts.map +1 -1
  402. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  403. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  404. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  405. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  406. package/lib/typescript/core/AudioContext.d.ts +1 -1
  407. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  408. package/lib/typescript/core/AudioNode.d.ts +2 -1
  409. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  410. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  411. package/lib/typescript/core/AudioRecorder.d.ts +16 -6
  412. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  413. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  414. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  415. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  416. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  417. package/lib/typescript/core/DelayNode.d.ts +9 -0
  418. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  419. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  420. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  421. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  422. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  423. package/lib/typescript/events/types.d.ts +4 -0
  424. package/lib/typescript/events/types.d.ts.map +1 -1
  425. package/lib/typescript/interfaces.d.ts +36 -34
  426. package/lib/typescript/interfaces.d.ts.map +1 -1
  427. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  428. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  429. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
  430. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  431. package/lib/typescript/system/AudioManager.d.ts +3 -2
  432. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  433. package/lib/typescript/types.d.ts +43 -30
  434. package/lib/typescript/types.d.ts.map +1 -1
  435. package/lib/typescript/utils/filePresets.d.ts +9 -0
  436. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  437. package/lib/typescript/utils/index.d.ts +1 -8
  438. package/lib/typescript/utils/index.d.ts.map +1 -1
  439. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  440. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  441. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  442. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  443. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  444. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  445. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  446. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  447. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  448. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  449. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  450. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  451. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  452. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  453. package/package.json +11 -4
  454. package/scripts/download-prebuilt-binaries.sh +61 -0
  455. package/scripts/rnaa_utils.rb +8 -0
  456. package/scripts/validate-worklets-version.js +27 -0
  457. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  458. package/src/AudioAPIModule/globals.d.ts +33 -0
  459. package/src/AudioAPIModule/index.ts +1 -0
  460. package/src/api.ts +4 -52
  461. package/src/api.web.ts +1 -0
  462. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  463. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  464. package/src/core/AudioContext.ts +5 -8
  465. package/src/core/AudioNode.ts +4 -3
  466. package/src/core/AudioParam.ts +18 -11
  467. package/src/core/AudioRecorder.ts +86 -84
  468. package/src/core/BaseAudioContext.ts +120 -54
  469. package/src/core/ConvolverNode.ts +35 -0
  470. package/src/core/DelayNode.ts +13 -0
  471. package/src/core/IIRFilterNode.ts +25 -0
  472. package/src/core/OfflineAudioContext.ts +4 -7
  473. package/src/events/types.ts +5 -0
  474. package/src/interfaces.ts +55 -34
  475. package/src/plugin/withAudioAPI.ts +61 -0
  476. package/src/specs/NativeAudioAPIModule.ts +3 -2
  477. package/src/system/AudioManager.ts +13 -19
  478. package/src/types.ts +47 -32
  479. package/src/utils/filePresets.ts +47 -0
  480. package/src/utils/index.ts +13 -19
  481. package/src/web-core/AudioContext.tsx +40 -1
  482. package/src/web-core/BaseAudioContext.tsx +11 -1
  483. package/src/web-core/ConvolverNode.tsx +43 -0
  484. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  485. package/src/web-core/DelayNode.tsx +12 -0
  486. package/src/web-core/IIRFilterNode.tsx +25 -0
  487. package/src/web-core/OfflineAudioContext.tsx +39 -0
  488. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  489. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  490. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  491. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  492. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  493. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  494. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  495. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  496. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  497. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  500. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  501. package/lib/commonjs/utils/bitEnums.js +0 -33
  502. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  503. package/lib/module/utils/bitEnums.js +0 -27
  504. package/lib/module/utils/bitEnums.js.map +0 -1
  505. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  506. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  507. package/metro-config/index.d.ts +0 -5
  508. package/metro-config/index.js +0 -41
  509. package/metro-config/tsconfig.json +0 -3
  510. package/src/utils/bitEnums.ts +0 -51
  511. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  512. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  513. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  514. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  515. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  516. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  517. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  518. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  519. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  520. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  521. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  522. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -1,9 +1,9 @@
1
+ import AudioAPIModule from '../AudioAPIModule';
2
+ import { NotSupportedError } from '../errors';
1
3
  import { IAudioContext } from '../interfaces';
2
- import BaseAudioContext from './BaseAudioContext';
3
4
  import AudioManager from '../system';
4
5
  import { AudioContextOptions } from '../types';
5
- import { NotSupportedError } from '../errors';
6
- import { isWorkletsAvailable, workletsModule } from '../utils';
6
+ import BaseAudioContext from './BaseAudioContext';
7
7
 
8
8
  export default class AudioContext extends BaseAudioContext {
9
9
  constructor(options?: AudioContextOptions) {
@@ -16,15 +16,12 @@ export default class AudioContext extends BaseAudioContext {
16
16
  `The provided sampleRate is not supported: ${options.sampleRate}`
17
17
  );
18
18
  }
19
- let audioRuntime = null;
20
- if (isWorkletsAvailable) {
21
- audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
22
- }
19
+
20
+ const audioRuntime = AudioAPIModule.createAudioRuntime();
23
21
 
24
22
  super(
25
23
  global.createAudioContext(
26
24
  options?.sampleRate || AudioManager.getDevicePreferredSampleRate(),
27
- options?.initSuspended || false,
28
25
  audioRuntime
29
26
  )
30
27
  );
@@ -23,7 +23,9 @@ export default class AudioNode {
23
23
  this.channelInterpretation = this.node.channelInterpretation;
24
24
  }
25
25
 
26
- public connect(destination: AudioNode | AudioParam): AudioNode | AudioParam {
26
+ public connect(destination: AudioNode): AudioNode;
27
+ public connect(destination: AudioParam): void;
28
+ public connect(destination: AudioNode | AudioParam): AudioNode | void {
27
29
  if (this.context !== destination.context) {
28
30
  throw new InvalidAccessError(
29
31
  'Source and destination are from different BaseAudioContexts'
@@ -34,9 +36,8 @@ export default class AudioNode {
34
36
  this.node.connect(destination.audioParam);
35
37
  } else {
36
38
  this.node.connect(destination.node);
39
+ return destination;
37
40
  }
38
-
39
- return destination;
40
41
  }
41
42
 
42
43
  public disconnect(destination?: AudioNode | AudioParam): void {
@@ -33,7 +33,8 @@ export default class AudioParam {
33
33
  );
34
34
  }
35
35
 
36
- this.audioParam.setValueAtTime(value, startTime);
36
+ const clampedTime = Math.max(startTime, this.context.currentTime);
37
+ this.audioParam.setValueAtTime(value, clampedTime);
37
38
 
38
39
  return this;
39
40
  }
@@ -45,7 +46,8 @@ export default class AudioParam {
45
46
  );
46
47
  }
47
48
 
48
- this.audioParam.linearRampToValueAtTime(value, endTime);
49
+ const clampedTime = Math.max(endTime, this.context.currentTime);
50
+ this.audioParam.linearRampToValueAtTime(value, clampedTime);
49
51
 
50
52
  return this;
51
53
  }
@@ -54,13 +56,14 @@ export default class AudioParam {
54
56
  value: number,
55
57
  endTime: number
56
58
  ): AudioParam {
57
- if (endTime < 0) {
59
+ if (endTime <= 0) {
58
60
  throw new RangeError(
59
61
  `endTime must be a finite non-negative number: ${endTime}`
60
62
  );
61
63
  }
62
64
 
63
- this.audioParam.exponentialRampToValueAtTime(value, endTime);
65
+ const clampedTime = Math.max(endTime, this.context.currentTime);
66
+ this.audioParam.exponentialRampToValueAtTime(value, clampedTime);
64
67
 
65
68
  return this;
66
69
  }
@@ -78,11 +81,12 @@ export default class AudioParam {
78
81
 
79
82
  if (timeConstant < 0) {
80
83
  throw new RangeError(
81
- `timeConstant must be a finite non-negative number: ${startTime}`
84
+ `timeConstant must be a finite non-negative number: ${timeConstant}`
82
85
  );
83
86
  }
84
87
 
85
- this.audioParam.setTargetAtTime(target, startTime, timeConstant);
88
+ const clampedTime = Math.max(startTime, this.context.currentTime);
89
+ this.audioParam.setTargetAtTime(target, clampedTime, timeConstant);
86
90
 
87
91
  return this;
88
92
  }
@@ -98,9 +102,9 @@ export default class AudioParam {
98
102
  );
99
103
  }
100
104
 
101
- if (duration < 0) {
105
+ if (duration <= 0) {
102
106
  throw new RangeError(
103
- `duration must be a finite non-negative number: ${startTime}`
107
+ `duration must be a finite strictly-positive number: ${duration}`
104
108
  );
105
109
  }
106
110
 
@@ -108,7 +112,8 @@ export default class AudioParam {
108
112
  throw new InvalidStateError(`values must contain at least two values`);
109
113
  }
110
114
 
111
- this.audioParam.setValueCurveAtTime(values, startTime, duration);
115
+ const clampedTime = Math.max(startTime, this.context.currentTime);
116
+ this.audioParam.setValueCurveAtTime(values, clampedTime, duration);
112
117
 
113
118
  return this;
114
119
  }
@@ -120,7 +125,8 @@ export default class AudioParam {
120
125
  );
121
126
  }
122
127
 
123
- this.audioParam.cancelScheduledValues(cancelTime);
128
+ const clampedTime = Math.max(cancelTime, this.context.currentTime);
129
+ this.audioParam.cancelScheduledValues(clampedTime);
124
130
 
125
131
  return this;
126
132
  }
@@ -132,7 +138,8 @@ export default class AudioParam {
132
138
  );
133
139
  }
134
140
 
135
- this.audioParam.cancelAndHoldAtTime(cancelTime);
141
+ const clampedTime = Math.max(cancelTime, this.context.currentTime);
142
+ this.audioParam.cancelAndHoldAtTime(clampedTime);
136
143
 
137
144
  return this;
138
145
  }
@@ -1,67 +1,45 @@
1
1
  import { AudioEventEmitter, AudioEventSubscription } from '../events';
2
- import { OnAudioReadyEventType } from '../events/types';
2
+ import {
3
+ OnAudioReadyEventType,
4
+ OnRecorderErrorEventType,
5
+ } from '../events/types';
3
6
  import { IAudioRecorder } from '../interfaces';
4
7
  import {
5
- AndroidFormat,
6
8
  AudioRecorderCallbackOptions,
7
9
  AudioRecorderFileOptions,
8
- BitDepth,
9
10
  FileDirectory,
10
- IOSAudioQuality,
11
- IOSFormat,
11
+ FileFormat,
12
+ FileInfo,
13
+ Result,
12
14
  } from '../types';
13
- import { encodeFlags } from '../utils';
15
+ import FilePreset from '../utils/filePresets';
14
16
  import AudioBuffer from './AudioBuffer';
15
17
  import RecorderAdapterNode from './RecorderAdapterNode';
16
18
 
17
- function withDefaultOptions(inOptions: AudioRecorderFileOptions) {
19
+ // Enforces default options, making sure that all properties are defined
20
+ // for the contract with native code.
21
+ function withDefaultOptions(
22
+ inOptions: AudioRecorderFileOptions
23
+ ): Required<AudioRecorderFileOptions> {
18
24
  return {
19
25
  directory: FileDirectory.Cache,
20
- sampleRate: 48000,
21
- channels: 2,
22
- bitRate: 128000,
23
- bitDepth: BitDepth.Bit24,
26
+ subDirectory: 'AudioAPI',
27
+ fileNamePrefix: 'recording_',
28
+ channelCount: 2,
29
+ format: FileFormat.M4A,
30
+ batchDurationSeconds: 0,
31
+ preset: FilePreset.High,
32
+ androidFlushIntervalMs: 500,
24
33
  ...inOptions,
25
- ios: {
26
- format: IOSFormat.M4A,
27
- quality: IOSAudioQuality.High,
28
- ...(inOptions.ios ?? {}),
29
- },
30
- android: {
31
- format: AndroidFormat.M4A,
32
- ...(inOptions.android ?? {}),
33
- },
34
- };
35
- }
36
-
37
- function parseFileOptions(inOptions: AudioRecorderFileOptions) {
38
- const { sampleRate, channels, bitRate, directory, bitDepth, ios, android } =
39
- withDefaultOptions(inOptions);
40
-
41
- const iosFlags = encodeFlags(
42
- ios.format,
43
- ios.quality,
44
- ios.flacCompressionLevel || 0,
45
- directory,
46
- bitDepth
47
- );
48
-
49
- // TODO: ensure directory and bitDepth are last in the bitmask
50
- const androidFlags = encodeFlags(android.format, directory, bitDepth);
51
-
52
- return {
53
- sampleRate,
54
- channels,
55
- bitRate,
56
- ios: iosFlags,
57
- android: androidFlags,
58
34
  };
59
35
  }
60
36
 
61
37
  export default class AudioRecorder {
62
38
  protected onAudioReadySubscription: AudioEventSubscription | null = null;
39
+ protected onErrorSubscription: AudioEventSubscription | null = null;
63
40
  protected readonly recorder: IAudioRecorder;
64
41
  protected options_: AudioRecorderFileOptions | null = null;
42
+ private isFileOutputEnabled: boolean = false;
65
43
 
66
44
  protected readonly audioEventEmitter = new AudioEventEmitter(
67
45
  global.AudioEventEmitter
@@ -71,17 +49,16 @@ export default class AudioRecorder {
71
49
  this.recorder = global.createAudioRecorder();
72
50
  }
73
51
 
74
- enableFileOutput(options: AudioRecorderFileOptions): void {
75
- if (this.recorder.isRecording()) {
76
- throw new Error(
77
- 'Cannot enable file output while recording is in progress. Please stop the recorder before changing output options.'
78
- );
79
- }
80
-
81
- this.options_ = options;
52
+ enableFileOutput(
53
+ // TODO: Re-enable 'batchDurationSeconds' once supported
54
+ options?: Omit<AudioRecorderFileOptions, 'batchDurationSeconds'>
55
+ ): Result<{ path: string }> {
56
+ this.options_ = options || {};
57
+ const parsedOptions = withDefaultOptions(this.options_);
58
+ const result = this.recorder.enableFileOutput(parsedOptions);
59
+ this.isFileOutputEnabled = true;
82
60
 
83
- const parsedOptions = parseFileOptions(options);
84
- this.recorder.enableFileOutput(parsedOptions);
61
+ return result;
85
62
  }
86
63
 
87
64
  public get options(): AudioRecorderFileOptions | null {
@@ -91,25 +68,31 @@ export default class AudioRecorder {
91
68
  disableFileOutput(): void {
92
69
  this.options_ = null;
93
70
  this.recorder.disableFileOutput();
71
+ this.isFileOutputEnabled = false;
94
72
  }
95
73
 
96
74
  /** Starts the audio recording process with configured output options */
97
- public start(): void {
98
- this.recorder.start();
75
+ start(): Result<{ path: string }> {
76
+ if (!this.isFileOutputEnabled) {
77
+ this.recorder.start();
78
+ return { status: 'success', path: '' };
79
+ }
80
+
81
+ return this.recorder.start();
99
82
  }
100
83
 
101
84
  /** Stops the audio recording process and releases internal resources */
102
- public stop(): void | string {
85
+ stop(): Result<FileInfo> {
103
86
  return this.recorder.stop();
104
87
  }
105
88
 
106
89
  /** Pauses the audio recording process without tearing down anything */
107
- public pause(): void {
90
+ pause(): void {
108
91
  this.recorder.pause();
109
92
  }
110
93
 
111
94
  /** Resumes the audio recording process after being paused */
112
- public resume(): void {
95
+ resume(): void {
113
96
  this.recorder.resume();
114
97
  }
115
98
 
@@ -122,18 +105,13 @@ export default class AudioRecorder {
122
105
  * @param node - The adapter node to connect to the recorder.
123
106
  * @throws If the node has already been connected.
124
107
  */
125
- public connect(node: RecorderAdapterNode): void {
126
- if (this.recorder.isRecording()) {
127
- throw new Error(
128
- 'Cannot connect adapter node while recording is in progress. Please stop the recorder before connecting new nodes.'
129
- );
130
- }
131
-
108
+ connect(node: RecorderAdapterNode): void {
132
109
  if (node.wasConnected) {
133
110
  throw new Error(
134
111
  'RecorderAdapterNode cannot be connected more than once. Refer to the documentation for more details.'
135
112
  );
136
113
  }
114
+
137
115
  node.wasConnected = true;
138
116
  this.recorder.connect(node.getNode());
139
117
  }
@@ -144,7 +122,7 @@ export default class AudioRecorder {
144
122
  * After calling this method, any connected {@link RecorderAdapterNode} will no
145
123
  * longer receive audio data until reconnected.
146
124
  */
147
- public disconnect(): void {
125
+ disconnect(): void {
148
126
  this.recorder.disconnect();
149
127
  }
150
128
 
@@ -164,16 +142,10 @@ export default class AudioRecorder {
164
142
  * available. The callback receives an {@link OnAudioReadyEventType} object
165
143
  * containing the audio data and associated metadata.
166
144
  */
167
- public onAudioReady(
145
+ onAudioReady(
168
146
  options: AudioRecorderCallbackOptions,
169
147
  callback: (event: OnAudioReadyEventType) => void
170
- ): void {
171
- if (this.recorder.isRecording()) {
172
- throw new Error(
173
- 'Cannot set onAudioReady callback while recording is in progress. Please stop the recorder before setting a new callback.'
174
- );
175
- }
176
-
148
+ ): Result<void> {
177
149
  if (this.onAudioReadySubscription) {
178
150
  this.recorder.clearOnAudioReady();
179
151
  this.onAudioReadySubscription.remove();
@@ -189,7 +161,7 @@ export default class AudioRecorder {
189
161
  });
190
162
  });
191
163
 
192
- this.recorder.setOnAudioReady({
164
+ return this.recorder.setOnAudioReady({
193
165
  sampleRate: options.sampleRate,
194
166
  bufferLength: options.bufferLength,
195
167
  channelCount: options.channelCount,
@@ -204,13 +176,7 @@ export default class AudioRecorder {
204
176
  * recording. Calling this method is safe even if no callback is currently
205
177
  * registered.
206
178
  */
207
- public clearOnAudioReady(): void {
208
- if (this.recorder.isRecording()) {
209
- throw new Error(
210
- 'Cannot clear onAudioReady callback while recording is in progress. Please stop the recorder before clearing the callback.'
211
- );
212
- }
213
-
179
+ clearOnAudioReady(): void {
214
180
  if (!this.onAudioReadySubscription) {
215
181
  return;
216
182
  }
@@ -221,7 +187,43 @@ export default class AudioRecorder {
221
187
  this.onAudioReadySubscription = null;
222
188
  }
223
189
 
224
- public isRecording(): boolean {
190
+ isRecording(): boolean {
225
191
  return this.recorder.isRecording();
226
192
  }
193
+
194
+ isPaused(): boolean {
195
+ return this.recorder.isPaused();
196
+ }
197
+
198
+ getCurrentDuration(): number {
199
+ return this.recorder.getCurrentDuration();
200
+ }
201
+
202
+ onError(callback: (error: OnRecorderErrorEventType) => void): void {
203
+ if (this.onErrorSubscription) {
204
+ this.recorder.clearOnError();
205
+ this.onErrorSubscription.remove();
206
+ this.onErrorSubscription = null;
207
+ }
208
+
209
+ this.onErrorSubscription = this.audioEventEmitter.addAudioEventListener(
210
+ 'recorderError',
211
+ callback
212
+ );
213
+
214
+ this.recorder.setOnError({
215
+ callbackId: this.onErrorSubscription.subscriptionId,
216
+ });
217
+ }
218
+
219
+ clearOnError(): void {
220
+ if (!this.onErrorSubscription) {
221
+ return;
222
+ }
223
+
224
+ this.recorder.clearOnError();
225
+
226
+ this.onErrorSubscription.remove();
227
+ this.onErrorSubscription = null;
228
+ }
227
229
  }
@@ -1,29 +1,39 @@
1
- import { InvalidAccessError, NotSupportedError } from '../errors';
1
+ import AudioAPIModule from '../AudioAPIModule';
2
+ import {
3
+ InvalidAccessError,
4
+ InvalidStateError,
5
+ NotSupportedError,
6
+ } from '../errors';
2
7
  import { IBaseAudioContext } from '../interfaces';
3
8
  import {
4
9
  AudioBufferBaseSourceNodeOptions,
10
+ AudioWorkletRuntime,
5
11
  ContextState,
12
+ ConvolverNodeOptions,
13
+ IIRFilterNodeOptions,
6
14
  PeriodicWaveConstraints,
7
- AudioWorkletRuntime,
8
15
  } from '../types';
9
- import { isWorkletsAvailable, workletsModule } from '../utils';
10
- import WorkletSourceNode from './WorkletSourceNode';
11
- import WorkletProcessingNode from './WorkletProcessingNode';
16
+ import { assertWorkletsEnabled } from '../utils';
12
17
  import AnalyserNode from './AnalyserNode';
13
18
  import AudioBuffer from './AudioBuffer';
14
19
  import AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';
15
20
  import AudioBufferSourceNode from './AudioBufferSourceNode';
21
+ import { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
16
22
  import AudioDestinationNode from './AudioDestinationNode';
17
23
  import BiquadFilterNode from './BiquadFilterNode';
18
24
  import ConstantSourceNode from './ConstantSourceNode';
25
+ import ConvolverNode from './ConvolverNode';
26
+ import DelayNode from './DelayNode';
19
27
  import GainNode from './GainNode';
28
+ import IIRFilterNode from './IIRFilterNode';
20
29
  import OscillatorNode from './OscillatorNode';
21
30
  import PeriodicWave from './PeriodicWave';
22
31
  import RecorderAdapterNode from './RecorderAdapterNode';
23
32
  import StereoPannerNode from './StereoPannerNode';
24
33
  import StreamerNode from './StreamerNode';
25
34
  import WorkletNode from './WorkletNode';
26
- import { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';
35
+ import WorkletProcessingNode from './WorkletProcessingNode';
36
+ import WorkletSourceNode from './WorkletSourceNode';
27
37
 
28
38
  export default class BaseAudioContext {
29
39
  readonly destination: AudioDestinationNode;
@@ -79,14 +89,17 @@ export default class BaseAudioContext {
79
89
  `The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`
80
90
  );
81
91
  }
92
+
82
93
  if (bufferLength < 1) {
83
94
  throw new NotSupportedError(
84
95
  `The buffer length provided (${bufferLength}) can not be less than 1`
85
96
  );
86
97
  }
87
98
 
88
- if (isWorkletsAvailable) {
89
- const shareableWorklet = workletsModule.makeShareableCloneRecursive(
99
+ assertWorkletsEnabled();
100
+
101
+ const shareableWorklet =
102
+ AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
90
103
  (audioBuffers: Array<ArrayBuffer>, channelCount: number) => {
91
104
  'worklet';
92
105
  const floatAudioData: Array<Float32Array> = audioBuffers.map(
@@ -95,19 +108,15 @@ export default class BaseAudioContext {
95
108
  callback(floatAudioData, channelCount);
96
109
  }
97
110
  );
98
- return new WorkletNode(
99
- this,
100
- this.context.createWorkletNode(
101
- shareableWorklet,
102
- workletRuntime === 'UIRuntime',
103
- bufferLength,
104
- inputChannelCount
105
- )
106
- );
107
- }
108
- /// User does not have worklets as a dependency so he cannot use the worklet API.
109
- throw new Error(
110
- '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
111
+
112
+ return new WorkletNode(
113
+ this,
114
+ this.context.createWorkletNode(
115
+ shareableWorklet,
116
+ workletRuntime === 'UIRuntime',
117
+ bufferLength,
118
+ inputChannelCount
119
+ )
111
120
  );
112
121
  }
113
122
 
@@ -120,8 +129,10 @@ export default class BaseAudioContext {
120
129
  ) => void,
121
130
  workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
122
131
  ): WorkletProcessingNode {
123
- if (isWorkletsAvailable) {
124
- const shareableWorklet = workletsModule.makeShareableCloneRecursive(
132
+ assertWorkletsEnabled();
133
+
134
+ const shareableWorklet =
135
+ AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
125
136
  (
126
137
  inputBuffers: Array<ArrayBuffer>,
127
138
  outputBuffers: Array<ArrayBuffer>,
@@ -138,17 +149,13 @@ export default class BaseAudioContext {
138
149
  callback(inputData, outputData, framesToProcess, currentTime);
139
150
  }
140
151
  );
141
- return new WorkletProcessingNode(
142
- this,
143
- this.context.createWorkletProcessingNode(
144
- shareableWorklet,
145
- workletRuntime === 'UIRuntime'
146
- )
147
- );
148
- }
149
- /// User does not have worklets as a dependency so he cannot use the worklet API.
150
- throw new Error(
151
- '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
152
+
153
+ return new WorkletProcessingNode(
154
+ this,
155
+ this.context.createWorkletProcessingNode(
156
+ shareableWorklet,
157
+ workletRuntime === 'UIRuntime'
158
+ )
152
159
  );
153
160
  }
154
161
 
@@ -161,26 +168,23 @@ export default class BaseAudioContext {
161
168
  ) => void,
162
169
  workletRuntime: AudioWorkletRuntime = 'AudioRuntime'
163
170
  ): WorkletSourceNode {
164
- if (!isWorkletsAvailable) {
165
- /// User does not have worklets as a dependency so he cannot use the worklet API.
166
- throw new Error(
167
- '[RnAudioApi] Worklets are not available, please install react-native-worklets as a dependency. Refer to documentation for more details.'
171
+ assertWorkletsEnabled();
172
+ const shareableWorklet =
173
+ AudioAPIModule.workletsModule!.makeShareableCloneRecursive(
174
+ (
175
+ audioBuffers: Array<ArrayBuffer>,
176
+ framesToProcess: number,
177
+ currentTime: number,
178
+ startOffset: number
179
+ ) => {
180
+ 'worklet';
181
+ const floatAudioData: Array<Float32Array> = audioBuffers.map(
182
+ (buffer) => new Float32Array(buffer)
183
+ );
184
+ callback(floatAudioData, framesToProcess, currentTime, startOffset);
185
+ }
168
186
  );
169
- }
170
- const shareableWorklet = workletsModule.makeShareableCloneRecursive(
171
- (
172
- audioBuffers: Array<ArrayBuffer>,
173
- framesToProcess: number,
174
- currentTime: number,
175
- startOffset: number
176
- ) => {
177
- 'worklet';
178
- const floatAudioData: Array<Float32Array> = audioBuffers.map(
179
- (buffer) => new Float32Array(buffer)
180
- );
181
- callback(floatAudioData, framesToProcess, currentTime, startOffset);
182
- }
183
- );
187
+
184
188
  return new WorkletSourceNode(
185
189
  this,
186
190
  this.context.createWorkletSourceNode(
@@ -199,7 +203,11 @@ export default class BaseAudioContext {
199
203
  }
200
204
 
201
205
  createStreamer(): StreamerNode {
202
- return new StreamerNode(this, this.context.createStreamer());
206
+ const streamer = this.context.createStreamer();
207
+ if (!streamer) {
208
+ throw new NotSupportedError('StreamerNode requires FFmpeg build');
209
+ }
210
+ return new StreamerNode(this, streamer);
203
211
  }
204
212
 
205
213
  createConstantSource(): ConstantSourceNode {
@@ -210,6 +218,11 @@ export default class BaseAudioContext {
210
218
  return new GainNode(this, this.context.createGain());
211
219
  }
212
220
 
221
+ createDelay(maxDelayTime?: number): DelayNode {
222
+ const maxTime = maxDelayTime ?? 1.0;
223
+ return new DelayNode(this, this.context.createDelay(maxTime));
224
+ }
225
+
213
226
  createStereoPanner(): StereoPannerNode {
214
227
  return new StereoPannerNode(this, this.context.createStereoPanner());
215
228
  }
@@ -218,6 +231,38 @@ export default class BaseAudioContext {
218
231
  return new BiquadFilterNode(this, this.context.createBiquadFilter());
219
232
  }
220
233
 
234
+ createIIRFilter(options: IIRFilterNodeOptions): IIRFilterNode {
235
+ const feedforward = options.feedforward;
236
+ const feedback = options.feedback;
237
+ if (feedforward.length < 1 || feedforward.length > 20) {
238
+ throw new NotSupportedError(
239
+ `The provided feedforward array has length (${feedforward.length}) outside the range [1, 20]`
240
+ );
241
+ }
242
+ if (feedback.length < 1 || feedback.length > 20) {
243
+ throw new NotSupportedError(
244
+ `The provided feedback array has length (${feedback.length}) outside the range [1, 20]`
245
+ );
246
+ }
247
+
248
+ if (feedforward.every((value) => value === 0)) {
249
+ throw new InvalidStateError(
250
+ `Feedforward array must contain at least one non-zero value`
251
+ );
252
+ }
253
+
254
+ if (feedback[0] === 0) {
255
+ throw new InvalidStateError(
256
+ `First value of feedback array cannot be zero`
257
+ );
258
+ }
259
+
260
+ return new IIRFilterNode(
261
+ this,
262
+ this.context.createIIRFilter(feedforward, feedback)
263
+ );
264
+ }
265
+
221
266
  createBufferSource(
222
267
  options?: AudioBufferBaseSourceNodeOptions
223
268
  ): AudioBufferSourceNode {
@@ -289,4 +334,25 @@ export default class BaseAudioContext {
289
334
  createAnalyser(): AnalyserNode {
290
335
  return new AnalyserNode(this, this.context.createAnalyser());
291
336
  }
337
+
338
+ createConvolver(options?: ConvolverNodeOptions): ConvolverNode {
339
+ if (options?.buffer) {
340
+ const numberOfChannels = options.buffer.numberOfChannels;
341
+ if (
342
+ numberOfChannels !== 1 &&
343
+ numberOfChannels !== 2 &&
344
+ numberOfChannels !== 4
345
+ ) {
346
+ throw new NotSupportedError(
347
+ `The number of channels provided (${numberOfChannels}) in impulse response for ConvolverNode buffer must be 1 or 2 or 4.`
348
+ );
349
+ }
350
+ }
351
+ const buffer = options?.buffer ?? null;
352
+ const disableNormalization = options?.disableNormalization ?? false;
353
+ return new ConvolverNode(
354
+ this,
355
+ this.context.createConvolver(buffer?.buffer, disableNormalization)
356
+ );
357
+ }
292
358
  }