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

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
@@ -1,8 +1,8 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as Objective-C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C
4
4
  #import <NativeAudioPlayer.h>
5
- #else // when compiled as C++
5
+ #else // when compiled as C++
6
6
  typedef struct objc_object NativeAudioPlayer;
7
7
  #endif // __OBJC__
8
8
 
@@ -21,7 +21,7 @@ IOSAudioPlayer::IOSAudioPlayer(
21
21
  while (processedFrames < numFrames) {
22
22
  int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
23
23
 
24
- if (isRunning_.load()) {
24
+ if (isRunning_.load(std::memory_order_acquire)) {
25
25
  renderAudio_(audioBus_, framesToProcess);
26
26
  } else {
27
27
  audioBus_->zero();
@@ -57,13 +57,13 @@ bool IOSAudioPlayer::start()
57
57
  }
58
58
 
59
59
  bool success = [audioPlayer_ start];
60
- isRunning_.store(success);
60
+ isRunning_.store(success, std::memory_order_release);
61
61
  return success;
62
62
  }
63
63
 
64
64
  void IOSAudioPlayer::stop()
65
65
  {
66
- isRunning_.store(false);
66
+ isRunning_.store(false, std::memory_order_release);
67
67
  [audioPlayer_ stop];
68
68
  }
69
69
 
@@ -74,13 +74,13 @@ bool IOSAudioPlayer::resume()
74
74
  }
75
75
 
76
76
  bool success = [audioPlayer_ resume];
77
- isRunning_.store(success);
77
+ isRunning_.store(success, std::memory_order_release);
78
78
  return success;
79
79
  }
80
80
 
81
81
  void IOSAudioPlayer::suspend()
82
82
  {
83
- isRunning_.store(false);
83
+ isRunning_.store(false, std::memory_order_release);
84
84
  [audioPlayer_ suspend];
85
85
  }
86
86
 
