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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (623) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +315 -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 +46 -58
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +363 -299
  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 +56 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +114 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +132 -105
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -16
  24. package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +2 -1
  25. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +189 -14
  26. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioPlayer.kt +10 -8
  27. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +10 -8
  28. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -2
  29. package/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt +128 -0
  30. package/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt +116 -0
  31. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +115 -107
  32. package/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt +2 -1
  33. package/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt +47 -0
  34. package/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt +191 -0
  35. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +669 -0
  36. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +33 -0
  37. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt +303 -0
  38. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +45 -0
  39. package/android/src/main/java/com/swmansion/audioapi/system/notification/SimpleNotification.kt +119 -0
  40. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  42. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  43. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  44. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  45. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  46. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  47. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  48. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  49. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  50. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  51. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  52. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  53. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  54. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  55. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  56. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +100 -76
  57. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  58. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  59. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  60. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  61. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  62. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  63. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  64. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  65. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  66. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  68. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  69. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  70. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  71. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  72. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  73. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  74. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  75. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  76. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  77. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  78. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  79. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  80. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  81. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  82. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  83. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  84. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +98 -50
  85. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -2
  86. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  87. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  88. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  89. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  90. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  91. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  92. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  93. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  94. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  95. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  96. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  97. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  98. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  99. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  100. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  101. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  102. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  103. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  104. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  105. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  106. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  107. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  108. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  109. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  110. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  111. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  112. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  113. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  114. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  115. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  116. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  117. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  118. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  119. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +96 -74
  120. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +44 -15
  121. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  122. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  123. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  124. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  125. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  126. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  127. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  128. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  129. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  130. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  131. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  132. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  133. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  134. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  135. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  136. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  137. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +66 -36
  138. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +42 -44
  139. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  140. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  141. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  142. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  143. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  144. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  145. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  146. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  147. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  148. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  149. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  150. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  151. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  152. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  153. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  154. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  155. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +105 -87
  156. package/common/cpp/audioapi/core/sources/StreamerNode.h +67 -33
  157. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  158. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  159. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  160. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  161. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  162. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +44 -0
  163. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  164. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  165. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  166. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  167. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  168. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  169. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  170. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +52 -0
  171. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  172. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  173. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  174. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  175. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  176. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  177. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  178. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  179. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  180. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  181. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  182. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  183. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  184. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  185. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  186. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  187. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  188. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  189. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  190. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  217. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  218. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  219. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  220. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  221. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  222. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  223. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  224. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  225. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  226. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  227. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  228. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  229. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  230. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  231. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  232. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  233. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  234. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  235. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  236. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  237. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  238. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  239. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  240. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  241. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  242. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  243. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  244. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  245. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  246. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  247. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  248. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +53 -0
  249. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  250. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  251. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  252. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  253. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  254. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  255. package/common/cpp/audioapi/utils/Benchmark.hpp +50 -47
  256. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  257. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  258. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  259. package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +12 -9
  260. package/common/cpp/audioapi/utils/MoveOnlyFunction.hpp +17 -15
  261. package/common/cpp/audioapi/utils/Result.hpp +323 -0
  262. package/common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp +22 -28
  263. package/common/cpp/audioapi/utils/SpscChannel.hpp +329 -305
  264. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -20
  265. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  266. package/common/cpp/test/CMakeLists.txt +15 -15
  267. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  268. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  269. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  270. package/common/cpp/test/src/DelayTest.cpp +108 -0
  271. package/common/cpp/test/src/GainTest.cpp +4 -5
  272. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  273. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  274. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  275. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  276. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  277. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  278. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  279. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  280. package/ios/audioapi/ios/AudioAPIModule.h +4 -3
  281. package/ios/audioapi/ios/AudioAPIModule.mm +148 -34
  282. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  283. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  284. package/ios/audioapi/ios/core/IOSAudioRecorder.h +26 -18
  285. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +244 -54
  286. package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
  287. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  288. package/ios/audioapi/ios/core/NativeAudioRecorder.m +49 -7
  289. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
  290. package/ios/audioapi/ios/core/utils/FileOptions.h +33 -0
  291. package/ios/audioapi/ios/core/utils/FileOptions.mm +195 -0
  292. package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  293. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
  294. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  295. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +185 -0
  296. package/ios/audioapi/ios/system/AudioEngine.h +21 -16
  297. package/ios/audioapi/ios/system/AudioEngine.mm +153 -132
  298. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  299. package/ios/audioapi/ios/system/AudioSessionManager.mm +277 -203
  300. package/ios/audioapi/ios/system/NotificationManager.mm +47 -53
  301. package/ios/audioapi/ios/system/notification/BaseNotification.h +58 -0
  302. package/ios/audioapi/ios/system/notification/NotificationRegistry.h +70 -0
  303. package/ios/audioapi/ios/system/notification/NotificationRegistry.mm +172 -0
  304. package/ios/audioapi/ios/system/notification/PlaybackNotification.h +27 -0
  305. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +427 -0
  306. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  307. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  308. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  309. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  310. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  311. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  312. package/lib/commonjs/api.js +89 -12
  313. package/lib/commonjs/api.js.map +1 -1
  314. package/lib/commonjs/api.web.js +35 -14
  315. package/lib/commonjs/api.web.js.map +1 -1
  316. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  317. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  318. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  319. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  320. package/lib/commonjs/core/AudioContext.js +5 -8
  321. package/lib/commonjs/core/AudioContext.js.map +1 -1
  322. package/lib/commonjs/core/AudioNode.js +1 -1
  323. package/lib/commonjs/core/AudioNode.js.map +1 -1
  324. package/lib/commonjs/core/AudioParam.js +18 -11
  325. package/lib/commonjs/core/AudioParam.js.map +1 -1
  326. package/lib/commonjs/core/AudioRecorder.js +43 -55
  327. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  328. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  329. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  330. package/lib/commonjs/core/ConvolverNode.js +37 -0
  331. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  332. package/lib/commonjs/core/DelayNode.js +17 -0
  333. package/lib/commonjs/core/DelayNode.js.map +1 -0
  334. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  335. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  336. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  337. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  338. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  339. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  340. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  341. package/lib/commonjs/system/AudioManager.js +9 -15
  342. package/lib/commonjs/system/AudioManager.js.map +1 -1
  343. package/lib/commonjs/system/index.js +13 -0
  344. package/lib/commonjs/system/index.js.map +1 -1
  345. package/lib/commonjs/system/notification/PlaybackNotificationManager.js +138 -0
  346. package/lib/commonjs/system/notification/PlaybackNotificationManager.js.map +1 -0
  347. package/lib/commonjs/system/notification/RecordingNotificationManager.js +185 -0
  348. package/lib/commonjs/system/notification/RecordingNotificationManager.js.map +1 -0
  349. package/lib/commonjs/system/notification/SimpleNotificationManager.js +125 -0
  350. package/lib/commonjs/system/notification/SimpleNotificationManager.js.map +1 -0
  351. package/lib/commonjs/system/notification/index.js +45 -0
  352. package/lib/commonjs/system/notification/index.js.map +1 -0
  353. package/lib/commonjs/system/notification/types.js +6 -0
  354. package/lib/commonjs/system/notification/types.js.map +1 -0
  355. package/lib/commonjs/types.js +28 -35
  356. package/lib/commonjs/types.js.map +1 -1
  357. package/lib/commonjs/utils/filePresets.js +43 -0
  358. package/lib/commonjs/utils/filePresets.js.map +1 -0
  359. package/lib/commonjs/utils/index.js +12 -27
  360. package/lib/commonjs/utils/index.js.map +1 -1
  361. package/lib/commonjs/web-core/AudioContext.js +21 -1
  362. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  363. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  364. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  365. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  366. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  367. package/lib/commonjs/web-core/DelayNode.js +17 -0
  368. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  369. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  370. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  371. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  372. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  373. package/lib/commonjs/web-system/index.js +17 -0
  374. package/lib/commonjs/web-system/index.js.map +1 -0
  375. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js +37 -0
  376. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  377. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js +37 -0
  378. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js.map +1 -0
  379. package/lib/commonjs/web-system/notification/index.js +21 -0
  380. package/lib/commonjs/web-system/notification/index.js.map +1 -0
  381. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  382. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  383. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  384. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  385. package/lib/module/AudioAPIModule/index.js +4 -0
  386. package/lib/module/AudioAPIModule/index.js.map +1 -0
  387. package/lib/module/api.js +7 -12
  388. package/lib/module/api.js.map +1 -1
  389. package/lib/module/api.web.js +4 -1
  390. package/lib/module/api.web.js.map +1 -1
  391. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  392. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  393. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  394. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  395. package/lib/module/core/AudioContext.js +5 -8
  396. package/lib/module/core/AudioContext.js.map +1 -1
  397. package/lib/module/core/AudioNode.js +1 -1
  398. package/lib/module/core/AudioNode.js.map +1 -1
  399. package/lib/module/core/AudioParam.js +18 -11
  400. package/lib/module/core/AudioParam.js.map +1 -1
  401. package/lib/module/core/AudioRecorder.js +44 -56
  402. package/lib/module/core/AudioRecorder.js.map +1 -1
  403. package/lib/module/core/BaseAudioContext.js +63 -32
  404. package/lib/module/core/BaseAudioContext.js.map +1 -1
  405. package/lib/module/core/ConvolverNode.js +31 -0
  406. package/lib/module/core/ConvolverNode.js.map +1 -0
  407. package/lib/module/core/DelayNode.js +11 -0
  408. package/lib/module/core/DelayNode.js.map +1 -0
  409. package/lib/module/core/IIRFilterNode.js +13 -0
  410. package/lib/module/core/IIRFilterNode.js.map +1 -0
  411. package/lib/module/core/OfflineAudioContext.js +3 -6
  412. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  413. package/lib/module/plugin/withAudioAPI.js +47 -1
  414. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  415. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  416. package/lib/module/system/AudioManager.js +9 -15
  417. package/lib/module/system/AudioManager.js.map +1 -1
  418. package/lib/module/system/index.js +1 -0
  419. package/lib/module/system/index.js.map +1 -1
  420. package/lib/module/system/notification/PlaybackNotificationManager.js +134 -0
  421. package/lib/module/system/notification/PlaybackNotificationManager.js.map +1 -0
  422. package/lib/module/system/notification/RecordingNotificationManager.js +181 -0
  423. package/lib/module/system/notification/RecordingNotificationManager.js.map +1 -0
  424. package/lib/module/system/notification/SimpleNotificationManager.js +121 -0
  425. package/lib/module/system/notification/SimpleNotificationManager.js.map +1 -0
  426. package/lib/module/system/notification/index.js +7 -0
  427. package/lib/module/system/notification/index.js.map +1 -0
  428. package/lib/module/system/notification/types.js +4 -0
  429. package/lib/module/system/notification/types.js.map +1 -0
  430. package/lib/module/types.js +27 -34
  431. package/lib/module/types.js.map +1 -1
  432. package/lib/module/utils/filePresets.js +39 -0
  433. package/lib/module/utils/filePresets.js.map +1 -0
  434. package/lib/module/utils/index.js +10 -10
  435. package/lib/module/utils/index.js.map +1 -1
  436. package/lib/module/web-core/AudioContext.js +21 -1
  437. package/lib/module/web-core/AudioContext.js.map +1 -1
  438. package/lib/module/web-core/ConvolverNode.js +34 -0
  439. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  440. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  441. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  442. package/lib/module/web-core/DelayNode.js +11 -0
  443. package/lib/module/web-core/DelayNode.js.map +1 -0
  444. package/lib/module/web-core/IIRFilterNode.js +13 -0
  445. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  446. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  447. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  448. package/lib/module/web-system/index.js +4 -0
  449. package/lib/module/web-system/index.js.map +1 -0
  450. package/lib/module/web-system/notification/PlaybackNotificationManager.js +33 -0
  451. package/lib/module/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  452. package/lib/module/web-system/notification/RecordingNotificationManager.js +33 -0
  453. package/lib/module/web-system/notification/RecordingNotificationManager.js.map +1 -0
  454. package/lib/module/web-system/notification/index.js +5 -0
  455. package/lib/module/web-system/notification/index.js.map +1 -0
  456. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  457. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  458. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  459. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  460. package/lib/typescript/api.d.ts +5 -9
  461. package/lib/typescript/api.d.ts.map +1 -1
  462. package/lib/typescript/api.web.d.ts +4 -1
  463. package/lib/typescript/api.web.d.ts.map +1 -1
  464. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  465. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  466. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  467. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  468. package/lib/typescript/core/AudioContext.d.ts +1 -1
  469. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  470. package/lib/typescript/core/AudioNode.d.ts +2 -1
  471. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  472. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  473. package/lib/typescript/core/AudioRecorder.d.ts +13 -6
  474. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  475. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  476. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  477. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  478. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  479. package/lib/typescript/core/DelayNode.d.ts +9 -0
  480. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  481. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  482. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  483. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  484. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  485. package/lib/typescript/events/types.d.ts +6 -2
  486. package/lib/typescript/events/types.d.ts.map +1 -1
  487. package/lib/typescript/interfaces.d.ts +34 -34
  488. package/lib/typescript/interfaces.d.ts.map +1 -1
  489. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  490. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  491. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +18 -6
  492. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  493. package/lib/typescript/system/AudioManager.d.ts +5 -5
  494. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  495. package/lib/typescript/system/index.d.ts +1 -0
  496. package/lib/typescript/system/index.d.ts.map +1 -1
  497. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts +23 -0
  498. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  499. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts +24 -0
  500. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts.map +1 -0
  501. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts +21 -0
  502. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts.map +1 -0
  503. package/lib/typescript/system/notification/index.d.ts +5 -0
  504. package/lib/typescript/system/notification/index.d.ts.map +1 -0
  505. package/lib/typescript/system/notification/types.d.ts +65 -0
  506. package/lib/typescript/system/notification/types.d.ts.map +1 -0
  507. package/lib/typescript/system/types.d.ts +0 -16
  508. package/lib/typescript/system/types.d.ts.map +1 -1
  509. package/lib/typescript/types.d.ts +57 -49
  510. package/lib/typescript/types.d.ts.map +1 -1
  511. package/lib/typescript/utils/filePresets.d.ts +9 -0
  512. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  513. package/lib/typescript/utils/index.d.ts +1 -8
  514. package/lib/typescript/utils/index.d.ts.map +1 -1
  515. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  516. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  517. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  518. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  519. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  520. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  521. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  522. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  523. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  524. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  525. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  526. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  527. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  528. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  529. package/lib/typescript/web-system/index.d.ts +2 -0
  530. package/lib/typescript/web-system/index.d.ts.map +1 -0
  531. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts +20 -0
  532. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  533. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts +20 -0
  534. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts.map +1 -0
  535. package/lib/typescript/web-system/notification/index.d.ts +3 -0
  536. package/lib/typescript/web-system/notification/index.d.ts.map +1 -0
  537. package/package.json +11 -5
  538. package/scripts/download-prebuilt-binaries.sh +61 -0
  539. package/scripts/rnaa_utils.rb +8 -0
  540. package/scripts/validate-worklets-version.js +27 -0
  541. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  542. package/src/AudioAPIModule/globals.d.ts +33 -0
  543. package/src/AudioAPIModule/index.ts +1 -0
  544. package/src/api.ts +21 -52
  545. package/src/api.web.ts +8 -2
  546. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  547. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  548. package/src/core/AudioContext.ts +5 -8
  549. package/src/core/AudioNode.ts +4 -3
  550. package/src/core/AudioParam.ts +18 -11
  551. package/src/core/AudioRecorder.ts +63 -78
  552. package/src/core/BaseAudioContext.ts +120 -54
  553. package/src/core/ConvolverNode.ts +35 -0
  554. package/src/core/DelayNode.ts +13 -0
  555. package/src/core/IIRFilterNode.ts +25 -0
  556. package/src/core/OfflineAudioContext.ts +4 -7
  557. package/src/events/types.ts +7 -3
  558. package/src/interfaces.ts +51 -34
  559. package/src/plugin/withAudioAPI.ts +61 -0
  560. package/src/specs/NativeAudioAPIModule.ts +26 -9
  561. package/src/system/AudioManager.ts +13 -32
  562. package/src/system/index.ts +1 -0
  563. package/src/system/notification/PlaybackNotificationManager.ts +197 -0
  564. package/src/system/notification/RecordingNotificationManager.ts +247 -0
  565. package/src/system/notification/SimpleNotificationManager.ts +175 -0
  566. package/src/system/notification/index.ts +4 -0
  567. package/src/system/notification/types.ts +111 -0
  568. package/src/system/types.ts +0 -18
  569. package/src/types.ts +59 -50
  570. package/src/utils/filePresets.ts +47 -0
  571. package/src/utils/index.ts +13 -19
  572. package/src/web-core/AudioContext.tsx +40 -1
  573. package/src/web-core/BaseAudioContext.tsx +11 -1
  574. package/src/web-core/ConvolverNode.tsx +43 -0
  575. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  576. package/src/web-core/DelayNode.tsx +12 -0
  577. package/src/web-core/IIRFilterNode.tsx +25 -0
  578. package/src/web-core/OfflineAudioContext.tsx +39 -0
  579. package/src/web-system/index.ts +1 -0
  580. package/src/web-system/notification/PlaybackNotificationManager.ts +64 -0
  581. package/src/web-system/notification/RecordingNotificationManager.ts +64 -0
  582. package/src/web-system/notification/index.ts +2 -0
  583. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  584. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  585. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  586. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  587. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  588. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  589. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +0 -325
  590. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +0 -262
  591. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +0 -57
  592. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -61
  593. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  594. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  595. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  596. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
  597. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  598. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  599. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  600. package/ios/audioapi/ios/system/LockScreenManager.h +0 -24
  601. package/ios/audioapi/ios/system/LockScreenManager.mm +0 -310
  602. package/lib/commonjs/utils/bitEnums.js +0 -33
  603. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  604. package/lib/module/utils/bitEnums.js +0 -27
  605. package/lib/module/utils/bitEnums.js.map +0 -1
  606. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  607. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  608. package/metro-config/index.d.ts +0 -5
  609. package/metro-config/index.js +0 -41
  610. package/metro-config/tsconfig.json +0 -3
  611. package/src/utils/bitEnums.ts +0 -51
  612. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  613. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  614. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  615. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  616. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  617. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  618. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  619. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  620. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  621. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  622. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  623. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -0,0 +1,122 @@
