react-native-audio-api 0.11.0-alpha.0 → 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 +353 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +32 -19
  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 +15 -15
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +170 -0
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +46 -0
  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 +366 -304
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +49 -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 +154 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +10 -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 +109 -44
  85. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -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 +39 -108
  138. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +47 -46
  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 +28 -11
  285. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +280 -45
  286. package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
  287. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  288. package/ios/audioapi/ios/core/NativeAudioRecorder.m +74 -6
  289. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -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/utils/IOSFileWriter.h +53 -0
  293. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
  294. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  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 +56 -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 +57 -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 +16 -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 +36 -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 +58 -45
  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 +86 -84
  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 +55 -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 +61 -46
  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 -35
  597. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  598. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  599. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  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,40 +1,61 @@
1
1
  #include <android/log.h>
2
2
  #include <audioapi/android/core/AndroidAudioRecorder.h>
3
3
  #include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
4
+ #include <audioapi/android/core/utils/AndroidRecorderCallback.h>
5
+
6
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
4
7
  #include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>
8
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
9
+
5
10
  #include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
6
11
  #include <audioapi/core/sources/RecorderAdapterNode.h>
7
12
  #include <audioapi/core/utils/Constants.h>
13
+ #include <audioapi/core/utils/Locker.h>
8
14
  #include <audioapi/events/AudioEventHandlerRegistry.h>
9
15
  #include <audioapi/utils/AudioArray.h>
10
16
  #include <audioapi/utils/AudioBus.h>
17
+ #include <audioapi/utils/AudioFileProperties.h>
11
18
  #include <audioapi/utils/CircularAudioArray.h>
12
19
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
13
20
 
21
+ #include <memory>
22
+ #include <string>
23
+
14
24
  namespace audioapi {
15
25
 
16
26
  AndroidAudioRecorder::AndroidAudioRecorder(
17
27
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
18
- : AudioRecorder(audioEventHandlerRegistry) {
19
- AudioStreamBuilder builder;
20
-
21
- builder.setSharingMode(SharingMode::Exclusive)
22
- ->setDirection(Direction::Input)
23
- ->setFormat(AudioFormat::Float)
24
- ->setFormatConversionAllowed(true)
25
- ->setPerformanceMode(PerformanceMode::None)
26
- ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
27
- ->setDataCallback(this)
28
- ->openStream(mStream_);
29
-
30
- streamSampleRate_ = mStream_->getSampleRate();
31
- streamChannelCount_ = mStream_->getChannelCount();
32
- streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
33
-
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,114 +65,372 @@ AndroidAudioRecorder::~AndroidAudioRecorder() {
44
65
  }
45
66
  }
46
67
 
47
- void 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;
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;
124
+ return Result<std::string, std::string>::Err("Audio stream is not initialized.");
58
125
  }
59
126
 
60
127
  if (usesFileOutput()) {
61
- 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?
141
+ std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
142
+ ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
67
143
  }
68
144
 
69
145
  if (isConnected()) {
70
- // TODO: set adapter node properties?
146
+ adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
147
+ }
148
+
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)));
71
154
  }
72
155
 
73
- nativeAudioRecorder_->start();
74
- mStream_->requestStart();
75
- isRunning_.store(true);
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_));
76
160
  }
77
161
 
78
- std::string AndroidAudioRecorder::stop() {
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_);
170
+ double outputFileSize = 0.0;
171
+ double outputDuration = 0.0;
172
+
79
173
  if (!isRecording()) {
80
- return "";
174
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
175
+ "Recorder is not in recording state.");
81
176
  }
82
177
 
83
178
  if (!mStream_ || !nativeAudioRecorder_) {
84
- __android_log_print(
85
- ANDROID_LOG_ERROR,
86
- "AndroidAudioRecorder",
87
- "Audio stream is not initialized.\n");
88
- return "";
179
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
180
+ "Audio stream is not initialized.");
89
181
  }
90
182
 