@@ -88,7 +88,8 @@ bool IOSAudioPlayer::isRunning() const
88
88
  {
89
89
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
90
90
 
91
- return isRunning_.load() && [audioEngine isRunning];
91
+ return isRunning_.load(std::memory_order_acquire) &&
92
+ [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
92
93
  }
93
94
 
94
95
  void IOSAudioPlayer::cleanup()
@@ -1,22 +1,25 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C
4
4
  #import <NativeAudioRecorder.h>
5
5
  #else
6
- typedef struct objc_object AVAudioFile;
7
6
  typedef struct objc_object NSURL;
7
+ typedef struct objc_object AVAudioFile;
8
8
  typedef struct objc_object AudioBufferList;
9
9
  typedef struct objc_object NativeAudioRecorder;
10
10
  #endif // __OBJC__
11
11
 
12
12
  #include <audioapi/core/inputs/AudioRecorder.h>
13
+ #include <audioapi/utils/Result.hpp>
14
+
15
+ #include <mutex>
13
16
 
14
17
  namespace audioapi {
15
18
 
16
- class AudioBus;
17
- class CircularAudioArray;
18
- class IOSAudioFileWriter;
19
- class IOSRecorderCallback;
19
+ class FileWriter;
20
+ class RecorderCallback;
21
+ class RecorderAdapterNode;
22
+ class AudioFileProperties;
20
23
  class AudioEventHandlerRegistry;
21
24
 
22
25
  class IOSAudioRecorder : public AudioRecorder {
@@ -24,26 +27,31 @@ class IOSAudioRecorder : public AudioRecorder {
24
27
  IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
25
28
  ~IOSAudioRecorder() override;
26
29
 
27
- std::string start() override;
28
- std::tuple<std::string, double, double> stop() override;
30
+ Result<std::string, std::string> start() override;
31
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
29
32
 
30
- void enableFileOutput(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags, size_t androidFlags)
31
- override;
33
+ Result<std::string, std::string> enableFileOutput(
34
+ std::shared_ptr<AudioFileProperties> properties) override;
32
35
  void disableFileOutput() override;
33
36
 
37
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
38
+ void disconnect() override;
39
+
34
40
  void pause() override;
35
41
  void resume() override;
36
42
 
37
- void setOnAudioReadyCallback(float sampleRate, size_t bufferLength, size_t channelCount, uint64_t callbackId)
38
- override;
39
- void clearOnAudioReadyCallback() override;
43
+ bool isRecording() const override;
44
+ bool isPaused() const override;
45
+ bool isIdle() const override;
40
46
 
41
- double getCurrentDuration() const override;
47
+ Result<NoneType, std::string> setOnAudioReadyCallback(
48
+ float sampleRate,
49
+ size_t bufferLength,
50
+ int channelCount,
51
+ uint64_t callbackId) override;
52
+ void clearOnAudioReadyCallback() override;
42
53
 
43
- private:
44
- std::shared_ptr<IOSAudioFileWriter> fileWriter_;
45
- std::shared_ptr<IOSRecorderCallback> callback_;
46
- std::string filePath_{""};
54
+ protected:
47
55
  NativeAudioRecorder *nativeRecorder_;
48
56
  };
49
57
 
@@ -1,30 +1,61 @@
1
1
  #import <AVFoundation/AVFoundation.h>
2
+ #import <AudioEngine.h>
3
+ #import <AudioSessionManager.h>
2
4
  #import <Foundation/Foundation.h>
5
+
3
6
  #include <unordered_map>
4
7
 
8
+ #include <audioapi/core/sources/RecorderAdapterNode.h>
9
+ #include <audioapi/core/utils/AudioFileWriter.h>
5
10
  #include <audioapi/core/utils/Constants.h>
11
+ #include <audioapi/core/utils/Locker.h>
6
12
  #include <audioapi/dsp/VectorMath.h>
7
13
  #include <audioapi/events/AudioEventHandlerRegistry.h>
8
- #include <audioapi/ios/core/IOSAudioFileWriter.h>
9
14
  #include <audioapi/ios/core/IOSAudioRecorder.h>
10
- #include <audioapi/ios/core/IOSRecorderCallback.h>
15
+ #include <audioapi/ios/core/utils/IOSFileWriter.h>
16
+ #include <audioapi/ios/core/utils/IOSRecorderCallback.h>
17
+ #include <audioapi/ios/system/AudioEngine.h>
11
18
  #include <audioapi/utils/AudioArray.h>
12
19
  #include <audioapi/utils/AudioBus.h>
20
+ #include <audioapi/utils/AudioFileProperties.h>
13
21
  #include <audioapi/utils/CircularAudioArray.h>
14
22
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
23
+ #include <audioapi/utils/Result.hpp>
15
24
 
16
25
  namespace audioapi {
17
26
 
18
- IOSAudioRecorder::IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
19
- : AudioRecorder(audioEventHandlerRegistry), fileWriter_(nullptr)
27
+ /// @brief Constructs an IOSAudioRecorder instance.
28
+ /// This constructor initializes the receiver block and native side recorder wrapper (AVAudioSinkNode).
29
+ /// All other necessary fields (like buffers) are initialized in start() method.
30
+ /// This "method" should be called from the JS thread only.
31
+ /// @param audioEventHandlerRegistry Shared pointer to the AudioEventHandlerRegistry for event handling.
32
+ IOSAudioRecorder::IOSAudioRecorder(
33
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
34
+ : AudioRecorder(audioEventHandlerRegistry)
20
35
  {
21
36
  AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
22
37
  if (usesFileOutput()) {
23
- fileWriter_->writeAudioData(inputBuffer, numFrames);
38
+ if (auto lock = Locker::tryLock(fileWriterMutex_)) {
39
+ std::static_pointer_cast<IOSFileWriter>(fileWriter_)
40
+ ->writeAudioData(inputBuffer, numFrames);
41
+ }
24
42
  }
25
43
 
26
44
  if (usesCallback()) {
27
- callback_->receiveAudioData(inputBuffer, numFrames);
45
+ if (auto lock = Locker::tryLock(callbackMutex_)) {
46
+ std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)
47
+ ->receiveAudioData(inputBuffer, numFrames);
48
+ }
49
+ }
50
+
51
+ if (isConnected()) {
52
+ if (auto lock = Locker::tryLock(adapterNodeMutex_)) {
53
+ for (size_t channel = 0; channel < adapterNode_->channelCount_; ++channel) {
54
+ float *channelData = (float *)inputBuffer->mBuffers[channel].mData;
55
+
56
+ adapterNode_->buff_[channel]->write(channelData, numFrames);
57
+ }
58
+ }
28
59
  }
29
60
  };
30
61
 
@@ -36,84 +67,189 @@ IOSAudioRecorder::~IOSAudioRecorder()
36
67
  stop();
37
68
  [nativeRecorder_ cleanup];
38
69
  }
39
- std::string IOSAudioRecorder::start()
40
- {
41
- size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
42
70
 
71
+ /// @brief Starts the audio recording process and prepares necessary resources.
72
+ /// This method should be called from the JS thread only.
73
+ /// @returns Result containing the file path if recording started successfully, or an error message.
74
+ Result<std::string, std::string> IOSAudioRecorder::start()
75
+ {
43
76
  if (isRecording()) {
44
- return filePath_;
77
+ return Result<std::string, std::string>::Err("Recorder is already recording");
78
+ }
79
+
80
+ std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
81
+ AudioSessionManager *audioSessionManager = [AudioSessionManager sharedInstance];
82
+
83
+ if ([[audioSessionManager checkRecordingPermissions] isEqual:@"Denied"]) {
84
+ return Result<std::string, std::string>::Err("Microphone permissions are not granted");
85
+ }
86
+
87
+ // TODO: recorder should probably request the options if not set by user
88
+ // but lets handle that in another PR
89
+ if (![audioSessionManager isSessionActive]) {
90
+ return Result<std::string, std::string>::Err("Audio session is not active");
45
91
  }
46
92
 
93
+ // TODO: this is a bit ugly, and could be written slightly better
94
+ // we need to stop the audio engine if it's running, to be able to get
95
+ // proper input format values, otherwise the system my zero out the sample rate or channel count
96
+ // if input wasn't used yet
97
+ // (especially on simulators)
98
+ // Engine will be started again once the native recorder starts
99
+ [AudioEngine.sharedInstance stopIfNecessary];
100
+
101
+ // Estimate the maximum input buffer lengths that can be expected from the sink node
102
+ size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
103
+ auto inputFormat = [nativeRecorder_ getInputFormat];
104
+
47
105
  if (usesFileOutput()) {
48
- filePath_ = fileWriter_->openFile([nativeRecorder_ getInputFormat], maxInputBufferLength);
106
+ auto fileResult = std::static_pointer_cast<IOSFileWriter>(fileWriter_)
107
+ ->openFile(inputFormat, maxInputBufferLength);
108
+
109
+ if (fileResult.is_err()) {
110
+ return Result<std::string, std::string>::Err(
111
+ "Failed to open file for writing: " + fileResult.unwrap_err());
112
+ }
113
+
114
+ filePath_ = fileResult.unwrap();
49
115
  }
50
116
 
51
117
  if (usesCallback()) {
52
- callback_->prepare([nativeRecorder_ getInputFormat], maxInputBufferLength);
118
+ auto callbackResult = std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)
119
+ ->prepare(inputFormat, maxInputBufferLength);
120
+
121
+ if (callbackResult.is_err()) {
122
+ return Result<std::string, std::string>::Err(
123
+ "Failed to prepare callback: " + callbackResult.unwrap_err());
124
+ }
53
125
  }
54
126
 
55
127
  if (isConnected()) {
56
- // TODO: set adapter node properties?
128
+ // TODO: pass sample rate, in case conversion is necessary
129
+ adapterNode_->init(maxInputBufferLength, inputFormat.channelCount);
57
130
  }
58
131
 
59
132
  [nativeRecorder_ start];
60
- state_.store(RecorderState::Recording);
61
-
62
- return filePath_;
133
+ state_.store(RecorderState::Recording, std::memory_order_release);
134
+ return Result<std::string, std::string>::Ok(filePath_);
63
135
  }
64
136
 
65
- std::tuple<std::string, double, double> IOSAudioRecorder::stop()
137
+ /// @brief Stops the audio recording process and releases resources.
138
+ /// It finalizes any data receiver and closes the stream.
139
+ /// This method should be called from the JS thread only.
140
+ /// @returns Result containing a tuple of the output file path, size, and duration if stopped successfully, or an error message.
141
+ Result<std::tuple<std::string, double, double>, std::string> IOSAudioRecorder::stop()
66
142
  {
143
+ std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
144
+
67
145
  std::string filePath = filePath_;
68
146
  double outputFileSize = 0;
69
147
  double outputDuration = 0;
70
148
 
71
- if (!isRecording()) {
72
- return {filePath, 0, 0};
149
+ if (isIdle()) {
150
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
151
+ "Recorder is not in recording state.");
73
152
  }
74
153
 
154
+ state_.store(RecorderState::Idle, std::memory_order_release);
75
155
  [nativeRecorder_ stop];
76
- state_.store(RecorderState::Idle);
77
156
 
78
157
  if (usesFileOutput()) {
79
- auto [size, duration] = fileWriter_->closeFile();
80
- outputFileSize = size;
81
- outputDuration = duration;
158
+ auto fileResult = fileWriter_->closeFile();
159
+
160
+ if (fileResult.is_err()) {
161
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
162
+ "Failed to close file: " + fileResult.unwrap_err());
163
+ }
164
+
165
+ outputFileSize = std::get<0>(fileResult.unwrap());
166
+ outputDuration = std::get<1>(fileResult.unwrap());
82
167
  }
83
168
 
84
169
  if (usesCallback()) {
85
- callback_->cleanup();
170
+ dataCallback_->cleanup();
171
+ }
172
+
173
+ if (isConnected()) {
174
+ adapterNode_->cleanup();
86
175
  }
87
176
 
88
177
  filePath_ = "";
89
- return {filePath, outputFileSize, outputDuration};
178
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
179
+ std::make_tuple(filePath, outputFileSize, outputDuration));
90
180
  }
91
181
 
92
- void IOSAudioRecorder::enableFileOutput(
93
- float sampleRate,
94
- size_t channelCount,
95
- size_t bitRate,
96
- size_t iosFlags,
97
- size_t androidFlags)
182
+ /// @brief Enables file output for the recorder with specified properties.
183
+ /// If the recorder is already active, it will open the file for writing immediately.
184
+ /// This method should be called from the JS thread only.
185
+ /// @param properties Shared pointer to AudioFileProperties defining the output file format.
186
+ /// @returns Result containing the output file path if enabled successfully, or an error message.
187
+ Result<std::string, std::string> IOSAudioRecorder::enableFileOutput(
188
+ std::shared_ptr<AudioFileProperties> properties)
98
189
  {
99
- fileOutputEnabled_.store(true);
100
- fileWriter_ = std::make_shared<IOSAudioFileWriter>(sampleRate, channelCount, bitRate, iosFlags);
190
+ std::scoped_lock lock(fileWriterMutex_, errorCallbackMutex_);
191
+ fileWriter_ = std::make_shared<IOSFileWriter>(audioEventHandlerRegistry_, properties);
192
+
193
+ if (!isIdle()) {
194
+ auto result = std::static_pointer_cast<IOSFileWriter>(fileWriter_)
195
+ ->openFile([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
196
+
197
+ if (result.is_err()) {
198
+ return Result<std::string, std::string>::Err(
199
+ "Failed to open file for writing: " + result.unwrap_err());
200
+ }
201
+
202
+ filePath_ = result.unwrap();
203
+ }
204
+
205
+ fileWriter_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
206
+
207
+ fileOutputEnabled_.store(true, std::memory_order_release);
208
+ return Result<std::string, std::string>::Ok(filePath_);
101
209
  }
102
210
 
103
211
  void IOSAudioRecorder::disableFileOutput()
104
212
  {
105
- fileOutputEnabled_.store(false);
213
+ std::scoped_lock lock(fileWriterMutex_);
214
+ fileOutputEnabled_.store(false, std::memory_order_release);
106
215
  fileWriter_ = nullptr;
107
216
  }
108
217
 
218
+ /// @brief Connects a RecorderAdapterNode to the recorder for audio data routing.
219
+ /// If the recorder is already active, it will initialize the adapter node immediately.
220
+ /// This method should be called from the JS thread only.
221
+ /// @param node Shared pointer to the RecorderAdapterNode to connect.
222
+ void IOSAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node)
223
+ {
224
+ std::scoped_lock lock(adapterNodeMutex_);
225
+ adapterNode_ = node;
226
+
227
+ if (!isIdle()) {
228
+ adapterNode_->init(
229
+ [nativeRecorder_ getBufferSize], [nativeRecorder_ getInputFormat].channelCount);
230
+ }
231
+
232
+ isConnected_.store(true, std::memory_order_release);
233
+ }
234
+
235
+ /// @brief Disconnects the currently connected RecorderAdapterNode from the recorder.
236
+ /// If the recorder is currently active, it will stop routing audio data immediately.
237
+ /// This method should be called from the JS thread only.
238
+ void IOSAudioRecorder::disconnect()
239
+ {
240
+ std::scoped_lock lock(adapterNodeMutex_);
241
+ adapterNode_ = nullptr;
242
+ isConnected_.store(false, std::memory_order_release);
243
+ }
244
+
109
245
  void IOSAudioRecorder::pause()
110
246
  {
111
247
  if (!isRecording()) {
112
248
  return;
113
249
  }
114
250
 
115
- [nativeRecorder_ stop];
116
- state_.store(RecorderState::Paused);
251
+ [nativeRecorder_ pause];
252
+ state_.store(RecorderState::Paused, std::memory_order_release);
117
253
  }
118
254
 
119
255
  void IOSAudioRecorder::resume()
@@ -122,36 +258,90 @@ void IOSAudioRecorder::resume()
122
258
  return;
123
259
  }
124
260
 
125
- [nativeRecorder_ start];
126
- state_.store(RecorderState::Recording);
261
+ [nativeRecorder_ resume];
262
+ state_.store(RecorderState::Recording, std::memory_order_release);
127
263
  }
