react-native-audio-api 0.11.0-alpha.0 → 0.11.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +257 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +33 -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 +47 -47
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +381 -302
  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 +48 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +155 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -16
  24. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
  25. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
  26. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  27. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  28. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  29. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  30. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  31. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  32. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  33. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  34. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  35. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  36. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  37. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  38. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  39. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  40. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  41. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  42. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  43. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  44. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  45. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  46. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  47. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  48. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  49. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  50. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  51. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  52. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  53. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  54. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  55. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  56. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  57. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  58. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  59. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  60. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  61. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  62. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  63. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  64. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  65. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  66. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  68. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  69. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  70. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  71. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +109 -44
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -2
  73. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  74. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  75. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  76. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  77. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  78. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  79. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  80. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  81. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  82. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  83. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  84. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  85. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  86. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  87. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  88. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  89. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  90. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  91. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  92. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  93. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  94. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  95. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  96. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  97. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  98. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  99. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  100. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  101. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  102. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  103. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  104. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  105. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  106. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +84 -66
  107. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
  108. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  109. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  110. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  111. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  112. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  113. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  114. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  115. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  116. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  117. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  118. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  119. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  120. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  121. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  122. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  123. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  124. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +31 -108
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +46 -46
  126. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  127. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  128. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  129. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  130. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  131. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  132. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  133. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  134. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  135. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  136. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  137. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  138. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  139. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  140. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  141. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  142. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +104 -87
  143. package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -33
  144. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  145. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  146. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  147. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  148. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  149. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +43 -0
  150. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  151. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  152. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  153. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  154. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  155. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  156. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  157. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +51 -0
  158. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  159. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  160. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  161. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  162. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  163. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  164. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  165. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  166. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  167. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  168. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  169. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  170. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  171. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  172. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  173. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  174. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  175. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  176. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  177. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  178. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  179. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  180. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  181. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  182. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  183. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  184. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  185. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  186. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  187. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  188. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  189. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  190. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  217. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  218. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  219. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  220. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  221. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  222. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  223. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  224. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  225. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  226. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  227. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  228. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  229. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  230. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  231. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  232. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  233. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  234. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  235. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  236. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  237. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  238. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  239. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  240. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  241. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  242. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  243. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  244. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  245. package/common/cpp/audioapi/utils/Result.hpp +286 -0
  246. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  247. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  248. package/common/cpp/test/CMakeLists.txt +20 -14
  249. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  250. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  251. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  252. package/common/cpp/test/src/DelayTest.cpp +108 -0
  253. package/common/cpp/test/src/GainTest.cpp +4 -5
  254. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  255. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  256. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  257. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  258. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  259. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  260. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  261. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  262. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  263. package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
  264. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  265. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  266. package/ios/audioapi/ios/core/IOSAudioRecorder.h +28 -11
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +229 -44
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +67 -6
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -4
  272. package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
  273. package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
  274. package/ios/audioapi/ios/core/utils/IOSFileWriter.h +53 -0
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  277. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
  278. package/ios/audioapi/ios/system/AudioEngine.h +19 -16
  279. package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
  280. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  281. package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
  282. package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
  283. package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
  284. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  285. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  286. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  287. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  288. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  289. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  290. package/lib/commonjs/api.js +18 -12
  291. package/lib/commonjs/api.js.map +1 -1
  292. package/lib/commonjs/api.web.js +8 -0
  293. package/lib/commonjs/api.web.js.map +1 -1
  294. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  295. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  296. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  297. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  298. package/lib/commonjs/core/AudioContext.js +5 -8
  299. package/lib/commonjs/core/AudioContext.js.map +1 -1
  300. package/lib/commonjs/core/AudioNode.js +1 -1
  301. package/lib/commonjs/core/AudioNode.js.map +1 -1
  302. package/lib/commonjs/core/AudioParam.js +18 -11
  303. package/lib/commonjs/core/AudioParam.js.map +1 -1
  304. package/lib/commonjs/core/AudioRecorder.js +56 -55
  305. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  306. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  307. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  308. package/lib/commonjs/core/ConvolverNode.js +37 -0
  309. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  310. package/lib/commonjs/core/DelayNode.js +17 -0
  311. package/lib/commonjs/core/DelayNode.js.map +1 -0
  312. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  313. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  314. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  315. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  316. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  317. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  318. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  319. package/lib/commonjs/system/AudioManager.js +4 -7
  320. package/lib/commonjs/system/AudioManager.js.map +1 -1
  321. package/lib/commonjs/types.js +16 -23
  322. package/lib/commonjs/types.js.map +1 -1
  323. package/lib/commonjs/utils/filePresets.js +43 -0
  324. package/lib/commonjs/utils/filePresets.js.map +1 -0
  325. package/lib/commonjs/utils/index.js +12 -27
  326. package/lib/commonjs/utils/index.js.map +1 -1
  327. package/lib/commonjs/web-core/AudioContext.js +21 -1
  328. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  329. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  330. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  331. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  332. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  333. package/lib/commonjs/web-core/DelayNode.js +17 -0
  334. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  335. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  336. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  337. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  338. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  339. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  340. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  341. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  342. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  343. package/lib/module/AudioAPIModule/index.js +4 -0
  344. package/lib/module/AudioAPIModule/index.js.map +1 -0
  345. package/lib/module/api.js +3 -12
  346. package/lib/module/api.js.map +1 -1
  347. package/lib/module/api.web.js +1 -0
  348. package/lib/module/api.web.js.map +1 -1
  349. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  350. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  351. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  352. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  353. package/lib/module/core/AudioContext.js +5 -8
  354. package/lib/module/core/AudioContext.js.map +1 -1
  355. package/lib/module/core/AudioNode.js +1 -1
  356. package/lib/module/core/AudioNode.js.map +1 -1
  357. package/lib/module/core/AudioParam.js +18 -11
  358. package/lib/module/core/AudioParam.js.map +1 -1
  359. package/lib/module/core/AudioRecorder.js +57 -56
  360. package/lib/module/core/AudioRecorder.js.map +1 -1
  361. package/lib/module/core/BaseAudioContext.js +63 -32
  362. package/lib/module/core/BaseAudioContext.js.map +1 -1
  363. package/lib/module/core/ConvolverNode.js +31 -0
  364. package/lib/module/core/ConvolverNode.js.map +1 -0
  365. package/lib/module/core/DelayNode.js +11 -0
  366. package/lib/module/core/DelayNode.js.map +1 -0
  367. package/lib/module/core/IIRFilterNode.js +13 -0
  368. package/lib/module/core/IIRFilterNode.js.map +1 -0
  369. package/lib/module/core/OfflineAudioContext.js +3 -6
  370. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  371. package/lib/module/plugin/withAudioAPI.js +47 -1
  372. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  373. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  374. package/lib/module/system/AudioManager.js +4 -7
  375. package/lib/module/system/AudioManager.js.map +1 -1
  376. package/lib/module/types.js +15 -22
  377. package/lib/module/types.js.map +1 -1
  378. package/lib/module/utils/filePresets.js +39 -0
  379. package/lib/module/utils/filePresets.js.map +1 -0
  380. package/lib/module/utils/index.js +10 -10
  381. package/lib/module/utils/index.js.map +1 -1
  382. package/lib/module/web-core/AudioContext.js +21 -1
  383. package/lib/module/web-core/AudioContext.js.map +1 -1
  384. package/lib/module/web-core/ConvolverNode.js +34 -0
  385. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  386. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  387. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  388. package/lib/module/web-core/DelayNode.js +11 -0
  389. package/lib/module/web-core/DelayNode.js.map +1 -0
  390. package/lib/module/web-core/IIRFilterNode.js +13 -0
  391. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  392. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  393. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  394. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  395. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  396. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  397. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  398. package/lib/typescript/api.d.ts +3 -9
  399. package/lib/typescript/api.d.ts.map +1 -1
  400. package/lib/typescript/api.web.d.ts +1 -0
  401. package/lib/typescript/api.web.d.ts.map +1 -1
  402. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  403. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  404. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  405. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  406. package/lib/typescript/core/AudioContext.d.ts +1 -1
  407. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  408. package/lib/typescript/core/AudioNode.d.ts +2 -1
  409. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  410. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  411. package/lib/typescript/core/AudioRecorder.d.ts +16 -6
  412. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  413. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  414. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  415. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  416. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  417. package/lib/typescript/core/DelayNode.d.ts +9 -0
  418. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  419. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  420. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  421. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  422. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  423. package/lib/typescript/events/types.d.ts +4 -0
  424. package/lib/typescript/events/types.d.ts.map +1 -1
  425. package/lib/typescript/interfaces.d.ts +36 -34
  426. package/lib/typescript/interfaces.d.ts.map +1 -1
  427. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  428. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  429. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
  430. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  431. package/lib/typescript/system/AudioManager.d.ts +3 -2
  432. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  433. package/lib/typescript/types.d.ts +43 -30
  434. package/lib/typescript/types.d.ts.map +1 -1
  435. package/lib/typescript/utils/filePresets.d.ts +9 -0
  436. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  437. package/lib/typescript/utils/index.d.ts +1 -8
  438. package/lib/typescript/utils/index.d.ts.map +1 -1
  439. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  440. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  441. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  442. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  443. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  444. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  445. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  446. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  447. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  448. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  449. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  450. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  451. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  452. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  453. package/package.json +11 -4
  454. package/scripts/download-prebuilt-binaries.sh +61 -0
  455. package/scripts/rnaa_utils.rb +8 -0
  456. package/scripts/validate-worklets-version.js +27 -0
  457. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  458. package/src/AudioAPIModule/globals.d.ts +33 -0
  459. package/src/AudioAPIModule/index.ts +1 -0
  460. package/src/api.ts +4 -52
  461. package/src/api.web.ts +1 -0
  462. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  463. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  464. package/src/core/AudioContext.ts +5 -8
  465. package/src/core/AudioNode.ts +4 -3
  466. package/src/core/AudioParam.ts +18 -11
  467. package/src/core/AudioRecorder.ts +86 -84
  468. package/src/core/BaseAudioContext.ts +120 -54
  469. package/src/core/ConvolverNode.ts +35 -0
  470. package/src/core/DelayNode.ts +13 -0
  471. package/src/core/IIRFilterNode.ts +25 -0
  472. package/src/core/OfflineAudioContext.ts +4 -7
  473. package/src/events/types.ts +5 -0
  474. package/src/interfaces.ts +55 -34
  475. package/src/plugin/withAudioAPI.ts +61 -0
  476. package/src/specs/NativeAudioAPIModule.ts +3 -2
  477. package/src/system/AudioManager.ts +13 -19
  478. package/src/types.ts +47 -32
  479. package/src/utils/filePresets.ts +47 -0
  480. package/src/utils/index.ts +13 -19
  481. package/src/web-core/AudioContext.tsx +40 -1
  482. package/src/web-core/BaseAudioContext.tsx +11 -1
  483. package/src/web-core/ConvolverNode.tsx +43 -0
  484. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  485. package/src/web-core/DelayNode.tsx +12 -0
  486. package/src/web-core/IIRFilterNode.tsx +25 -0
  487. package/src/web-core/OfflineAudioContext.tsx +39 -0
  488. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  489. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  490. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  491. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  492. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  493. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  494. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  495. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  496. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  497. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  500. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  501. package/lib/commonjs/utils/bitEnums.js +0 -33
  502. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  503. package/lib/module/utils/bitEnums.js +0 -27
  504. package/lib/module/utils/bitEnums.js.map +0 -1
  505. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  506. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  507. package/metro-config/index.d.ts +0 -5
  508. package/metro-config/index.js +0 -41
  509. package/metro-config/tsconfig.json +0 -3
  510. package/src/utils/bitEnums.ts +0 -51
  511. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  512. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  513. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  514. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  515. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  516. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  517. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  518. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  519. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  520. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  521. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  522. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -0,0 +1,47 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/core/OfflineAudioContext.h>
