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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +23 -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 +42 -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
@@ -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,66 +1,42 @@
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,
11
+ FileFormat,
10
12
  FileInfo,
11
- IOSAudioQuality,
12
- IOSFormat,
13
+ Result,
13
14
  } from '../types';
14
- import { encodeFlags } from '../utils';
15
+ import FilePreset from '../utils/filePresets';
15
16
  import AudioBuffer from './AudioBuffer';
16
17
  import RecorderAdapterNode from './RecorderAdapterNode';
17
18
 
18
- 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> {
19
24
  return {
20
25
  directory: FileDirectory.Cache,
21
- sampleRate: 48000,
22
- channels: 2,
23
- bitRate: 128000,
24
- 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,
25
33
  ...inOptions,
26
- ios: {
27
- format: IOSFormat.M4A,
28
- quality: IOSAudioQuality.High,
29
- ...(inOptions.ios ?? {}),
30
- },
31
- android: {
32
- format: AndroidFormat.M4A,
33
- ...(inOptions.android ?? {}),
34
- },
35
- };
36
- }
37
-
38
- function parseFileOptions(inOptions: AudioRecorderFileOptions) {
39
- const { sampleRate, channels, bitRate, directory, bitDepth, ios, android } =
40
- withDefaultOptions(inOptions);
41
-
42
- const iosFlags = encodeFlags(
43
- ios.format,
44
- ios.quality,
45
- ios.flacCompressionLevel || 0,
46
- directory,
47
- bitDepth
48
- );
49
-
50
- // TODO: ensure directory and bitDepth are last in the bitmask
51
- const androidFlags = encodeFlags(android.format, directory, bitDepth);
52
-
53
- return {
54
- sampleRate,
55
- channels,
56
- bitRate,
57
- ios: iosFlags,
58
- android: androidFlags,
59
34
  };
60
35
  }
61
36
 
62
37
  export default class AudioRecorder {
63
38
  protected onAudioReadySubscription: AudioEventSubscription | null = null;
39
+ protected onErrorSubscription: AudioEventSubscription | null = null;
64
40
  protected readonly recorder: IAudioRecorder;
65
41
  protected options_: AudioRecorderFileOptions | null = null;
66
42
  private isFileOutputEnabled: boolean = false;
@@ -73,18 +49,16 @@ export default class AudioRecorder {
73
49
  this.recorder = global.createAudioRecorder();
74
50
  }
75
51
 
76
- enableFileOutput(options: AudioRecorderFileOptions): void {
77
- if (this.recorder.isRecording()) {
78
- throw new Error(
79
- 'Cannot enable file output while recording is in progress. Please stop the recorder before changing output options.'
80
- );
81
- }
82
-
83
- this.options_ = options;
84
-
85
- const parsedOptions = parseFileOptions(options);
86
- this.recorder.enableFileOutput(parsedOptions);
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);
87
59
  this.isFileOutputEnabled = true;
60
+
61
+ return result;
88
62
  }
89
63
 