91
- nativeAudioRecorder_->stop();
183
+ state_.store(RecorderState::Idle, std::memory_order_release);
184
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
92
185
  mStream_->requestStop();
93
- isRunning_.store(false);
94
-
95
- // TODO: sendRemainingData() ?
96
186
 
97
187
  if (usesFileOutput()) {
98
- return fileWriter_->closeFile();
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());
197
+ }
198
+
199
+ if (usesCallback()) {
200
+ dataCallback_->cleanup();
201
+ }
202
+
203
+ if (isConnected()) {
204
+ adapterNode_->cleanup();
99
205
  }
100
206
 
101
- return "";
207
+ filePath_ = "";
208
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
209
+ {filePath, outputFileSize, outputDuration});
102
210
  }
103
211
 
104
- void AndroidAudioRecorder::enableFileOutput(
105
- float sampleRate,
106
- size_t channelCount,
107
- size_t bitRate,
108
- size_t iosFlags,
109
- size_t androidFlags) {
110
- uint8_t format = static_cast<uint8_t>(androidFlags & 0xF);
111
-
112
- if (format == 1) {
113
- fileWriter_ = std::make_shared<MiniAudioFileWriter>(
114
- 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);
115
225
  } else {
116
- fileWriter_ = std::make_shared<FFmpegAudioFileWriter>(
117
- 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();
118
246
  }
119
247
 
120
- fileOutputEnabled_.store(true);
248
+ fileOutputEnabled_.store(true, std::memory_order_release);
249
+ return Result<std::string, std::string>::Ok(filePath_);
121
250
  }
122
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.
123
255
  void AndroidAudioRecorder::disableFileOutput() {
124
- fileOutputEnabled_.store(false);
256
+ std::scoped_lock fileWriterLock(fileWriterMutex_);
257
+ fileOutputEnabled_.store(false, std::memory_order_release);
125
258
  fileWriter_ = nullptr;
126
259
  }
127
260
 
128
- void AndroidAudioRecorder::pause() {}
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.
264
+ void AndroidAudioRecorder::pause() {
265
+ if (!isRecording()) {
266
+ return;
267
+ }
268
+
269
+ mStream_->pause(0);
270
+ state_.store(RecorderState::Paused, std::memory_order_release);
271
+ }
272
+
273
+ /// @brief Resumes the audio recording stream if it was previously paused.
274
+ /// This method should be called from the JS thread only.
275
+ void AndroidAudioRecorder::resume() {
276
+ if (!isPaused()) {
277
+ return;
278
+ }
279
+
280
+ mStream_->start(0);
281
+ state_.store(RecorderState::Recording, std::memory_order_release);
282
+ }
283
+
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(
293
+ float sampleRate,
294
+ size_t bufferLength,
295
+ int channelCount,
296
+ uint64_t callbackId) {
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);
129
307
 
130
- void AndroidAudioRecorder::resume() {}
308
+ return Result<NoneType, std::string>::Ok(None);
309
+ }
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.
314
+ void AndroidAudioRecorder::clearOnAudioReadyCallback() {
315
+ std::scoped_lock callbackLock(callbackMutex_);
316
+ callbackOutputEnabled_.store(false, std::memory_order_release);
317
+ dataCallback_ = nullptr;
318
+ }
319
+
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
+ }
131
345
 
132
- DataCallbackResult AndroidAudioRecorder::onAudioReady(
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(
133
356
  oboe::AudioStream *oboeStream,
134
357
  void *audioData,
135
358
  int32_t numFrames) {
359
+ if (isPaused()) {
360
+ return oboe::DataCallbackResult::Continue;
361
+ }
362
+
136
363
  if (usesFileOutput()) {
137
- fileWriter_->writeAudioData(audioData, numFrames);
364
+ if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {
365
+ std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
366
+ ->writeAudioData(audioData, numFrames);
367
+ }
138
368
  }
139
369
 
140
- return DataCallbackResult::Continue;
370
+ if (usesCallback()) {
371
+ if (auto callbackLock = Locker::tryLock(callbackMutex_)) {
372
+ std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)
373
+ ->receiveAudioData(audioData, numFrames);
374
+ }
375
+ }
376
+
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;
141
391
  }