4
+ #include <audioapi/core/effects/BiquadFilterNode.h>
5
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
6
+ #include <gtest/gtest.h>
7
+ #include <test/src/MockAudioEventHandlerRegistry.h>
8
+ #include <memory>
9
+
10
+ static constexpr int sampleRate = 44100;
11
+ static constexpr float nyquistFrequency = sampleRate / 2.0f;
12
+ static constexpr float tolerance = 0.0001f;
13
+
14
+ namespace audioapi {
15
+ class BiquadFilterTest : public ::testing::Test {
16
+ protected:
17
+ std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
18
+ std::unique_ptr<OfflineAudioContext> context;
19
+
20
+ void SetUp() override {
21
+ eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
22
+ context = std::make_unique<OfflineAudioContext>(
23
+ 2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
24
+ }
25
+
26
+ void expectCoefficientsNear(
27
+ const std::shared_ptr<BiquadFilterNode> &node,
28
+ const BiquadCoefficients &expected);
29
+ void testLowpass(float frequency, float Q);
30
+ void testHighpass(float frequency, float Q);
31
+ void testBandpass(float frequency, float Q);
32
+ void testNotch(float frequency, float Q);
33
+ void testAllpass(float frequency, float Q);
34
+ void testPeaking(float frequency, float Q, float gain);
35
+ void testLowshelf(float frequency, float gain);
36
+ void testHighshelf(float frequency, float gain);
37
+ };
38
+
39
+ class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest,
40
+ public ::testing::WithParamInterface<float> {};
41
+ class BiquadFilterQTestRestTypes : public BiquadFilterTest,
42
+ public ::testing::WithParamInterface<float> {};
43
+ class BiquadFilterFrequencyTest : public BiquadFilterTest,
44
+ public ::testing::WithParamInterface<float> {};
45
+ class BiquadFilterGainTest : public BiquadFilterTest,
46
+ public ::testing::WithParamInterface<float> {};
47
+ } // namespace audioapi
@@ -1,5 +1,6 @@
1
1
  #ifdef RCT_NEW_ARCH_ENABLED
2
2
  #import <React/RCTCallInvokerModule.h>
3
+ #import <React/RCTInvalidating.h>
3
4
  #import <rnaudioapi/rnaudioapi.h>
4
5
  #else // RCT_NEW_ARCH_ENABLED
5
6
  #import <React/RCTBridgeModule.h>
@@ -14,7 +15,7 @@
14
15
 
15
16
  @interface AudioAPIModule : RCTEventEmitter
16
17
  #ifdef RCT_NEW_ARCH_ENABLED
17
- <NativeAudioAPIModuleSpec, RCTCallInvokerModule>
18
+ <NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
18
19
  #else
19
20
  <RCTBridgeModule>
20
21
  #endif // RCT_NEW_ARCH_ENABLED
@@ -26,7 +26,7 @@ using namespace worklets;
26
26
 
27
27
  #if defined(RCT_NEW_ARCH_ENABLED)
28
28
  // nothing
29
- #else // defined(RCT_NEW_ARCH_ENABLED)
29
+ #else // defined(RCT_NEW_ARCH_ENABLED)
30
30
  @interface RCTBridge (RCTTurboModule)
31
31
  - (std::shared_ptr<facebook::react::CallInvoker>)jsCallInvoker;
32
32
  - (void)_tryAndHandleError:(dispatch_block_t)block;
@@ -57,10 +57,15 @@ RCT_EXPORT_MODULE(AudioAPIModule);
57
57
  [super invalidate];
58
58
  }