90
64
  public get options(): AudioRecorderFileOptions | null {
@@ -98,17 +72,17 @@ export default class AudioRecorder {
98
72
  }
99
73
 
100
74
  /** Starts the audio recording process with configured output options */
101
- start(): string | void {
75
+ start(): Result<{ path: string }> {
102
76
  if (!this.isFileOutputEnabled) {
103
77
  this.recorder.start();
104
- return;
78
+ return { status: 'success', path: '' };
105
79
  }
106
80
 
107
81
  return this.recorder.start();
108
82
  }
109
83
 
110
84
  /** Stops the audio recording process and releases internal resources */
111
- stop(): FileInfo {
85
+ stop(): Result<FileInfo> {
112
86
  return this.recorder.stop();
113
87
  }
114
88
 
@@ -132,17 +106,12 @@ export default class AudioRecorder {
132
106
  * @throws If the node has already been connected.
133
107
  */
134
108
  connect(node: RecorderAdapterNode): void {
135
- if (this.recorder.isRecording()) {
136
- throw new Error(
137
- 'Cannot connect adapter node while recording is in progress. Please stop the recorder before connecting new nodes.'
138
- );
139
- }
140
-
141
109
  if (node.wasConnected) {
142
110
  throw new Error(
143
111
  'RecorderAdapterNode cannot be connected more than once. Refer to the documentation for more details.'
144
112
  );
145
113
  }
114
+
146
115
  node.wasConnected = true;
147
116
  this.recorder.connect(node.getNode());
148
117
  }
@@ -176,13 +145,7 @@ export default class AudioRecorder {
176
145
  onAudioReady(
177
146
  options: AudioRecorderCallbackOptions,
178
147
  callback: (event: OnAudioReadyEventType) => void
179
- ): void {
180
- if (this.recorder.isRecording()) {
181
- throw new Error(
182
- 'Cannot set onAudioReady callback while recording is in progress. Please stop the recorder before setting a new callback.'
183
- );
184
- }
185
-
148
+ ): Result<void> {
186
149
  if (this.onAudioReadySubscription) {
187
150
  this.recorder.clearOnAudioReady();
188
151
  this.onAudioReadySubscription.remove();
@@ -198,7 +161,7 @@ export default class AudioRecorder {
198
161
  });
199
162
  });
200
163
 
201
- this.recorder.setOnAudioReady({
164
+ return this.recorder.setOnAudioReady({
202
165
  sampleRate: options.sampleRate,
203
166
  bufferLength: options.bufferLength,
204
167
  channelCount: options.channelCount,
@@ -214,12 +177,6 @@ export default class AudioRecorder {
214
177
  * registered.
215
178
  */
216
179
  clearOnAudioReady(): void {
217
- if (this.recorder.isRecording()) {
218
- throw new Error(
219
- 'Cannot clear onAudioReady callback while recording is in progress. Please stop the recorder before clearing the callback.'
220
- );
221
- }
222
-
223
180
  if (!this.onAudioReadySubscription) {
224
181
  return;
225
182
  }
@@ -241,4 +198,32 @@ export default class AudioRecorder {
241
198
  getCurrentDuration(): number {
242
199
  return this.recorder.getCurrentDuration();
243
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
+ }
244
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
  }
@@ -0,0 +1,35 @@
1
+ import { IConvolverNode } from '../interfaces';
2
+ import BaseAudioContext from './BaseAudioContext';
3
+ import AudioNode from './AudioNode';
4
+ import AudioBuffer from './AudioBuffer';
5
+
6
+ export default class ConvolverNode extends AudioNode {
7
+ constructor(context: BaseAudioContext, node: IConvolverNode) {
8
+ super(context, node);
9
+ this.normalize = node.normalize;
10
+ }
11
+
12
+ public get buffer(): AudioBuffer | null {
13
+ const buffer = (this.node as IConvolverNode).buffer;
14
+ if (!buffer) {
15
+ return null;
16
+ }
17
+ return new AudioBuffer(buffer);
18
+ }
19
+
20
+ public set buffer(buffer: AudioBuffer | null) {
21
+ if (!buffer) {
22
+ (this.node as IConvolverNode).setBuffer(null);
23
+ return;
24
+ }
25
+ (this.node as IConvolverNode).setBuffer(buffer.buffer);
26
+ }
27
+
28
+ public get normalize(): boolean {
29
+ return (this.node as IConvolverNode).normalize;
30
+ }
31
+
32
+ public set normalize(value: boolean) {
33
+ (this.node as IConvolverNode).normalize = value;
34
+ }
35
+ }
@@ -0,0 +1,13 @@
1
+ import { IDelayNode } from '../interfaces';
2
+ import AudioNode from './AudioNode';
3
+ import AudioParam from './AudioParam';
4
+ import BaseAudioContext from './BaseAudioContext';
5
+
6
+ export default class DelayNode extends AudioNode {
7
+ readonly delayTime: AudioParam;
8
+
9
+ constructor(context: BaseAudioContext, delay: IDelayNode) {
10
+ super(context, delay);
11
+ this.delayTime = new AudioParam(delay.delayTime, context);
12
+ }
13
+ }