142
392
 
143
- } // namespace audioapi
393
+ bool AndroidAudioRecorder::isRecording() const {
394
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
395
+ mStream_->getState() == oboe::StreamState::Started;
396
+ }
144
397
 
145
- // if (isRunning_.load()) {
146
- // auto *inputChannel = static_cast<float *>(audioData);
147
- // writeToBuffers(inputChannel, numFrames);
148
- // }
398
+ bool AndroidAudioRecorder::isPaused() const {
399
+ return state_.load(std::memory_order_acquire) == RecorderState::Paused;
400
+ }
149
401
 
150
- // while (circularBuffer_->getNumberOfAvailableFrames() >= bufferLength_) {
151
- // auto bus = std::make_shared<AudioBus>(bufferLength_, 1, sampleRate_);
152
- // auto *outputChannel = bus->getChannel(0)->getData();
402
+ bool AndroidAudioRecorder::isIdle() const {
403
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
404
+ }
153
405
 
154
- // circularBuffer_->pop_front(outputChannel, bufferLength_);
406
+ void AndroidAudioRecorder::cleanup() {
407
+ state_.store(RecorderState::Idle, std::memory_order_release);
155
408
 
156
- // invokeOnAudioReadyCallback(bus, bufferLength_);
157
- // }
409
+ if (mStream_) {
410
+ mStream_->close();
411
+ mStream_.reset();
412
+ }
413
+ }
414
+
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
+ }
434
+ }
435
+
436
+ } // namespace audioapi
@@ -1,54 +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>
9
+ #include <mutex>
10
+ #include <audioapi/utils/Result.hpp>
10
11
  #include <audioapi/android/core/NativeAudioRecorder.hpp>
11
12
 