59
59
 
60
+ - (dispatch_queue_t)methodQueue
61
+ {
62
+ return dispatch_queue_create("com.swmansion.audioapi.MainModuleQueue", DISPATCH_QUEUE_SERIAL);
63
+ }
64
+
60
65
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
61
66
  {
62
67
  self.audioSessionManager = [[AudioSessionManager alloc] init];
63
- self.audioEngine = [[AudioEngine alloc] initWithAudioSessionManager:self.audioSessionManager];
68
+ self.audioEngine = [[AudioEngine alloc] init];
64
69
  self.lockScreenManager = [[LockScreenManager alloc] initWithAudioAPIModule:self];
65
70
  self.notificationManager = [[NotificationManager alloc] initWithAudioAPIModule:self];
66
71
 
@@ -68,7 +73,7 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
68
73
 
69
74
  #if defined(RCT_NEW_ARCH_ENABLED)
70
75
  auto jsCallInvoker = _callInvoker.callInvoker;
71
- #else // defined(RCT_NEW_ARCH_ENABLED)
76
+ #else // defined(RCT_NEW_ARCH_ENABLED)
72
77
  auto jsCallInvoker = self.bridge.jsCallInvoker;
73
78
  #endif // defined(RCT_NEW_ARCH_ENABLED)
74
79
 
@@ -98,13 +103,14 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
98
103
  }