128
264
 
129
- void IOSAudioRecorder::setOnAudioReadyCallback(
130
- float sampleRate,
131
- size_t bufferLength,
132
- size_t channelCount,
133
- uint64_t callbackId)
265
+ /// @brief Checks if the recorder is currently recording.
266
+ /// Besides recorder internal state, it also check if the audio engine is running.
267
+ /// this helps with restarts after interruptions or other audio session changes.
268
+ /// This method can be called from any thread.
269
+ /// @returns True if recording, false otherwise.
270
+ bool IOSAudioRecorder::isRecording() const
134
271
  {
135
- callback_ = std::make_shared<IOSRecorderCallback>(
136
- audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
137
- callbackOutputEnabled_.store(true);
272
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
273
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
274
+ [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
138
275
  }
139
276
 
140
- void IOSAudioRecorder::clearOnAudioReadyCallback()
277
+ /// @brief Checks if the recorder is currently paused.
278
+ /// Besides recorder internal state, it also check if the audio engine is running.
279
+ /// this helps with restarts after interruptions or other audio session changes.
280
+ /// This method can be called from any thread.
281
+ /// @returns True if paused, false otherwise.
282
+ bool IOSAudioRecorder::isPaused() const
141
283
  {
142
- callbackOutputEnabled_.store(false);
143
- callback_ = nullptr;
284
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
285
+ auto currentState = state_.load(std::memory_order_acquire);
286
+
287
+ if (currentState == RecorderState::Idle) {
288
+ return false;
289
+ }
290
+
291
+ return currentState == RecorderState::Paused ||
292
+ [audioEngine getState] != AudioEngineState::AudioEngineStateRunning;
144
293
  }
145
294
 
146
- double IOSAudioRecorder::getCurrentDuration() const
295
+ /// @brief Checks if the recorder is currently idle (not recording or paused).
296
+ /// This method can be called from any thread.
297
+ /// @returns True if idle, false otherwise.
298
+ bool IOSAudioRecorder::isIdle() const
147
299
  {
148
- double duration = 0.0;
300
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
301
+ }
149
302
 
150
- if (usesFileOutput() && fileWriter_) {
151
- duration = fileWriter_->getCurrentDuration();
303
+ /// @brief Sets the callback to be invoked when audio data is ready.
304
+ /// If the recorder is already active, it will prepare the callback for receiving audio data immediately.
305
+ /// This method should be called from the JS thread only.
306
+ /// @param sampleRate Desired sample rate for the callback audio data.
307
+ /// @param bufferLength Desired buffer length in frames for the callback audio data.
308
+ /// @param channelCount Number of channels for the callback audio data.
309
+ /// @param callbackId Identifier for the JS callback to be invoked.
310
+ /// @returns Success status or Error status with message.
311
+ Result<NoneType, std::string> IOSAudioRecorder::setOnAudioReadyCallback(
312
+ float sampleRate,
313
+ size_t bufferLength,
314
+ int channelCount,
315
+ uint64_t callbackId)
316
+ {
317
+ std::scoped_lock lock(callbackMutex_, errorCallbackMutex_);
318
+
319
+ dataCallback_ = std::make_shared<IOSRecorderCallback>(
320
+ audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
321
+
322
+ if (!isIdle()) {
323
+ auto result = std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)
324
+ ->prepare([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
325
+
326
+ if (result.is_err()) {
327
+ return Result<NoneType, std::string>::Err(result.unwrap_err());
328
+ }
152
329
  }
153
330
 
154
- return duration;
331
+ dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
332
+
333
+ callbackOutputEnabled_.store(true, std::memory_order_release);
334
+ return Result<NoneType, std::string>::Ok(None);
335
+ }
336
+
337
+ /// @brief Clears the audio data callback.
338
+ /// If the recorder is currently active, it will stop invoking the callback immediately.
339
+ /// This method should be called from the JS thread only.
340
+ void IOSAudioRecorder::clearOnAudioReadyCallback()
341
+ {
342
+ std::scoped_lock lock(callbackMutex_);
343
+ callbackOutputEnabled_.store(false, std::memory_order_release);
344
+ dataCallback_ = nullptr;
155
345
  }
156
346
 
157
347
  } // namespace audioapi
@@ -15,7 +15,10 @@
15
15
 
16
16
  __weak typeof(self) weakSelf = self;
17
17
  self.renderBlock = ^OSStatus(
18
- BOOL *isSilence, const AudioTimeStamp *timestamp, AVAudioFrameCount frameCount, AudioBufferList *outputData) {
18
+ BOOL *isSilence,
19
+ const AudioTimeStamp *timestamp,
20
+ AVAudioFrameCount frameCount,
21
+ AudioBufferList *outputData) {
19
22
  if (outputData->mNumberBuffers != weakSelf.channelCount) {
20
23
  return kAudioServicesBadPropertySizeError;
21
24
  }
@@ -25,8 +28,10 @@
25
28
  return kAudioServicesNoError;
26
29
  };
27
30
 
28
- _format = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:self.sampleRate channels:self.channelCount];
29
- _sourceNode = [[AVAudioSourceNode alloc] initWithFormat:self.format renderBlock:self.renderBlock];
31
+ _format = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:self.sampleRate
32
+ channels:self.channelCount];
33
+ _sourceNode = [[AVAudioSourceNode alloc] initWithFormat:self.format
34
+ renderBlock:self.renderBlock];
30
35
  }
31
36
 
32
37
  return self;
@@ -34,37 +39,34 @@
34
39
 
35
40
  - (bool)start
36
41
  {
37
- NSLog(@"[AudioPlayer] start");
38
-
39
42
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
40
43
  assert(audioEngine != nil);
41
44
 
42
- // AudioEngine allows us to attach and connect nodes at runtime but with few limitations
43
- // in this case if it is the first player and recorder started the engine we need to restart.
44
- // It can be optimized by tracking if we haven't break rules of at runtime modifications from docs
45
+ // AudioEngine allows us to attach and connect nodes at runtime but with few
46
+ // limitations in this case if it is the first player and recorder started the
47
+ // engine we need to restart. It can be optimized by tracking if we haven't
48
+ // break rules of at runtime modifications from docs
45
49
  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc
46
50
  //
47
51
  // Currently we are restarting because we do not see any significant performance issue and case when
48
52
  // you will need to start and stop player very frequently
49
- [audioEngine stopEngine];
53
+ [audioEngine stopIfNecessary];
50
54
  self.sourceNodeId = [audioEngine attachSourceNode:self.sourceNode format:self.format];
51
55
  return [audioEngine startIfNecessary];
52
56
  }
53
57
 
54
58
  - (void)stop
55
59
  {
56
- NSLog(@"[AudioPlayer] stop");
57
-
58
60
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
59
61
  assert(audioEngine != nil);
62
+
60
63
  [audioEngine detachSourceNodeWithId:self.sourceNodeId];
61
- [audioEngine stopIfNecessary];
64
+ [audioEngine stopIfPossible];
62
65
  self.sourceNodeId = nil;
63
66
  }
64
67
 
65
68
  - (bool)resume
66
69
  {
67
- NSLog(@"[AudioPlayer] resume");
68
70
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
69
71
  assert(audioEngine != nil);
70
72
 
@@ -75,7 +77,8 @@
75
77
  {
76
78
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
77
79
  assert(audioEngine != nil);
78
- [audioEngine pauseEngine:self.sourceNodeId];
80
+
81
+ [audioEngine pauseIfNecessary];
79
82
  }
80
83
 
81
84
  - (void)cleanup
@@ -21,6 +21,10 @@ typedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFr
21
21
 
22
22
  - (void)stop;
23
23
 
24
+ - (void)pause;
25
+
26
+ - (void)resume;
27
+
24
28
  - (void)cleanup;
25
29
 
26
30
  @end