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
@@ -2,39 +2,60 @@
2
2
  #include <audioapi/android/core/AndroidAudioRecorder.h>
3
3
  #include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
4
4
  #include <audioapi/android/core/utils/AndroidRecorderCallback.h>
5
+
6
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
5
7
  #include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>
8
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
9
+
6
10
  #include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
7
11
  #include <audioapi/core/sources/RecorderAdapterNode.h>
8
12
  #include <audioapi/core/utils/Constants.h>
13
+ #include <audioapi/core/utils/Locker.h>
9
14
  #include <audioapi/events/AudioEventHandlerRegistry.h>
10
15
  #include <audioapi/utils/AudioArray.h>
11
16
  #include <audioapi/utils/AudioBus.h>
17
+ #include <audioapi/utils/AudioFileProperties.h>
12
18
  #include <audioapi/utils/CircularAudioArray.h>
13
19
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
14
20
 
21
+ #include <memory>
22
+ #include <string>
23
+
15
24
  namespace audioapi {
16
25
 
17
26
  AndroidAudioRecorder::AndroidAudioRecorder(
18
27
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
19
- : AudioRecorder(audioEventHandlerRegistry) {
20
- AudioStreamBuilder builder;
21
-
22
- builder.setSharingMode(SharingMode::Exclusive)
23
- ->setDirection(Direction::Input)
24
- ->setFormat(AudioFormat::Float)
25
- ->setFormatConversionAllowed(true)
26
- ->setPerformanceMode(PerformanceMode::None)
27
- ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
28
- ->setDataCallback(this)
29
- ->openStream(mStream_);
30
-
31
- streamSampleRate_ = mStream_->getSampleRate();
32
- streamChannelCount_ = mStream_->getChannelCount();
33
- streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
28
+ : AudioRecorder(audioEventHandlerRegistry),
29
+ streamSampleRate_(0.0),
30
+ streamChannelCount_(0),
31
+ streamMaxBufferSizeInFrames_(0) {
34
32
  nativeAudioRecorder_ = jni::make_global(NativeAudioRecorder::create());
35
33
  }
36
34
 
35
+ /// @brief Destructor ensures that the audio stream and each output type are closed and flushed up remaining data.
36
+ /// TODO: Possibly locks here are not necessary, but we might have an issue with oboe having raw pointer to the
37
+ /// recorder (and player) instances, thus creating race conditions during destruction.
38
+ /// callable from the JS thread only (i hope).
37
39
  AndroidAudioRecorder::~AndroidAudioRecorder() {
40
+ {
41
+ std::scoped_lock dtorLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
42
+
43
+ if (usesFileOutput()) {
44
+ fileOutputEnabled_.store(false, std::memory_order_release);
45
+ fileWriter_->closeFile();
46
+ }
47
+
48
+ if (usesCallback()) {
49
+ callbackOutputEnabled_.store(false, std::memory_order_release);
50
+ dataCallback_->cleanup();
51
+ }
52
+
53
+ if (isConnected()) {
54
+ isConnected_.store(false, std::memory_order_release);
55
+ adapterNode_->cleanup();
56
+ }
57
+ }
58
+
38
59
  nativeAudioRecorder_.release();
39
60
 
40
61
  if (mStream_) {
@@ -44,162 +65,372 @@ AndroidAudioRecorder::~AndroidAudioRecorder() {
44
65
  }
45
66
  }
46
67
 
47
- std::string AndroidAudioRecorder::start() {
68
+ /// @brief Creates and opens the Oboe audio input stream for recording.
69
+ /// calculates the "native" or hardware stream parameters for other interfaces
70
+ /// to use.
71
+ /// Callable from the JS thread only.
72
+ /// @returns Success status or Error status with message.
73
+ Result<NoneType, std::string> AndroidAudioRecorder::openAudioStream() {
74
+ if (mStream_) {
75
+ return Result<NoneType, std::string>::Ok(None);
76
+ }
77
+
78
+ oboe::AudioStreamBuilder builder;
79
+ builder.setSharingMode(oboe::SharingMode::Exclusive)
80
+ ->setDirection(oboe::Direction::Input)
81
+ ->setFormat(oboe::AudioFormat::Float)
82
+ ->setFormatConversionAllowed(true)
83
+ ->setPerformanceMode(oboe::PerformanceMode::None)
84
+ ->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)
85
+ ->setDataCallback(this)
86
+ ->setErrorCallback(this);
87
+
88
+ auto result = builder.openStream(mStream_);
89
+
90
+ if (result != oboe::Result::OK || mStream_ == nullptr) {
91
+ return Result<NoneType, std::string>::Err(
92
+ "Failed to open audio stream: " + std::string(oboe::convertToText(result)));
93
+ }
94
+
95
+ streamSampleRate_ = static_cast<float>(mStream_->getSampleRate());
96
+ streamChannelCount_ = mStream_->getChannelCount();
97
+ streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
98
+
99
+ return Result<NoneType, std::string>::Ok(None);
100
+ }
101
+
102
+ /// @brief prepares and starts the audio recording process.
103
+ /// If audio stream is opened correctly, it will set up any output configured
104
+ /// (file writing, callback, adapter node) and start the stream.
105
+ /// This method should be called from the JS thread only.
106
+ /// NOTE: I've noticed some possibly invalid file paths being returned on Android,
107
+ /// RN side requires their "file://" prefix, but sometimes it returned raw path.
108
+ /// Most likely this was due to alpha version mistakes, but in case of problems leaving this here. (ㆆ _ ㆆ)
109
+ /// @returns On success, returns the file URI where the recording is being saved (if file output is enabled).
110
+ Result<std::string, std::string> AndroidAudioRecorder::start() {
111
+ std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
112
+
48
113
  if (isRecording()) {
49
- return filePath_;
114
+ return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
115
+ }
116
+
117
+ auto streamResult = openAudioStream();
118
+
119
+ if (!streamResult.is_ok()) {
120
+ return Result<std::string, std::string>::Err(streamResult.unwrap_err());
50
121
  }
51
122
 
52
123
  if (!mStream_ || !nativeAudioRecorder_) {
53
- __android_log_print(
54
- ANDROID_LOG_ERROR,
55
- "AndroidAudioRecorder",
56
- "Audio stream is not initialized.\n");
57
- return filePath_;
124
+ return Result<std::string, std::string>::Err("Audio stream is not initialized.");
58
125
  }
59
126
 
60
127
  if (usesFileOutput()) {
61
- filePath_ = fileWriter_->openFile(
62
- streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
128
+ auto fileResult =
129
+ std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
130
+ ->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
131
+
132
+ if (!fileResult.is_ok()) {
133
+ return Result<std::string, std::string>::Err(
134
+ "Failed to open file for writing: " + fileResult.unwrap_err());
135
+ }
136
+
137
+ filePath_ = fileResult.unwrap();
63
138
  }
64
139
 
65
140
  if (usesCallback()) {
66
- // TODO: create circular buffer and converter?
67
- callback_->prepare(
68
- streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
141
+ std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
142
+ ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
69
143
  }
70
144
 
71
145
  if (isConnected()) {
72
- // TODO: set adapter node properties?
146
+ adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
73
147
  }
74
148
 
75
- nativeAudioRecorder_->start();
76
- mStream_->requestStart();
77
- state_.store(RecorderState::Recording);
149
+ auto result = mStream_->requestStart();
150
+
151
+ if (result != oboe::Result::OK) {
152
+ return Result<std::string, std::string>::Err(
153
+ "Failed to start stream: " + std::string(oboe::convertToText(result)));
154
+ }
78
155
 
79
- return filePath_;
156
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->start(); });
157
+
158
+ state_.store(RecorderState::Recording, std::memory_order_release);
159
+ return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
80
160
  }
81
161
 
82
- std::tuple<std::string, double, double> AndroidAudioRecorder::stop() {
83
- std::string filePath = filePath_;
162
+ /// @brief Stops the audio stream and finalizes any output (file writing, callback, adapter node).
163
+ /// This method should be called from the JS thread only.
164
+ /// @returns On success, returns the file URI, size in MB and duration in seconds of the recorded file (if file output is enabled).
165
+ /// NOTE: due to the file access nature on Android, the size might sometimes be zeroed (really long files).
166
+ Result<std::tuple<std::string, double, double>, std::string> AndroidAudioRecorder::stop() {
167
+ std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
168
+
169
+ std::string filePath = std::format("file://{}", filePath_);
84
170
  double outputFileSize = 0.0;
85
171
  double outputDuration = 0.0;
86
172
 
87
173
  if (!isRecording()) {
88
- return {filePath_, 0.0, 0.0};
174
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
175
+ "Recorder is not in recording state.");
89
176
  }
90
177
 
91
178
  if (!mStream_ || !nativeAudioRecorder_) {
92
- __android_log_print(
93
- ANDROID_LOG_ERROR,
94
- "AndroidAudioRecorder",
95
- "Audio stream is not initialized.\n");
96
- return {filePath_, 0.0, 0.0};
179
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
180
+ "Audio stream is not initialized.");
97
181
  }
98
182
 
99
- nativeAudioRecorder_->stop();
183
+ state_.store(RecorderState::Idle, std::memory_order_release);
184
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
100
185
  mStream_->requestStop();
101
- state_.store(RecorderState::Idle);
102
186
 
103
187
  if (usesFileOutput()) {
104
- auto [size, duration] = fileWriter_->closeFile();
105
- outputFileSize = size;
106
- outputDuration = duration;
188
+ auto fileResult = fileWriter_->closeFile();
189
+
190
+ if (!fileResult.is_ok()) {
191
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
192
+ "Failed to close file: " + fileResult.unwrap_err());
193
+ }
194
+
195
+ outputFileSize = std::get<0>(fileResult.unwrap());
196
+ outputDuration = std::get<1>(fileResult.unwrap());
107
197
  }
108
198
 
109
199
  if (usesCallback()) {
110
- callback_->cleanup();
200
+ dataCallback_->cleanup();
201
+ }
202
+
203
+ if (isConnected()) {
204
+ adapterNode_->cleanup();
111
205
  }
112
206
 
113
207
  filePath_ = "";
114
- return {filePath, outputFileSize, outputDuration};
208
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
209
+ {filePath, outputFileSize, outputDuration});
115
210
  }
116
211
 
117
- void AndroidAudioRecorder::enableFileOutput(
118
- float sampleRate,
119
- size_t channelCount,
120
- size_t bitRate,
121
- size_t iosFlags,
122
- size_t androidFlags) {
123
- uint8_t format = static_cast<uint8_t>(androidFlags & 0xF);
124
-
125
- if (format == 1) {
126
- fileWriter_ = std::make_shared<MiniAudioFileWriter>(
127
- sampleRate, channelCount, bitRate, androidFlags);
212
+ /// @brief Enables file output for the recorder with the specified properties.
213
+ /// If the recorder is already active, it will prepare and open the file for writing immediately.
214
+ /// Due to the nature of RN this might be called multiple times during recording session (especially during development),
215
+ /// thus the requirement of handling the "already active" case.
216
+ /// This method should be called from the JS thread only.
217
+ /// @param properties Properties defining the audio file format and encoding options.
218
+ /// @returns On success, returns the file URI where the recording is being saved, otherwise returns an error message.
219
+ Result<std::string, std::string> AndroidAudioRecorder::enableFileOutput(
220
+ std::shared_ptr<AudioFileProperties> properties) {
221
+ std::scoped_lock fileWriterLock(fileWriterMutex_);
222
+
223
+ if (properties->format == AudioFileProperties::Format::WAV) {
224
+ fileWriter_ = std::make_shared<MiniAudioFileWriter>(audioEventHandlerRegistry_, properties);
128
225
  } else {
129
- fileWriter_ = std::make_shared<FFmpegAudioFileWriter>(
130
- sampleRate, channelCount, bitRate, androidFlags);
226
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
227
+ fileWriter_ = std::make_shared<android::ffmpeg::FFmpegAudioFileWriter>(
228
+ audioEventHandlerRegistry_, properties);
229
+ #else
230
+ return Result<std::string, std::string>::Err(
231
+ "FFmpeg backend is disabled. Cannot create file writer for the requested format. Use WAV format instead.");
232
+ #endif
233
+ }
234
+
235
+ if (!isIdle()) {
236
+ auto fileResult =
237
+ std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
238
+ ->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
239
+
240
+ if (!fileResult.is_ok()) {
241
+ return Result<std::string, std::string>::Err(
242
+ "Failed to open file for writing: " + fileResult.unwrap_err());
243
+ }
244
+
245
+ filePath_ = fileResult.unwrap();
131
246
  }
132
247
 
133
- fileOutputEnabled_.store(true);
248
+ fileOutputEnabled_.store(true, std::memory_order_release);
249
+ return Result<std::string, std::string>::Ok(filePath_);
134
250
  }
135
251
 
252
+ /// @brief Disables file output for the recorder.
253
+ /// If the recorder is currently active, it will finalize and close the file immediately.
254
+ /// This method should be called from the JS thread only.
136
255
  void AndroidAudioRecorder::disableFileOutput() {
137
- fileOutputEnabled_.store(false);
256
+ std::scoped_lock fileWriterLock(fileWriterMutex_);
257
+ fileOutputEnabled_.store(false, std::memory_order_release);
138
258
  fileWriter_ = nullptr;
139
259
  }
140
260
 
261
+ /// @brief Pauses the audio recording stream.
262
+ /// For session without active file output, this method acts same as stop().
263
+ /// This method should be called from the JS thread only.
141
264
  void AndroidAudioRecorder::pause() {
142
265
  if (!isRecording()) {
143
266
  return;
144
267
  }
145
268
 
146
269
  mStream_->pause(0);
147
- state_.store(RecorderState::Paused);
270
+ state_.store(RecorderState::Paused, std::memory_order_release);
148
271
  }
149
272
 
273
+ /// @brief Resumes the audio recording stream if it was previously paused.
274
+ /// This method should be called from the JS thread only.
150
275
  void AndroidAudioRecorder::resume() {
151
276
  if (!isPaused()) {
152
277
  return;
153
278
  }
154
279
 
155
280
  mStream_->start(0);
156
- state_.store(RecorderState::Recording);
281
+ state_.store(RecorderState::Recording, std::memory_order_release);
157
282
  }
158
283
 
159
- void AndroidAudioRecorder::setOnAudioReadyCallback(
284
+ /// @brief Sets the callback to be invoked when audio data is ready.
285
+ /// If the recorder is already active, it will prepare the callback for receiving audio data immediately.
286
+ /// This method should be called from the JS thread only.
287
+ /// @param sampleRate Desired sample rate for the callback audio data.
288
+ /// @param bufferLength Desired buffer length in frames for the callback audio data.
289
+ /// @param channelCount Number of channels for the callback audio data.
290
+ /// @param callbackId Identifier for the JS callback to be invoked.
291
+ /// @returns Success status or Error status with message.
292
+ Result<NoneType, std::string> AndroidAudioRecorder::setOnAudioReadyCallback(
160
293
  float sampleRate,
161
294
  size_t bufferLength,
162
- size_t channelCount,
295
+ int channelCount,
163
296
  uint64_t callbackId) {
164
- callback_ = std::make_shared<AndroidRecorderCallback>(
165
- audioEventHandlerRegistry_,
166
- sampleRate,
167
- bufferLength,
168
- channelCount,
169
- callbackId);
170
- callbackOutputEnabled_.store(true);
297
+ std::scoped_lock callbackLock(callbackMutex_);
298
+ dataCallback_ = std::make_shared<AndroidRecorderCallback>(
299
+ audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
300
+
301
+ if (!isIdle()) {
302
+ std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
303
+ ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
304
+ }
305
+
306
+ callbackOutputEnabled_.store(true, std::memory_order_release);
307
+
308
+ return Result<NoneType, std::string>::Ok(None);
171
309
  }
172
310
 
311
+ /// @brief Clears the audio data callback.
312
+ /// If the recorder is currently active, it will stop invoking the callback immediately.
313
+ /// This method should be called from the JS thread only.
173
314
  void AndroidAudioRecorder::clearOnAudioReadyCallback() {
174
- callbackOutputEnabled_.store(false);
175
- callback_ = nullptr;
315
+ std::scoped_lock callbackLock(callbackMutex_);
316
+ callbackOutputEnabled_.store(false, std::memory_order_release);
317
+ dataCallback_ = nullptr;
176
318
  }
177
319
 
178
- DataCallbackResult AndroidAudioRecorder::onAudioReady(
320
+ /// @brief Connects a RecorderAdapterNode to the recorder for audio data routing.
321
+ /// If the recorder is already active, it will initialize the adapter node immediately.
322
+ /// This method should be called from the JS thread only.
323
+ /// @param node Shared pointer to the RecorderAdapterNode to connect.
324
+ void AndroidAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node) {
325
+ std::scoped_lock adapterLock(adapterNodeMutex_);
326
+ adapterNode_ = node;
327
+ deinterleavingBuffer_ = std::make_shared<AudioArray>(streamMaxBufferSizeInFrames_);
328
+
329
+ if (!isIdle()) {
330
+ adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
331
+ }
332
+
333
+ isConnected_.store(true, std::memory_order_release);
334
+ }
335
+
336
+ /// @brief Disconnects the currently connected RecorderAdapterNode from the recorder.
337
+ /// If the recorder is currently active, it will stop routing audio data immediately.
338
+ /// This method should be called from the JS thread only.
339
+ void AndroidAudioRecorder::disconnect() {
340
+ std::scoped_lock adapterLock(adapterNodeMutex_);
341
+ isConnected_.store(false, std::memory_order_release);
342
+ deinterleavingBuffer_ = nullptr;
343
+ adapterNode_ = nullptr;
344
+ }
345
+
346
+ /// @brief onAudioReady callback that is invoked by the Oboe stream when new audio data is available.
347
+ /// This method runs on the audio thread.
348
+ /// It routes the audio data to the enabled outputs: file writer, callback, and adapter node.
349
+ /// For safety measures (check note about RN of enableFileOutput), each output is protected by a lock
350
+ /// additionally to the enabled checks.
351
+ /// @param oboeStream Pointer to the Oboe audio stream.
352
+ /// @param audioData Pointer to the audio data buffer (interleaved float samples).
353
+ /// @param numFrames Number of audio frames in the data buffer.
354
+ /// @returns DataCallbackResult indicating whether to continue or stop the stream.
355
+ oboe::DataCallbackResult AndroidAudioRecorder::onAudioReady(
179
356
  oboe::AudioStream *oboeStream,
180
357
  void *audioData,
181
358
  int32_t numFrames) {
182
359
  if (isPaused()) {
183
- return DataCallbackResult::Continue;
360
+ return oboe::DataCallbackResult::Continue;
184
361
  }
185
362
 
186
363
  if (usesFileOutput()) {
187
- fileWriter_->writeAudioData(audioData, numFrames);
364
+ if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {
365
+ std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
366
+ ->writeAudioData(audioData, numFrames);
367
+ }
188
368
  }
189
369
 
190
370
  if (usesCallback()) {
191
- callback_->receiveAudioData(audioData, numFrames);
371
+ if (auto callbackLock = Locker::tryLock(callbackMutex_)) {
372
+ std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
373
+ ->receiveAudioData(audioData, numFrames);
374
+ }
192
375
  }
193
376
 
194
- return DataCallbackResult::Continue;
377
+ if (isConnected()) {
378
+ if (auto adapterLock = Locker::tryLock(adapterNodeMutex_)) {
379
+ for (int channel = 0; channel < streamChannelCount_; ++channel) {
380
+ for (int frame = 0; frame < numFrames; ++frame) {
381
+ deinterleavingBuffer_->getData()[frame] =
382
+ static_cast<float *>(audioData)[frame * streamChannelCount_ + channel];
383
+ }
384
+
385
+ adapterNode_->buff_[channel]->write(deinterleavingBuffer_->getData(), numFrames);
386
+ }
387
+ }
388
+ }
389
+
390
+ return oboe::DataCallbackResult::Continue;
195
391
  }
196
392
 
197
- double AndroidAudioRecorder::getCurrentDuration() const {
198
- if (usesFileOutput()) {
199
- return fileWriter_->getCurrentDuration();
393
+ bool AndroidAudioRecorder::isRecording() const {
394
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
395
+ mStream_->getState() == oboe::StreamState::Started;
396
+ }
397
+
398
+ bool AndroidAudioRecorder::isPaused() const {
399
+ return state_.load(std::memory_order_acquire) == RecorderState::Paused;
400
+ }
401
+
402
+ bool AndroidAudioRecorder::isIdle() const {
403
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
404
+ }
405
+
406
+ void AndroidAudioRecorder::cleanup() {
407
+ state_.store(RecorderState::Idle, std::memory_order_release);
408
+
409
+ if (mStream_) {
410
+ mStream_->close();
411
+ mStream_.reset();
200
412
  }
413
+ }
201
414
 
202
- return 0.0;
415
+ /// @brief onError callback that is invoked by the Oboe stream when an error occurs.
416
+ /// This method runs on the audio thread.
417
+ /// If the error is a disconnection, it attempts to reopen the stream and resume recording.
418
+ /// @param oboeStream Pointer to the Oboe audio stream.
419
+ /// @param error The oboe::Result error code.
420
+ void AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
421
+ if (error == oboe::Result::ErrorDisconnected) {
422
+ cleanup();
423
+
424
+ auto streamResult = openAudioStream();
425
+
426
+ if (!streamResult.is_ok()) {
427
+ // TODO: call error callback
428
+ return;
429
+ }
430
+
431
+ mStream_->requestStart();
432
+ state_.store(RecorderState::Recording, std::memory_order_release);
433
+ }
203
434
  }
204
435
 
205
436
  } // namespace audioapi
@@ -1,67 +1,67 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/core/inputs/AudioRecorder.h>
4
-
5
4
  #include <oboe/Oboe.h>
6
5
  #include <functional>
7
6
  #include <memory>
8
7
  #include <string>
9
8
  #include <tuple>
10
-
9
+ #include <mutex>
10
+ #include <audioapi/utils/Result.hpp>
11
11
  #include <audioapi/android/core/NativeAudioRecorder.hpp>
12
12
 
13
13
  namespace audioapi {
14
14
 
15
- using namespace oboe;
16
-
17
15
  class AudioBus;
16
+ class AudioArray;
18
17
  class CircularAudioArray;
18
+ class AudioFileProperties;
19
19
  class AndroidRecorderCallback;
20
20
  class AndroidFileWriterBackend;
21
21
  class AudioEventHandlerRegistry;
22
22
 
23
- class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorder {
23
+ class AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {
24
24
  public:
25
25
  explicit AndroidAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
26
26
  ~AndroidAudioRecorder() override;
27
+ void cleanup();
27
28
 
28
- std::string start() override;
29
- std::tuple<std::string, double, double> stop() override;
29
+ Result<std::string, std::string> start() override;
30
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
30
31
 
31
- void enableFileOutput(
32
- float sampleRate,
33
- size_t channelCount,
34
- size_t bitRate,
35
- size_t iosFlags,
36
- size_t androidFlags) override;
32
+ Result<std::string, std::string> enableFileOutput(std::shared_ptr<AudioFileProperties> properties) override;
37
33
  void disableFileOutput() override;
38
34
 
39
35
  void pause() override;
40
36
  void resume() override;
37
+ bool isRecording() const override;
38
+ bool isPaused() const override;
39
+ bool isIdle() const override;
41
40
 
42
- void setOnAudioReadyCallback(float sampleRate, size_t bufferLength, size_t channelCount, uint64_t callbackId)
41
+ Result<NoneType, std::string> setOnAudioReadyCallback(float sampleRate, size_t bufferLength, int channelCount, uint64_t callbackId)
43
42
  override;
44
43
  void clearOnAudioReadyCallback() override;
45
44
 
46
- double getCurrentDuration() const override;
45
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
46
+ void disconnect() override;
47
47
 
48
- DataCallbackResult onAudioReady(
49
- AudioStream *oboeStream,
48
+ oboe::DataCallbackResult onAudioReady(
49
+ oboe::AudioStream *oboeStream,
50
50
  void *audioData,
51
51
  int32_t numFrames) override;
52
+ void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;
52
53
 
53
54
  private:
54
- std::string filePath_;
55
- std::shared_ptr<AudioStream> mStream_;
55
+ std::shared_ptr<AudioArray> deinterleavingBuffer_;
56
56
 
57
- std::shared_ptr<AndroidFileWriterBackend> fileWriter_;
58
- std::shared_ptr<AndroidRecorderCallback> callback_;
59
-
60
- int32_t streamSampleRate_;
57
+ float streamSampleRate_;
61
58
  int32_t streamChannelCount_;
62
59
  int32_t streamMaxBufferSizeInFrames_;
63
60
 
64
61
  facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
62
+
63
+ std::shared_ptr<oboe::AudioStream> mStream_;
64
+ Result<NoneType, std::string> openAudioStream();
65
65
  };
66
66
 
67
67
  } // namespace audioapi