99
104
 
100
105
  // Get the actual JSI Runtime reference
101
- audioapi::AudioAPIModuleInstaller::injectJSIBindings(jsiRuntime, jsCallInvoker, _eventHandler, uiWorkletRuntime);
106
+ audioapi::AudioAPIModuleInstaller::injectJSIBindings(
107
+ jsiRuntime, jsCallInvoker, _eventHandler, uiWorkletRuntime);
102
108
  #else
103
109
  audioapi::AudioAPIModuleInstaller::injectJSIBindings(jsiRuntime, jsCallInvoker, _eventHandler);
104
110
  #endif
105
111
 
106
112
  NSLog(@"Successfully installed JSI bindings for react-native-audio-api!");
107
- return @true;
113
+ return @YES;
108
114
  }
109
115
 
110
116
  RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
@@ -113,22 +119,27 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)
113
119
  }
114
120
 
115
121
  RCT_EXPORT_METHOD(
116
- setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
117
- reject)
122
+ setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)
123
+ resolve reject : (RCTPromiseRejectBlock)reject)
118
124
  {
119
- if ([self.audioSessionManager setActive:enabled]) {
120
- resolve(@"true");
121
- return;
122
- }
125
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
126
+ auto success = [self.audioSessionManager setActive:enabled];
123
127
 
124
- resolve(@"false");
128
+ resolve(@(success));
129
+ });
125
130
  }
126
131
 
127
132
  RCT_EXPORT_METHOD(
128
133
  setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
129
134
  options allowHaptics : (BOOL)allowHaptics)
130
135
  {
131
- [self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
136
+ if (!self.audioSessionManager.shouldManageSession) {
137
+ [self.audioSessionManager setShouldManageSession:true];
138
+ }
139
+ [self.audioSessionManager setAudioSessionOptions:category
140
+ mode:mode
141
+ options:options
142
+ allowHaptics:allowHaptics];
132
143
  }
133
144
 
134
145
  RCT_EXPORT_METHOD(setLockScreenInfo : (NSDictionary *)info)
@@ -162,22 +173,35 @@ RCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)
162
173
  }
163
174
 
164
175
  RCT_EXPORT_METHOD(
165
- requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)
166
- reject)
176
+ requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)
177
+ resolve reject : (nonnull RCTPromiseRejectBlock)reject)
167
178
  {
168
- [self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
179
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
180
+ [self.audioSessionManager requestRecordingPermissions:resolve reject:reject];
181
+ });
169
182
  }