1
+ import type { ShareableWorkletCallback } from '../interfaces';
2
+ import { NativeAudioAPIModule } from '../specs';
3
+
4
+ // Hint: Copied from react-native-worklets
5
+ // Doesn't really matter what is inside, just need a unique type
6
+ interface WorkletRuntime {
7
+ __hostObjectWorkletRuntime: never;
8
+ readonly name: string;
9
+ }
10
+
11
+ interface IWorkletsModule {
12
+ makeShareableCloneRecursive: (
13
+ workletCallback: ShareableWorkletCallback
14
+ ) => ShareableWorkletCallback;
15
+
16
+ createWorkletRuntime: (runtimeName: string) => WorkletRuntime;
17
+ }
18
+
19
+ class AudioAPIModule {
20
+ #workletsModule_: IWorkletsModule | null = null;
21
+ #canUseWorklets_ = false;
22
+ #workletsVersion = 'unknown';
23
+ #workletsAvailable_ = false;
24
+
25
+ public supportedWorkletsVersion = ['0.6.0', '0.6.1'];
26
+
27
+ constructor() {
28
+ // Important! Verify and import worklets first
29
+ // otherwise the native module installation might crash
30
+ // if react-native-worklets is not imported before audio-api
31
+ this.#verifyWorklets();
32
+
33
+ if (this.#verifyInstallation()) {
34
+ return;
35
+ }
36
+
37
+ if (!NativeAudioAPIModule) {
38
+ throw new Error(
39
+ `Failed to install react-native-audio-api: The native module could not be found.`
40
+ );
41
+ }
42
+
43
+ NativeAudioAPIModule.install();
44
+ }
45
+
46
+ #verifyWorklets(): boolean {
47
+ try {
48
+ const workletsPackage = require('react-native-worklets');
49
+ const workletsPackageJson = require('react-native-worklets/package.json');
50
+ this.#workletsVersion = workletsPackageJson.version;
51
+ this.#workletsAvailable_ = true;
52
+
53
+ this.#canUseWorklets_ = this.supportedWorkletsVersion.includes(
54
+ workletsPackageJson.version
55
+ );
56
+
57
+ if (this.#canUseWorklets_) {
58
+ this.#workletsModule_ = workletsPackage;
59
+ }
60
+
61
+ return this.#canUseWorklets_;
62
+ } catch {
63
+ this.#canUseWorklets_ = false;
64
+ return false;
65
+ }
66
+ }
67
+
68
+ #verifyInstallation(): boolean {
69
+ return (
70
+ global.createAudioContext != null &&
71
+ global.createOfflineAudioContext != null &&
72
+ global.createAudioRecorder != null &&
73
+ global.createAudioDecoder != null &&
74
+ global.createAudioStretcher != null &&
75
+ global.AudioEventEmitter != null
76
+ );
77
+ }
78
+
79
+ get workletsModule(): IWorkletsModule | null {
80
+ return this.#workletsModule_;
81
+ }
82
+
83
+ /**
84
+ * Indicates whether react-native-worklets are installed in matching version,
85
+ * for usage with react-native-audio-api.
86
+ */
87
+ get canUseWorklets(): boolean {
88
+ return this.#canUseWorklets_;
89
+ }
90
+
91
+ /** Returns the installed worklets version or 'unknown'. */
92
+ get workletsVersion(): string {
93
+ return this.#workletsVersion;
94
+ }
95
+
96
+ /**
97
+ * Indicates whether react-native-worklets are installed, regardless of
98
+ * version support. Useful for asserting compatibility.
99
+ */
100
+ get areWorkletsAvailable(): boolean {
101
+ return this.#workletsAvailable_;
102
+ }
103
+
104
+ /**
105
+ * Indicates whether the installed react-native-worklets version is supported.
106
+ * Useful for asserting compatibility.
107
+ */
108
+ get isWorkletsVersionSupported(): boolean {
109
+ // Note: if areWorkletsAvailable is true, canUseWorklets is equivalent to version check
110
+ return this.#canUseWorklets_;
111
+ }
112
+
113
+ public createAudioRuntime(): WorkletRuntime | null {
114
+ if (!this.#canUseWorklets_) {
115
+ return null;
116
+ }
117
+
118
+ return this.#workletsModule_!.createWorkletRuntime('AudioWorkletRuntime');
119
+ }
120
+ }
121
+
122
+ export default new AudioAPIModule();
@@ -0,0 +1,33 @@
1
+ import type {
2
+ IAudioContext,
3
+ IAudioDecoder,
4
+ IAudioEventEmitter,
5
+ IAudioRecorder,
6
+ IAudioStretcher,
7
+ IOfflineAudioContext,
8
+ } from '../interfaces';
9
+
10
+ /* eslint-disable no-var */
11
+ declare global {
12
+ var createAudioContext: (
13
+ sampleRate: number,
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ audioWorkletRuntime: any
16
+ ) => IAudioContext;
17
+ var createOfflineAudioContext: (
18
+ numberOfChannels: number,
19
+ length: number,
20
+ sampleRate: number,
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ audioWorkletRuntime: any
23
+ ) => IOfflineAudioContext;
24
+
25
+ var createAudioRecorder: () => IAudioRecorder;
26
+
27
+ var createAudioDecoder: () => IAudioDecoder;
28
+
29
+ var createAudioStretcher: () => IAudioStretcher;
30
+
31
+ var AudioEventEmitter: IAudioEventEmitter;
32
+ }
33
+ /* eslint-disable no-var */
@@ -0,0 +1 @@
1
+ export { default } from './AudioAPIModule';
package/src/api.ts CHANGED
@@ -1,55 +1,4 @@
1
- import type {
2
- IAudioContext,
3
- IAudioDecoder,
4
- IAudioEventEmitter,
5
- IAudioRecorder,
6
- IAudioStretcher,
7
- IOfflineAudioContext,
8
- } from './interfaces';
9
- import { NativeAudioAPIModule } from './specs';
10
-
11
- /* eslint-disable no-var */
12
- declare global {
13
- var createAudioContext: (
14
- sampleRate: number,
15
- initSuspended: boolean,
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- audioWorkletRuntime: any
18
- ) => IAudioContext;
19
- var createOfflineAudioContext: (
20
- numberOfChannels: number,
21
- length: number,
22
- sampleRate: number,
23
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
- audioWorkletRuntime: any
25
- ) => IOfflineAudioContext;
26
-
27
- var createAudioRecorder: () => IAudioRecorder;
28
-
29
- var createAudioDecoder: () => IAudioDecoder;
30
-
31
- var createAudioStretcher: () => IAudioStretcher;
32
-
33
- var AudioEventEmitter: IAudioEventEmitter;
34
- }
35
- /* eslint-disable no-var */
36
-
37
- if (
38
- global.createAudioContext == null ||
39
- global.createOfflineAudioContext == null ||
40
- global.createAudioRecorder == null ||
41
- global.createAudioDecoder == null ||
42
- global.createAudioStretcher == null ||
43
- global.AudioEventEmitter == null
44
- ) {
45
- if (!NativeAudioAPIModule) {
46
- throw new Error(
47
- `Failed to install react-native-audio-api: The native module could not be found.`
48
- );
49
- }
50
-
51
- NativeAudioAPIModule.install();
52
- }
1
+ import './AudioAPIModule';
53
2
 