12
13
  namespace audioapi {
13
14
 
14
- using namespace oboe;
15
-
16
15
  class AudioBus;
16
+ class AudioArray;
17
17
  class CircularAudioArray;
18
+ class AudioFileProperties;
19
+ class AndroidRecorderCallback;
18
20
  class AndroidFileWriterBackend;
19
21
  class AudioEventHandlerRegistry;
20
22
 
21
- class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorder {
23
+ class AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {
22
24
  public:
23
25
  explicit AndroidAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
24
26
  ~AndroidAudioRecorder() override;
27
+ void cleanup();
25
28
 
26
- void start() override;
27
- std::string stop() override;
29
+ Result<std::string, std::string> start() override;
30
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
28
31
 
29
- void enableFileOutput(
30
- float sampleRate,
31
- size_t channelCount,
32
- size_t bitRate,
33
- size_t iosFlags,
34
- size_t androidFlags) override;
32
+ Result<std::string, std::string> enableFileOutput(std::shared_ptr<AudioFileProperties> properties) override;
35
33
  void disableFileOutput() override;
36
34
 
37
35
  void pause() override;
38
36
  void resume() override;
37
+ bool isRecording() const override;
38
+ bool isPaused() const override;
39
+ bool isIdle() const override;
40
+
41
+ Result<NoneType, std::string> setOnAudioReadyCallback(float sampleRate, size_t bufferLength, int channelCount, uint64_t callbackId)
42
+ override;
43
+ void clearOnAudioReadyCallback() override;
44
+
45
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
46
+ void disconnect() override;
39
47
 
40
- DataCallbackResult onAudioReady(
41
- AudioStream *oboeStream,
48
+ oboe::DataCallbackResult onAudioReady(
49
+ oboe::AudioStream *oboeStream,
42
50
  void *audioData,
43
51
  int32_t numFrames) override;
52
+ void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;
44
53
 
45
54
  private:
46
- std::shared_ptr<AndroidFileWriterBackend> fileWriter_;
47
- std::shared_ptr<AudioStream> mStream_;
48
- facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
49
- int32_t streamSampleRate_;
55
+ std::shared_ptr<AudioArray> deinterleavingBuffer_;
56
+
57
+ float streamSampleRate_;
50
58
  int32_t streamChannelCount_;
51
59
  int32_t streamMaxBufferSizeInFrames_;
60
+
61
+ facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
62
+
63
+ std::shared_ptr<oboe::AudioStream> mStream_;
64
+ Result<NoneType, std::string> openAudioStream();
52
65
  };
53
66
 
54
67
  } // namespace audioapi
@@ -4,6 +4,10 @@
4
4
  #include <audioapi/core/utils/Constants.h>
5
5
  #include <audioapi/utils/AudioArray.h>
6
6
  #include <audioapi/utils/AudioBus.h>
7
+ #include <jni.h>
8
+
9
+ #include <algorithm>
10
+ #include <memory>
7
11
 
8
12
  namespace audioapi {
9
13
 
@@ -11,9 +15,7 @@ AudioPlayer::AudioPlayer(
11
15
  const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
12
16
  float sampleRate,
13
17
  int channelCount)
14
- : renderAudio_(renderAudio),
15
- sampleRate_(sampleRate),
16
- channelCount_(channelCount) {
18
+ : renderAudio_(renderAudio), sampleRate_(sampleRate), channelCount_(channelCount) {
17
19
  isInitialized_ = openAudioStream();
18
20
 
19
21
  nativeAudioPlayer_ = jni::make_global(NativeAudioPlayer::create());
@@ -35,21 +37,17 @@ bool AudioPlayer::openAudioStream() {
35
37
  auto result = builder.openStream(mStream_);
36
38
  if (result != oboe::Result::OK || mStream_ == nullptr) {
37
39
  __android_log_print(
38
- ANDROID_LOG_ERROR,
39
- "AudioPlayer",
40
- "Failed to open stream: %s",
41
- oboe::convertToText(result));
40
+ ANDROID_LOG_ERROR, "AudioPlayer", "Failed to open stream: %s", oboe::convertToText(result));
42
41
  return false;
43
42
  }
44
43
 
45
- mBus_ = std::make_shared<AudioBus>(
46
- RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
44
+ mBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
47
45
  return true;
48
46
  }
49
47
 
50
48
  bool AudioPlayer::start() {
51
49
  if (mStream_) {
52
- nativeAudioPlayer_->start();
50
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->start(); });
53
51
  auto result = mStream_->requestStart();
54
52
  return result == oboe::Result::OK;
55
53
  }
@@ -59,7 +57,7 @@ bool AudioPlayer::start() {
59
57
 
60
58
  void AudioPlayer::stop() {
61
59
  if (mStream_) {
62
- nativeAudioPlayer_->stop();
60
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->stop(); });
63
61
  mStream_->requestStop();
64
62
  }
65
63
  }
@@ -92,10 +90,8 @@ bool AudioPlayer::isRunning() const {
92
90
  return mStream_ && mStream_->getState() == oboe::StreamState::Started;
93
91
  }
94
92
 
95
- DataCallbackResult AudioPlayer::onAudioReady(
96
- AudioStream *oboeStream,
97
- void *audioData,
98
- int32_t numFrames) {
93
+ DataCallbackResult
94
+ AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
99
95
  if (!isInitialized_) {
100
96
  return DataCallbackResult::Continue;
101
97
  }
@@ -106,8 +102,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
106
102
  assert(buffer != nullptr);
107
103
 
108
104
  while (processedFrames < numFrames) {
109
- int framesToProcess =
110
- std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
105
+ int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
111
106
  renderAudio_(mBus_, framesToProcess);
112
107
 
113
108
  // TODO: optimize this with SIMD?
@@ -124,9 +119,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
124
119
  return DataCallbackResult::Continue;
125
120
  }
126
121
 
127
- void AudioPlayer::onErrorAfterClose(
128
- oboe::AudioStream *stream,
129
- oboe::Result error) {
122
+ void AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
130
123
  if (error == oboe::Result::ErrorDisconnected) {
131
124
  cleanup();
132
125
  if (openAudioStream()) {