170
183
 
171
184
  RCT_EXPORT_METHOD(
172
- checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
185
+ checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)
186
+ resolve reject : (nonnull RCTPromiseRejectBlock)reject)
173
187
  {
174
- [self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
188
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
189
+ [self.audioSessionManager checkRecordingPermissions:resolve reject:reject];
190
+ });
175
191
  }
176
192
 
177
193
  RCT_EXPORT_METHOD(
178
- getDevicesInfo : (nonnull RCTPromiseResolveBlock)resolve reject : (nonnull RCTPromiseRejectBlock)reject)
194
+ getDevicesInfo : (nonnull RCTPromiseResolveBlock)
195
+ resolve reject : (nonnull RCTPromiseRejectBlock)reject)
196
+ {
197
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
198
+ [self.audioSessionManager getDevicesInfo:resolve reject:reject];
199
+ });
200
+ }
201
+
202
+ RCT_EXPORT_METHOD(disableSessionManagement)
179
203
  {
180
- [self.audioSessionManager getDevicesInfo:resolve reject:reject];
204
+ [self.audioSessionManager disableSessionManagement];
181
205
  }
182
206
 
183
207
  #ifdef RCT_NEW_ARCH_ENABLED
@@ -1,8 +1,8 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as Objective-C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C
4
4
  #import <NativeAudioPlayer.h>
5
- #else // when compiled as C++
5
+ #else // when compiled as C++
6
6
  typedef struct objc_object NativeAudioPlayer;
7
7
  #endif // __OBJC__
8
8
 
@@ -21,7 +21,7 @@ IOSAudioPlayer::IOSAudioPlayer(
21
21
  while (processedFrames < numFrames) {
22
22
  int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
23
23
 
24
- if (isRunning_.load()) {
24
+ if (isRunning_.load(std::memory_order_acquire)) {
25
25
  renderAudio_(audioBus_, framesToProcess);
26
26
  } else {
27
27
  audioBus_->zero();
@@ -57,13 +57,13 @@ bool IOSAudioPlayer::start()
57
57
  }
58
58
 
59
59
  bool success = [audioPlayer_ start];
60
- isRunning_.store(success);
60
+ isRunning_.store(success, std::memory_order_release);
61
61
  return success;
62
62
  }
63
63
 
64
64
  void IOSAudioPlayer::stop()
65
65
  {
66
- isRunning_.store(false);
66
+ isRunning_.store(false, std::memory_order_release);
67
67
  [audioPlayer_ stop];
68
68
  }
69
69
 
@@ -74,13 +74,13 @@ bool IOSAudioPlayer::resume()
74
74
  }
75
75
 
76
76
  bool success = [audioPlayer_ resume];
77
- isRunning_.store(success);
77
+ isRunning_.store(success, std::memory_order_release);
78
78
  return success;
79
79
  }
80
80
 
81
81
  void IOSAudioPlayer::suspend()
82
82
  {
83
- isRunning_.store(false);
83
+ isRunning_.store(false, std::memory_order_release);
84
84
  [audioPlayer_ suspend];
85
85
  }
86
86
 