54
3
  export { default as AnalyserNode } from './core/AnalyserNode';
55
4
  export { default as AudioBuffer } from './core/AudioBuffer';
@@ -66,6 +15,7 @@ export { default as changePlaybackSpeed } from './core/AudioStretcher';
66
15
  export { default as BaseAudioContext } from './core/BaseAudioContext';
67
16
  export { default as BiquadFilterNode } from './core/BiquadFilterNode';
68
17
  export { default as ConstantSourceNode } from './core/ConstantSourceNode';
18
+ export { default as ConvolverNode } from './core/ConvolverNode';
69
19
  export { default as GainNode } from './core/GainNode';
70
20
  export { default as OfflineAudioContext } from './core/OfflineAudioContext';
71
21
  export { default as OscillatorNode } from './core/OscillatorNode';
@@ -75,9 +25,28 @@ export { default as StreamerNode } from './core/StreamerNode';
75
25
  export { default as WorkletNode } from './core/WorkletNode';
76
26
  export { default as WorkletProcessingNode } from './core/WorkletProcessingNode';
77
27
  export { default as WorkletSourceNode } from './core/WorkletSourceNode';
28
+
78
29
  export { default as useSystemVolume } from './hooks/useSystemVolume';
79
30
  export { default as AudioManager } from './system';
