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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +219 -84
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +24 -23
  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 +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  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 +379 -298
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -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 +132 -104
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -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 +98 -50
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -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 +58 -36
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +41 -44
  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 +26 -18
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +193 -53
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -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/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  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 +43 -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 +44 -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 +13 -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 +34 -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 +42 -34
  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 +63 -78
  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 +51 -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 +45 -36
  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 -36
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  500. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  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
@@ -0,0 +1,25 @@
1
+ import { NotSupportedError } from '../errors';
2
+ import { IIIRFilterNode } from '../interfaces';
3
+ import AudioNode from './AudioNode';
4
+
5
+ export default class IIRFilterNode extends AudioNode {
6
+ public getFrequencyResponse(
7
+ frequencyArray: Float32Array,
8
+ magResponseOutput: Float32Array,
9
+ phaseResponseOutput: Float32Array
10
+ ) {
11
+ if (
12
+ frequencyArray.length !== magResponseOutput.length ||
13
+ frequencyArray.length !== phaseResponseOutput.length
14
+ ) {
15
+ throw new NotSupportedError(
16
+ `The lengths of the arrays are not the same frequencyArray: ${frequencyArray.length}, magResponseOutput: ${magResponseOutput.length}, phaseResponseOutput: ${phaseResponseOutput.length}`
17
+ );
18
+ }
19
+ (this.node as IIIRFilterNode).getFrequencyResponse(
20
+ frequencyArray,
21
+ magResponseOutput,
22
+ phaseResponseOutput
23
+ );
24
+ }
25
+ }
@@ -1,9 +1,9 @@
1
+ import AudioAPIModule from '../AudioAPIModule';
2
+ import { InvalidStateError, NotSupportedError } from '../errors';
1
3
  import { IOfflineAudioContext } from '../interfaces';
2
- import BaseAudioContext from './BaseAudioContext';
3
4
  import { OfflineAudioContextOptions } from '../types';
4
- import { InvalidStateError, NotSupportedError } from '../errors';
5
5
  import AudioBuffer from './AudioBuffer';
6
- import { isWorkletsAvailable, workletsModule } from '../utils';
6
+ import BaseAudioContext from './BaseAudioContext';
7
7
 