@@ -88,7 +88,8 @@ bool IOSAudioPlayer::isRunning() const
88
88
  {
89
89
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
90
90
 
91
- return isRunning_.load() && [audioEngine isRunning];
91
+ return isRunning_.load(std::memory_order_acquire) &&
92
+ [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
92
93
  }
93
94
 
94
95
  void IOSAudioPlayer::cleanup()
@@ -1,21 +1,25 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C
4
4
  #import <NativeAudioRecorder.h>
5
5
  #else
6
- typedef struct objc_object AVAudioFile;
7
6
  typedef struct objc_object NSURL;
7
+ typedef struct objc_object AVAudioFile;
8
8
  typedef struct objc_object AudioBufferList;
9
9
  typedef struct objc_object NativeAudioRecorder;
10
10
  #endif // __OBJC__
11
11
 
12
12
  #include <audioapi/core/inputs/AudioRecorder.h>
13
+ #include <audioapi/utils/Result.hpp>
14
+
15
+ #include <mutex>
13
16
 
14
17
  namespace audioapi {
15
18
 
16
- class AudioBus;
17
- class CircularAudioArray;
18
- class IOSAudioFileWriter;
19
+ class FileWriter;
20
+ class RecorderCallback;
21
+ class RecorderAdapterNode;
22
+ class AudioFileProperties;
19
23
  class AudioEventHandlerRegistry;
20
24
 
21
25
  class IOSAudioRecorder : public AudioRecorder {
@@ -23,18 +27,31 @@ class IOSAudioRecorder : public AudioRecorder {
23
27
  IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
24
28
  ~IOSAudioRecorder() override;
25
29
 
26
- void start() override;
27
- std::string stop() override;
30
+ Result<std::string, std::string> start() override;
31
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
28
32
 
29
- void enableFileOutput(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags, size_t androidFlags)
30
- override;
33
+ Result<std::string, std::string> enableFileOutput(
34
+ std::shared_ptr<AudioFileProperties> properties) override;
31
35
  void disableFileOutput() override;
32
36
 
37
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
38
+ void disconnect() override;
39
+
33
40
  void pause() override;
34
41
  void resume() override;
35
42
 
36
- private:
37
- std::shared_ptr<IOSAudioFileWriter> fileWriter_;
43
+ bool isRecording() const override;
44
+ bool isPaused() const override;
45
+ bool isIdle() const override;
46
+
47
+ Result<NoneType, std::string> setOnAudioReadyCallback(
48
+ float sampleRate,
49
+ size_t bufferLength,
50
+ int channelCount,
51
+ uint64_t callbackId) override;
52
+ void clearOnAudioReadyCallback() override;
53
+
54
+ protected:
38
55
  NativeAudioRecorder *nativeRecorder_;
39
56
  };
40
57
 
@@ -1,41 +1,56 @@
1
1
  #import <AVFoundation/AVFoundation.h>
2
+ #import <AudioEngine.h>
3
+ #import <AudioSessionManager.h>
2
4
  #import <Foundation/Foundation.h>
5
+
3
6
  #include <unordered_map>
4
7
 
8
+ #include <audioapi/core/sources/RecorderAdapterNode.h>
9
+ #include <audioapi/core/utils/AudioFileWriter.h>
5
10
  #include <audioapi/core/utils/Constants.h>
11
+ #include <audioapi/core/utils/Locker.h>
6
12
  #include <audioapi/dsp/VectorMath.h>
7
13
  #include <audioapi/events/AudioEventHandlerRegistry.h>
8
- #include <audioapi/ios/core/IOSAudioFileWriter.h>
9
14
  #include <audioapi/ios/core/IOSAudioRecorder.h>
15
+ #include <audioapi/ios/core/utils/IOSFileWriter.h>
16
+ #include <audioapi/ios/core/utils/IOSRecorderCallback.h>
17
+ #include <audioapi/ios/system/AudioEngine.h>
10
18
  #include <audioapi/utils/AudioArray.h>
11
19
  #include <audioapi/utils/AudioBus.h>
20
+ #include <audioapi/utils/AudioFileProperties.h>
12
21
  #include <audioapi/utils/CircularAudioArray.h>
13
22
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
23
+ #include <audioapi/utils/Result.hpp>
14
24
 
15
25
  namespace audioapi {
16
26
 
17
- // AudioReceiverBlock audioReceiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
18
- // if (isRunning_.load()) {
19
- // auto *inputChannel = static_cast<float *>(inputBuffer->mBuffers[0].mData);
20
- // writeToBuffers(inputChannel, numFrames);
21
- // }
22
-
23
- // while (circularBuffer_->getNumberOfAvailableFrames() >= bufferLength_) {
24
- // auto bus = std::make_shared<AudioBus>(bufferLength_, 1, sampleRate_);
25
- // auto *outputChannel = bus->getChannel(0)->getData();
26
-
27
- // circularBuffer_->pop_front(outputChannel, bufferLength_);
28
-
29
- // invokeOnAudioReadyCallback(bus, bufferLength_);
30
- // }
31
- // };
32
-
33
- IOSAudioRecorder::IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
34
- : AudioRecorder(audioEventHandlerRegistry), fileWriter_(nullptr)
27
+ IOSAudioRecorder::IOSAudioRecorder(
28
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
29
+ : AudioRecorder(audioEventHandlerRegistry)
35
30
  {
36
31
  AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
37
32
  if (usesFileOutput()) {
38
- fileWriter_->writeAudioData(inputBuffer, numFrames);
33
+ if (auto lock = Locker::tryLock(fileWriterMutex_)) {
34
+ std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
35
+ ->writeAudioData(inputBuffer, numFrames);
36
+ }
37
+ }
38
+
39
+ if (usesCallback()) {
40
+ if (auto lock = Locker::tryLock(callbackMutex_)) {
41
+ std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
42
+ ->receiveAudioData(inputBuffer, numFrames);
43
+ }
44
+ }
45
+
46
+ if (isConnected()) {
47
+ if (auto lock = Locker::tryLock(adapterNodeMutex_)) {
48
+ for (size_t channel = 0; channel < adapterNode_->channelCount_; ++channel) {
49
+ float *channelData = (float *)inputBuffer->mBuffers[channel].mData;
50
+
51
+ adapterNode_->buff_[channel]->write(channelData, numFrames);
52
+ }
53
+ }
39
54
  }
40
55
  };
41
56
 
@@ -48,65 +63,235 @@ IOSAudioRecorder::~IOSAudioRecorder()
48
63
  [nativeRecorder_ cleanup];
49
64
  }
50
65
 
51
- void IOSAudioRecorder::start()
66
+ Result<std::string, std::string> IOSAudioRecorder::start()
52
67
  {
53
68
  if (isRecording()) {
54
- return;
69
+ return Result<std::string, std::string>::Err("Already recording");
55
70
  }
56
71
 
72
+ std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
73
+ AudioSessionManager *audioSessionManager = [AudioSessionManager sharedInstance];
74
+
75
+ if ([[audioSessionManager checkRecordingPermissions] isEqual:@"Denied"]) {
76
+ return Result<std::string, std::string>::Err("Microphone permissions are not granted");
77
+ }
78
+
79
+ // TODO: recorder should probably request activating the session and setting the options if not set by user
80
+ // but lets handle that in another PR
81
+ if (![audioSessionManager isSessionActive]) {
82
+ return Result<std::string, std::string>::Err("Audio session is not active");
83
+ }
84
+
85
+ // TODO: this is a bit ugly, and could be written slightly better
86
+ // we need to stop the audio engine if it's running, to be able to get
87
+ // proper input format values, otherwise the system my zero out the sample rate or channel count
88
+ // if input wasn't used yet
89
+ // (especially on simulators)
90
+ // Engine will be started again once the native recorder starts
91
+ [AudioEngine.sharedInstance stopIfNecessary];
92
+
93
+ size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
94
+ auto inputFormat = [nativeRecorder_ getInputFormat];
95
+
57
96
  if (usesFileOutput()) {
58
- fileWriter_->openFile([nativeRecorder_ getInputFormat]);
97
+ auto fileResult = std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
98
+ ->openFile(inputFormat, maxInputBufferLength);
99
+
100
+ if (fileResult.is_err()) {
101
+ return Result<std::string, std::string>::Err(
102
+ "Failed to open file for writing: " + fileResult.unwrap_err());
103
+ }
104
+
105
+ filePath_ = fileResult.unwrap();
59
106
  }
60
107
 
61
108
  if (usesCallback()) {
62
- // TODO: create circular buffer and converter?
109
+ auto callbackResult = std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
110
+ ->prepare(inputFormat, maxInputBufferLength);
111
+
112
+ if (callbackResult.is_err()) {
113
+ return Result<std::string, std::string>::Err(
114
+ "Failed to prepare callback: " + callbackResult.unwrap_err());
115
+ }
63
116
  }
64
117
 
65
118
  if (isConnected()) {
66
- // TODO: set adapter node properties?
119
+ // TODO: pass sample rate, in case conversion is necessary
120
+ adapterNode_->init(maxInputBufferLength, inputFormat.channelCount);
67
121
  }
68
122
 
69
123
  [nativeRecorder_ start];
70
- isRunning_.store(true);
124
+ state_.store(RecorderState::Recording, std::memory_order_release);
125
+ return Result<std::string, std::string>::Ok(filePath_);
71
126
  }
72
127
 
73
- std::string IOSAudioRecorder::stop()
128
+ Result<std::tuple<std::string, double, double>, std::string> IOSAudioRecorder::stop()
74
129
  {
130
+ std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
131
+
132
+ std::string filePath = filePath_;
133
+ double outputFileSize = 0;
134
+ double outputDuration = 0;
135
+
75
136
  if (!isRecording()) {
76
- return std::string("");
137
+ return Result<std::tuple<std::string, double, double>, std::string>::Err("Not recording");
77
138
  }
78
139
 
140
+ state_.store(RecorderState::Idle, std::memory_order_release);
79
141
  [nativeRecorder_ stop];
80
- isRunning_.store(false);
81
-
82
- // TODO: send remaining data?
83
142
 
84
143
  if (usesFileOutput()) {
85
- return fileWriter_->closeFile();
144
+ auto fileResult = fileWriter_->closeFile();
145
+
146
+ if (fileResult.is_err()) {
147
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
148
+ "Failed to close file: " + fileResult.unwrap_err());
149
+ }
150
+
151
+ outputFileSize = std::get<0>(fileResult.unwrap());
152
+ outputDuration = std::get<1>(fileResult.unwrap());
153
+ }
154
+
155
+ if (usesCallback()) {
156
+ dataCallback_->cleanup();
157
+ }
158
+
159
+ if (isConnected()) {
160
+ adapterNode_->cleanup();
86
161
  }
87
162
 
88
- return std::string("");
163
+ filePath_ = "";
164
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
165
+ std::make_tuple(filePath, outputFileSize, outputDuration));
89
166
  }
90
167
 
91
- void IOSAudioRecorder::enableFileOutput(
92
- float sampleRate,
93
- size_t channelCount,
94
- size_t bitRate,
95
- size_t iosFlags,
96
- size_t androidFlags)
168
+ Result<std::string, std::string> IOSAudioRecorder::enableFileOutput(
169
+ std::shared_ptr<AudioFileProperties> properties)
97
170
  {
98
- fileOutputEnabled_.store(true);
99
- fileWriter_ = std::make_shared<IOSAudioFileWriter>(sampleRate, channelCount, bitRate, iosFlags);
171
+ std::scoped_lock lock(fileWriterMutex_, errorCallbackMutex_);
172
+ fileWriter_ = std::make_shared<IOSFileWriter>(audioEventHandlerRegistry_, properties);
173
+
174
+ if (!isIdle()) {
175
+ auto result = std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
176
+ ->openFile([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
177
+
178
+ if (result.is_err()) {
179
+ return Result<std::string, std::string>::Err(
180
+ "Failed to open file for writing: " + result.unwrap_err());
181
+ }
182
+
183
+ filePath_ = result.unwrap();
184
+ }
185
+
186
+ fileWriter_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
187
+
188
+ fileOutputEnabled_.store(true, std::memory_order_release);
189
+ return Result<std::string, std::string>::Ok(filePath_);
100
190
  }
101
191
 
102
192
  void IOSAudioRecorder::disableFileOutput()
103
193
  {
104
- fileOutputEnabled_.store(false);
194
+ std::scoped_lock lock(fileWriterMutex_);
195
+ fileOutputEnabled_.store(false, std::memory_order_release);
105
196
  fileWriter_ = nullptr;
106
197
  }
107
198
 
108
- void IOSAudioRecorder::pause() {}
199
+ void IOSAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node)
200
+ {
201
+ std::scoped_lock lock(adapterNodeMutex_);
202
+ adapterNode_ = node;
109
203
 
110
- void IOSAudioRecorder::resume() {}
204
+ if (!isIdle()) {
205
+ adapterNode_->init(
206
+ [nativeRecorder_ getBufferSize], [nativeRecorder_ getInputFormat].channelCount);
207
+ }
208
+
209
+ isConnected_.store(true, std::memory_order_release);
210
+ }
211
+
212
+ void IOSAudioRecorder::disconnect()
213
+ {
214
+ std::scoped_lock lock(adapterNodeMutex_);
215
+ adapterNode_ = nullptr;
216
+ isConnected_.store(false, std::memory_order_release);
217
+ }
218
+
219
+ void IOSAudioRecorder::pause()
220
+ {
221
+ if (!isRecording()) {
222
+ return;
223
+ }
224
+
225
+ [nativeRecorder_ pause];
226
+ state_.store(RecorderState::Paused, std::memory_order_release);
227
+ }
228
+
229
+ void IOSAudioRecorder::resume()
230
+ {
231
+ if (!isPaused()) {
232
+ return;
233
+ }
234
+
235
+ [nativeRecorder_ resume];
236
+ state_.store(RecorderState::Recording, std::memory_order_release);
237
+ }
238
+
239
+ bool IOSAudioRecorder::isRecording() const
240
+ {
241
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
242
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
243
+ [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
244
+ }
245
+
246
+ bool IOSAudioRecorder::isPaused() const
247
+ {
248
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
249
+ auto currentState = state_.load(std::memory_order_acquire);
250
+
251
+ if (currentState == RecorderState::Idle) {
252
+ return false;
253
+ }
254
+
255
+ return currentState == RecorderState::Paused &&
256
+ [audioEngine getState] != AudioEngineState::AudioEngineStateRunning;
257
+ }
258
+
259
+ bool IOSAudioRecorder::isIdle() const
260
+ {
261
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
262
+ }
263
+
264
+ Result<NoneType, std::string> IOSAudioRecorder::setOnAudioReadyCallback(
265
+ float sampleRate,
266
+ size_t bufferLength,
267
+ int channelCount,
268
+ uint64_t callbackId)
269
+ {
270
+ std::scoped_lock lock(callbackMutex_, errorCallbackMutex_);
271
+
272
+ dataCallback_ = std::make_shared<IOSRecorderCallback>(
273
+ audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
274
+
275
+ if (!isIdle()) {
276
+ auto result = std::dynamic_pointer_cast<IOSRecorderCallback>(dataCallback_)
277
+ ->prepare([nativeRecorder_ getInputFormat], [nativeRecorder_ getBufferSize]);
278
+
279
+ if (result.is_err()) {
280
+ return Result<NoneType, std::string>::Err(result.unwrap_err());
281
+ }
282
+ }
283
+
284
+ dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));
285
+
286
+ callbackOutputEnabled_.store(true, std::memory_order_release);
287
+ return Result<NoneType, std::string>::Ok(None);
288
+ }
289
+
290
+ void IOSAudioRecorder::clearOnAudioReadyCallback()
291
+ {
292
+ std::scoped_lock lock(callbackMutex_);
293
+ callbackOutputEnabled_.store(false, std::memory_order_release);
294
+ dataCallback_ = nullptr;
295
+ }
111
296
 
112
297
  } // namespace audioapi