80
31
 
81
32
  export * from './errors';
82
33
  export * from './system/types';
83
34
  export * from './types';
35
+ export { default as FilePreset } from './utils/filePresets';
36
+
37
+ // Notification System
38
+ export {
39
+ PlaybackNotificationManager,
40
+ RecordingNotificationManager,
41
+ } from './system/notification';
42
+
43
+ export {
44
+ NotificationManager,
45
+ PlaybackControlName,
46
+ PlaybackNotificationEventName,
47
+ PlaybackNotificationInfo,
48
+ RecordingControlName,
49
+ RecordingNotificationEventName,
50
+ RecordingNotificationInfo,
51
+ SimpleNotificationOptions,
52
+ } from './system/notification';
package/src/api.web.ts CHANGED
@@ -13,6 +13,7 @@ export { default as GainNode } from './web-core/GainNode';
13
13
  export { default as OscillatorNode } from './web-core/OscillatorNode';
14
14
  export { default as StereoPannerNode } from './web-core/StereoPannerNode';
15
15
  export { default as ConstantSourceNode } from './web-core/ConstantSourceNode';
16
+ export { default as ConvolverNode } from './web-core/ConvolverNode';
16
17
 
17
18
  export * from './web-core/custom';
18
19
 
@@ -31,11 +32,16 @@ export {
31
32
  IOSMode,
32
33
  IOSOption,
33
34
  SessionOptions,
34
- MediaState,
35
- LockScreenInfo,
36
35
  PermissionStatus,
37
36
  } from './system/types';