8
8
  export default class OfflineAudioContext extends BaseAudioContext {
9
9
  private isSuspended: boolean;
@@ -17,10 +17,7 @@ export default class OfflineAudioContext extends BaseAudioContext {
17
17
  arg1?: number,
18
18
  arg2?: number
19
19
  ) {
20
- let audioRuntime = null;
21
- if (isWorkletsAvailable) {
22
- audioRuntime = workletsModule.createWorkletRuntime('AudioWorkletRuntime');
23
- }
20
+ const audioRuntime = AudioAPIModule.createAudioRuntime();
24
21
 
25
22
  if (typeof arg0 === 'object') {
26
23
  const { numberOfChannels, length, sampleRate } = arg0;
@@ -23,6 +23,10 @@ interface OnRouteChangeEventType {
23
23
  | 'NoSuitableRouteForCategory';
24
24
  }
25
25
 
26
+ export interface OnRecorderErrorEventType {
27
+ message: string;
28
+ }
29
+
26
30
  interface RemoteCommandEvents {
27
31
  remotePlay: EventEmptyType;
28
32
  remotePause: EventEmptyType;
@@ -80,6 +84,7 @@ interface AudioAPIEvents {
80
84
  positionChanged: EventTypeWithValue;
81
85
  audioError: EventEmptyType; // to change
82
86
  systemStateChanged: EventEmptyType; // to change
87
+ recorderError: OnRecorderErrorEventType;
83
88
  }
84
89
 
85
90
  type AudioEvents = SystemEvents & AudioAPIEvents;
package/src/interfaces.ts CHANGED
@@ -1,14 +1,19 @@
1
1
  import { AudioEventCallback, AudioEventName } from './events/types';
2
2
  import type {
3
+ AudioRecorderCallbackOptions,
4
+ AudioRecorderFileOptions,
3
5
  BiquadFilterType,
4
6
  ChannelCountMode,
5
7
  ChannelInterpretation,
6
8
  ContextState,
7
9
  FileInfo,
8
10
  OscillatorType,
11
+ Result,
9
12
  WindowType,
10
13
  } from './types';
11
14
 
15
+ // IMPORTANT: use only IClass, because it is a part of contract between cpp host object and js layer
16
+
12
17
  export type WorkletNodeCallback = (
13
18
  audioData: Array<ArrayBuffer>,
14
19
  channelCount: number
@@ -59,8 +64,13 @@ export interface IBaseAudioContext {
59
64
  createOscillator(): IOscillatorNode;
60
65
  createConstantSource(): IConstantSourceNode;
61
66
  createGain(): IGainNode;
67
+ createDelay(maxDelayTime: number): IDelayNode;
62
68
  createStereoPanner(): IStereoPannerNode;
63
69
  createBiquadFilter: () => IBiquadFilterNode;
70
+ createIIRFilter: (
71
+ feedforward: number[],
72
+ feedback: number[]
73
+ ) => IIIRFilterNode;
64
74
  createBufferSource: (pitchCorrection: boolean) => IAudioBufferSourceNode;
65
75
  createBufferQueueSource: (
66
76
  pitchCorrection: boolean
@@ -76,7 +86,11 @@ export interface IBaseAudioContext {
76
86
  disableNormalization: boolean
77
87
  ) => IPeriodicWave;
78
88
  createAnalyser: () => IAnalyserNode;
79
- createStreamer: () => IStreamerNode;
89
+ createConvolver: (
90
+ buffer: IAudioBuffer | undefined,
91
+ disableNormalization: boolean
92
+ ) => IConvolverNode;
93
+ createStreamer: () => IStreamerNode | null; // null when FFmpeg is not enabled
80
94
  }
81
95
 
82
96
  export interface IAudioContext extends IBaseAudioContext {
@@ -103,6 +117,11 @@ export interface IAudioNode {
103
117
  disconnect: (destination?: IAudioNode | IAudioParam) => void;
104
118
  }
105
119
 
120
+ export interface IDelayNode extends IAudioNode {
121
+ readonly delayTime: IAudioParam;
122
+ maxDelayTime: number;
123
+ }
124
+
106
125
  export interface IGainNode extends IAudioNode {
107
126
  readonly gain: IAudioParam;
108
127
  }
@@ -125,6 +144,14 @@ export interface IBiquadFilterNode extends IAudioNode {
125
144
  ): void;
126
145
  }
127
146
 
147
+ export interface IIIRFilterNode extends IAudioNode {
148
+ getFrequencyResponse(
149
+ frequencyArray: Float32Array,
150
+ magResponseOutput: Float32Array,
151
+ phaseResponseOutput: Float32Array
152
+ ): void;
153
+ }
154
+
128
155
  export interface IAudioDestinationNode extends IAudioNode {}
129
156
 
130
157
  export interface IAudioScheduledSourceNode extends IAudioNode {
@@ -139,6 +166,9 @@ export interface IAudioBufferBaseSourceNode extends IAudioScheduledSourceNode {
139
166
  detune: IAudioParam;
140
167
  playbackRate: IAudioParam;
141
168
 
169
+ getInputLatency: () => number;
170
+ getOutputLatency: () => number;
171
+
142
172
  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp
143
173
  onPositionChanged: string;
144
174
  // set how often the onPositionChanged event is called
@@ -182,9 +212,17 @@ export interface IAudioBufferQueueSourceNode
182
212
 
183
213
  // returns bufferId
184
214
  enqueueBuffer: (audioBuffer: IAudioBuffer) => string;
215
+ start: (when?: number, offset?: number) => void;
185
216
  pause: () => void;
186
217
  }
187
218
 
219
+ export interface IConvolverNode extends IAudioNode {
220
+ readonly buffer: IAudioBuffer | null;
221
+ normalize: boolean;
222
+
223
+ setBuffer: (audioBuffer: IAudioBuffer | null) => void;
224
+ }
225
+
188
226
  export interface IAudioBuffer {
189
227
  readonly length: number;
190
228
  readonly duration: number;
@@ -251,46 +289,21 @@ export interface IWorkletSourceNode extends IAudioScheduledSourceNode {}
251
289
 
252
290
  export interface IWorkletProcessingNode extends IAudioNode {}
253
291
 
254
- type IOSAudioRecorderFileDescriptor = number;
255
- type AndroidAudioRecorderFileDescriptor = number;
256
-
257
- interface IAudioRecorderFileOptions {
258
- sampleRate: number;
259
- channels: number;
260
- bitRate: number;
261
- /**
262
- * IOS specific file recording options
263
- *
264
- * - `format` - IOSFormat, bitmask 0 x 0000000F
265
- * - `quality` - IOSAudioQuality, bitmask 0 x 000000F0
266
- * - `flacCompressionLevel` - FlacCompressionLevel, bitmask 0 x 00000F00
267
- * - `directory` - FileDirectory, bitmask 0 x 0000F000
268
- * - `bitDepth` - BitDepth, bitmask 0 x 000F0000
269
- */
270
- ios: IOSAudioRecorderFileDescriptor;
271
- /**
272
- * Android specific file recording options
273
- *
274
- * - He he
275
- */
276
- android: AndroidAudioRecorderFileDescriptor;
277
- }
278
-
279
- interface IAudioRecorderCallbackOptions {
280
- sampleRate: number;
281
- bufferLength: number;
282
- channelCount: number;
292
+ export interface IAudioRecorderCallbackOptions
293
+ extends AudioRecorderCallbackOptions {
283
294
  callbackId: string;
284
295
  }
285
296
 
286
297
  export interface IAudioRecorder {
287
298
  // default recorder methods
288
- start: () => string | void;
289
- stop: () => FileInfo;
299
+ start: () => Result<{ path: string }>;
300
+ stop: () => Result<FileInfo>;
290
301
  isRecording: () => boolean;
291
302
  isPaused: () => boolean;
292
303
 
293
- enableFileOutput: (options: IAudioRecorderFileOptions) => void;
304
+ enableFileOutput: (
305
+ options: AudioRecorderFileOptions
306
+ ) => Result<{ path: string }>;
294
307
  disableFileOutput: () => void;
295
308
 
296
309
  // pause and resume methods for file recording
@@ -301,10 +314,14 @@ export interface IAudioRecorder {
301
314
  connect: (node: IRecorderAdapterNode) => void;
302
315
  disconnect: () => void;
303
316
 
304
- setOnAudioReady: (options: IAudioRecorderCallbackOptions) => void;
317
+ setOnAudioReady: (options: IAudioRecorderCallbackOptions) => Result<void>;
305
318
  clearOnAudioReady: () => void;
306
319
 
320
+ setOnError: (options: { callbackId: string }) => void;
321
+ clearOnError: () => void;
322
+
307
323
  getCurrentDuration: () => number;
324
+ getFilePath: () => string | null;
308
325
  }
309
326
 
310
327
  export interface IAudioDecoder {
@@ -4,6 +4,8 @@ import {
4
4
  ConfigPlugin,
5
5
  withInfoPlist,
6
6
  withAndroidManifest,
7
+ withGradleProperties,
8
+ withPodfile,
7
9
  } from '@expo/config-plugins';
8
10
  const pkg = require('react-native-audio-api/package.json');
9
11
 
@@ -13,6 +15,7 @@ interface Options {
13
15
  androidPermissions: string[];
14
16
  androidForegroundService: boolean;
15
17
  androidFSTypes: string[];
18
+ disableFFmpeg: boolean;
16
19
  }
17
20
 
18
21
  const withDefaultOptions = (options: Partial<Options>): Options => {
@@ -24,6 +27,7 @@ const withDefaultOptions = (options: Partial<Options>): Options => {
24
27
  ],
25
28
  androidForegroundService: true,
26
29
  androidFSTypes: ['mediaPlayback'],
30
+ disableFFmpeg: false,
27
31
  ...options,
28
32
  };
29
33
  };
@@ -88,6 +92,59 @@ const withForegroundService: ConfigPlugin<Options> = (
88
92
  });
89
93
  };
90
94
 
95
+ const withFFmpegConfig: ConfigPlugin<Options> = (config, options) => {
96
+ const iosConf = withPodfile(config, (mod) => {
97
+ let contents = mod.modResults.contents;
98
+ const ffmpegRegex = /^.*ENV\['DISABLE_AUDIOAPI_FFMPEG'\].*$/gm;
99
+ const podfileString = options.disableFFmpeg
100
+ ? `ENV['DISABLE_AUDIOAPI_FFMPEG'] = '1'`
101
+ : '';
102
+ // No existing setting
103
+ if (contents.search(ffmpegRegex) === -1) {
104
+ if (options.disableFFmpeg) {
105
+ if (contents.endsWith('\n')) {
106
+ contents = `${contents}${podfileString}`;
107
+ } else {
108
+ contents = `${contents}\n${podfileString}`;
109
+ }
110
+ mod.modResults.contents = contents;
111
+ }
112
+ } else {
113
+ // Existing setting found, will replace
114
+ contents = contents.replace(ffmpegRegex, podfileString);
115
+ }
116
+
117
+ mod.modResults.contents = contents;
118
+ return mod;
119
+ });
120
+
121
+ const finalConf = withGradleProperties(iosConf, (mod) => {
122
+ const gradleProperties = mod.modResults;
123
+
124
+ const existingIndex = gradleProperties.findIndex(
125
+ (prop) => prop.type === 'property' && prop.key === 'disableAudioapiFFmpeg'
126
+ );
127
+ if (existingIndex !== -1) {
128
+ gradleProperties.splice(existingIndex, 1);
129
+ } else if (!options.disableFFmpeg) {
130
+ // No existing setting and FFmpeg is enabled, do nothing.
131
+ return mod;
132
+ }
133
+
134
+ if (options.disableFFmpeg) {
135
+ gradleProperties.push({
136
+ type: 'property',
137
+ key: 'disableAudioapiFFmpeg',
138
+ value: options.disableFFmpeg ? 'true' : 'false',
139
+ });
140
+ }
141
+
142
+ return mod;
143
+ });
144
+
145
+ return finalConf;
146
+ };
147
+
91
148
  const withAudioAPI: ConfigPlugin<Options> = (config, optionsIn) => {
92
149
  const options = withDefaultOptions(optionsIn ?? {});
93
150
 
@@ -105,6 +162,10 @@ const withAudioAPI: ConfigPlugin<Options> = (config, optionsIn) => {
105
162
  config = withIosMicrophonePermission(config, options);
106
163
  }
107
164
 
165
+ if (options.disableFFmpeg !== undefined) {
166
+ config = withFFmpegConfig(config, options);
167
+ }
168
+
108
169
  return config;
109
170
  };
110
171
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
- import { TurboModuleRegistry } from 'react-native';
3
2
  import type { TurboModule } from 'react-native';
4
- import { PermissionStatus, AudioDevicesInfo } from '../system/types';
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ import { AudioDevicesInfo, PermissionStatus } from '../system/types';
5
5
 
6
6
  interface Spec extends TurboModule {
7
7
  install(): boolean;
@@ -15,6 +15,7 @@ interface Spec extends TurboModule {
15
15
  options: Array<string>,
16
16
  allowHaptics: boolean
17
17
  ): void;
18
+ disableSessionManagement(): void;
18
19
 
19
20
  // Lock Screen Info
20
21
  setLockScreenInfo(info: {
@@ -1,26 +1,16 @@
1
+ import { AudioEventEmitter, AudioEventSubscription } from '../events';
1
2
  import {
2
- SessionOptions,
3
- LockScreenInfo,
4
- PermissionStatus,
5
- AudioDevicesInfo,
6
- } from './types';
7
- import {
8
- SystemEventName,
9
- SystemEventCallback,
10
3
  RemoteCommandEventName,
4
+ SystemEventCallback,
5
+ SystemEventName,
11
6
  } from '../events/types';
12
7
  import { NativeAudioAPIModule } from '../specs';
13
- import { AudioEventEmitter, AudioEventSubscription } from '../events';
14
-
15
- if (global.AudioEventEmitter == null) {
16
- if (!NativeAudioAPIModule) {
17
- throw new Error(
18
- `Failed to install react-native-audio-api: The native module could not be found.`
19
- );
20
- }
21
-
22
- NativeAudioAPIModule.install();
23
- }
8
+ import {
9
+ AudioDevicesInfo,
10
+ LockScreenInfo,
11
+ PermissionStatus,
12
+ SessionOptions,
13
+ } from './types';
24
14
 
25
15
  class AudioManager {
26
16
  private readonly audioEventEmitter: AudioEventEmitter;
@@ -45,6 +35,10 @@ class AudioManager {
45
35
  );
46
36
  }
47
37
 
38
+ disableSessionManagement() {
39
+ NativeAudioAPIModule!.disableSessionManagement();
40
+ }
41
+
48
42
  setLockScreenInfo(info: LockScreenInfo) {
49
43
  NativeAudioAPIModule!.setLockScreenInfo(info);
50
44
  }
package/src/types.ts CHANGED
@@ -1,3 +1,9 @@
1
+ import AudioBuffer from './core/AudioBuffer';
2
+
3
+ export type Result<T> =
4
+ | ({ status: 'success' } & T)
5
+ | { status: 'error'; message: string };
6
+
1
7
  export type ChannelCountMode = 'max' | 'clamped-max' | 'explicit';
2
8
 
3
9
  export type ChannelInterpretation = 'speakers' | 'discrete';
@@ -29,7 +35,6 @@ export interface PeriodicWaveConstraints {
29
35
 
30
36
  export interface AudioContextOptions {
31
37
  sampleRate?: number;
32
- initSuspended?: boolean;
33
38
  }
34
39
 
35
40
  export interface OfflineAudioContextOptions {
@@ -43,7 +48,7 @@ export enum FileDirectory {
43
48
  Cache = 2,
44
49
  }
45
50
 
46
- export enum IOSFormat {
51
+ export enum FileFormat {
47
52
  Wav = 1,
48
53
  Caf = 2,
49
54
  M4A = 3,
@@ -58,23 +63,16 @@ export enum IOSAudioQuality {
58
63
  Max = 5,
59
64
  }
60
65
 
61
- export enum AndroidFormat {
62
- Wav = 1,
63
- Caf = 2,
64
- M4A = 3,
65
- Flac = 4,
66
- }
67
-
68
66
  export enum FlacCompressionLevel {
69
- L0 = 1,
70
- L1 = 2,
71
- L2 = 3,
72
- L3 = 4,
73
- L4 = 5,
74
- L5 = 6,
75
- L6 = 7,
76
- L7 = 8,
77
- L8 = 9,
67
+ L0 = 0,
68
+ L1 = 1,
69
+ L2 = 2,
70
+ L3 = 3,
71
+ L4 = 4,
72
+ L5 = 5,
73
+ L6 = 6,
74
+ L7 = 7,
75
+ L8 = 8,
78
76
  }
79
77
 
80
78
  export enum BitDepth {
@@ -83,24 +81,31 @@ export enum BitDepth {
83
81
  Bit32 = 3,
84
82
  }
85
83
 
86
- export interface AudioRecorderFileOptionsIOS {
87
- format?: IOSFormat;
88
- quality?: IOSAudioQuality;
89
- flacCompressionLevel?: FlacCompressionLevel;
90
- }
91
-
92
- export interface AudioRecorderFileOptionsAndroid {
93
- format?: AndroidFormat;
84
+ export interface FilePresetType {
85
+ bitRate: number;
86
+ sampleRate: number;
87
+ bitDepth: BitDepth;
88
+ iosQuality: IOSAudioQuality;
89
+ flacCompressionLevel: FlacCompressionLevel;
94
90
  }
95
91
 
96
92
  export interface AudioRecorderFileOptions {
93
+ channelCount?: number;
94
+ batchDurationSeconds?: number;
95
+
96
+ format?: FileFormat;
97
+ preset?: FilePresetType;
98
+
97
99
  directory?: FileDirectory;
98
- sampleRate?: number;
99
- channels?: number;
100
- bitRate?: number;
101
- bitDepth?: BitDepth;
102
- ios?: AudioRecorderFileOptionsIOS;
103
- android?: AudioRecorderFileOptionsAndroid;
100
+ subDirectory?: string;
101
+ fileNamePrefix?: string;
102
+ androidFlushIntervalMs?: number;
103
+ }
104
+
105
+ export interface FileInfo {
106
+ path: string;
107
+ size: number;
108
+ duration: number;
104
109
  }
105
110
 
106
111
  export type WindowType = 'blackman' | 'hann';
@@ -111,6 +116,11 @@ export interface AudioBufferBaseSourceNodeOptions {
111
116
 
112
117
  export type ProcessorMode = 'processInPlace' | 'processThrough';
113
118
 
119
+ export interface ConvolverNodeOptions {
120
+ buffer?: AudioBuffer | null;
121
+ disableNormalization?: boolean;
122
+ }
123
+
114
124
  export interface AudioRecorderCallbackOptions {
115
125
  /**
116
126
  * The desired sample rate (in Hz) for audio buffers delivered to the
@@ -133,8 +143,7 @@ export interface AudioRecorderCallbackOptions {
133
143
  channelCount: number;
134
144
  }
135
145
 
136
- export interface FileInfo {
137
- path: string;
138
- size: number;
139
- duration: number;
146
+ export interface IIRFilterNodeOptions {
147
+ feedforward: number[];
148
+ feedback: number[];
140
149
  }
@@ -0,0 +1,47 @@
1
+ import {
2
+ BitDepth,
3
+ FilePresetType,
4
+ FlacCompressionLevel,
5
+ IOSAudioQuality,
6
+ } from '../types';
7
+
8
+ const LowQuality: FilePresetType = {
9
+ sampleRate: 22050,
10
+ bitRate: 48000,
11
+ bitDepth: BitDepth.Bit16,
12
+ flacCompressionLevel: FlacCompressionLevel.L0,
13
+ iosQuality: IOSAudioQuality.Low,
14
+ };
15
+
16
+ const MediumQuality: FilePresetType = {
17
+ sampleRate: 44100,
18
+ bitRate: 128000,
19
+ bitDepth: BitDepth.Bit16,
20
+ flacCompressionLevel: FlacCompressionLevel.L3,
21
+ iosQuality: IOSAudioQuality.Medium,
22
+ };
23
+
24
+ const HighQuality: FilePresetType = {
25
+ sampleRate: 48000,
26
+ bitRate: 192000,
27
+ bitDepth: BitDepth.Bit24,
28
+ flacCompressionLevel: FlacCompressionLevel.L5,
29
+ iosQuality: IOSAudioQuality.High,
30
+ };
31
+
32
+ const LosslessQuality: FilePresetType = {
33
+ sampleRate: 48000,
34
+ bitRate: 320000,
35
+ bitDepth: BitDepth.Bit24,
36
+ flacCompressionLevel: FlacCompressionLevel.L8,
37
+ iosQuality: IOSAudioQuality.High,
38
+ };
39
+
40
+ const FilePreset = {
41
+ Low: LowQuality,
42
+ Medium: MediumQuality,
43
+ High: HighQuality,
44
+ Lossless: LosslessQuality,
45
+ } as const;
46
+
47
+ export default FilePreset;
@@ -1,26 +1,20 @@
1
- import type { ShareableWorkletCallback } from '../interfaces';
2
- export * from './bitEnums';
1
+ import AudioAPIModule from '../AudioAPIModule';
3
2
 
4
- interface SimplifiedWorkletModule {
5
- makeShareableCloneRecursive: (
6
- workletCallback: ShareableWorkletCallback
7
- ) => ShareableWorkletCallback;
3
+ export function assertWorkletsEnabled() {
4
+ if (!AudioAPIModule.areWorkletsAvailable) {
5
+ throw new Error(
6
+ '[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.'
7
+ );
8
+ }
8
9
 
9
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
- createWorkletRuntime: (options?: any) => any;
10
+ if (!AudioAPIModule.isWorkletsVersionSupported) {
11
+ throw new Error(
12
+ `[react-native-audio-api]: Worklets version ${AudioAPIModule.workletsVersion} is not supported.
13
+ Please install react-native-worklets of one of the following versions: [${AudioAPIModule.supportedWorkletsVersion.join(', ')}] to use this feature.`
14
+ );
15
+ }
11
16
  }
12
17
 
13
18
  export function clamp(value: number, min: number, max: number): number {
14
19
  return Math.min(Math.max(value, min), max);
15
20
  }
16
-
17
- export let isWorkletsAvailable = false;
18
- export let workletsModule: SimplifiedWorkletModule;
19
-
20
- try {
21
- workletsModule = require('react-native-worklets');
22
- isWorkletsAvailable = true;
23
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
- } catch (error) {
25
- isWorkletsAvailable = false;
26
- }
@@ -3,6 +3,7 @@ import {
3
3
  PeriodicWaveConstraints,
4
4
  AudioContextOptions,
5
5
  AudioBufferBaseSourceNodeOptions,
6
+ IIRFilterNodeOptions,
6
7
  } from '../types';
7
8
  import { InvalidAccessError, NotSupportedError } from '../errors';
8
9
  import BaseAudioContext from './BaseAudioContext';
@@ -11,10 +12,14 @@ import AudioDestinationNode from './AudioDestinationNode';
11
12
  import AudioBuffer from './AudioBuffer';
12
13
  import AudioBufferSourceNode from './AudioBufferSourceNode';
13
14
  import BiquadFilterNode from './BiquadFilterNode';
15
+ import IIRFilterNode from './IIRFilterNode';
14
16
  import GainNode from './GainNode';
15
17
  import OscillatorNode from './OscillatorNode';
16
18
  import PeriodicWave from './PeriodicWave';
17
19
  import StereoPannerNode from './StereoPannerNode';
20
+ import ConvolverNode from './ConvolverNode';
21
+ import DelayNode from './DelayNode';
22
+ import { ConvolverNodeOptions } from './ConvolverNodeOptions';
18
23
 
19
24
  import { globalWasmPromise, globalTag } from './custom/LoadCustomWasm';
20
25
  import ConstantSourceNode from './ConstantSourceNode';
@@ -25,7 +30,7 @@ export default class AudioContext implements BaseAudioContext {
25
30
  readonly destination: AudioDestinationNode;
26
31
  readonly sampleRate: number;
27
32
 
28
- constructor(options?: AudioContextOptions, _initSuspended: boolean = false) {
33
+ constructor(options?: AudioContextOptions) {
29
34
  if (
30
35
  options &&
31
36
  options.sampleRate &&
@@ -62,6 +67,10 @@ export default class AudioContext implements BaseAudioContext {
62
67
  return new GainNode(this, this.context.createGain());
63
68
  }
64
69
 
70
+ createDelay(maxDelayTime?: number): DelayNode {
71
+ return new DelayNode(this, this.context.createDelay(maxDelayTime));
72
+ }
73
+
65
74
  createStereoPanner(): StereoPannerNode {
66
75
  return new StereoPannerNode(this, this.context.createStereoPanner());
67
76
  }
@@ -70,6 +79,36 @@ export default class AudioContext implements BaseAudioContext {
70
79
  return new BiquadFilterNode(this, this.context.createBiquadFilter());
71
80
  }
72
81
 
82
+ createIIRFilter(options: IIRFilterNodeOptions): IIRFilterNode {
83
+ return new IIRFilterNode(
84
+ this,
85
+ this.context.createIIRFilter(options.feedforward, options.feedback)
86
+ );
87
+ }
88
+
89
+ createConvolver(options?: ConvolverNodeOptions): ConvolverNode {
90
+ if (options?.buffer) {
91
+ const numberOfChannels = options.buffer.numberOfChannels;
92
+ if (
93
+ numberOfChannels !== 1 &&
94
+ numberOfChannels !== 2 &&
95
+ numberOfChannels !== 4
96
+ ) {
97
+ throw new NotSupportedError(
98
+ `The number of channels provided (${numberOfChannels}) in impulse response for ConvolverNode buffer must be 1 or 2 or 4.`
99
+ );
100
+ }
101
+ }
102
+ const buffer = options?.buffer ?? null;
103
+ const disableNormalization = options?.disableNormalization ?? false;
104
+ return new ConvolverNode(
105
+ this,
106
+ this.context.createConvolver(),
107
+ buffer,
108
+ disableNormalization
109
+ );
110
+ }
111
+
73
112
  async createBufferSource(
74
113
  options?: AudioBufferBaseSourceNodeOptions
75
114
  ): Promise<AudioBufferSourceNode> {