38
37
 
38
+ export {
39
+ PlaybackNotificationManager,
40
+ RecordingNotificationManager,
41
+ } from './web-system';
42
+
43
+ export * from './system/notification/types';
44
+
39
45
  export {
40
46
  IndexSizeError,
41
47
  InvalidAccessError,
@@ -51,4 +51,12 @@ export default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode
51
51
  public set onPositionChangedInterval(value: number) {
52
52
  (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval = value;
53
53
  }
54
+
55
+ public getLatency(): number {
56
+ return (
57
+ (this.node as IAudioBufferBaseSourceNode).getOutputLatency() +
58
+ (this.node as IAudioBufferBaseSourceNode).getInputLatency() *
59
+ (this.node as IAudioBufferBaseSourceNode).playbackRate.value
60
+ );
61
+ }
54
62
  }
@@ -24,14 +24,20 @@ export default class AudioBufferQueueSourceNode extends AudioBufferBaseSourceNod
24
24
  (this.node as IAudioBufferQueueSourceNode).clearBuffers();
25
25
  }
26
26
 
27
- public override start(when: number = 0): void {
27
+ public override start(when: number = 0, offset?: number): void {
28
28
  if (when < 0) {
29
29
  throw new RangeError(
30
30
  `when must be a finite non-negative number: ${when}`
31
31
  );
32
32
  }
33
33
 
34
- (this.node as IAudioBufferQueueSourceNode).start(when);
34
+ if (offset && offset < 0) {
35
+ throw new RangeError(
36
+ `offset must be a finite non-negative number: ${offset}`
37
+ );
38
+ }
39
+
40
+ (this.node as IAudioBufferQueueSourceNode).start(when, offset);
35
41
  }
36
42
 
37
43
  public override stop(when: number = 0): void {
@@ -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
  }