react-native-audio-api 0.11.0-alpha.1 → 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 +219 -84
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +24 -23
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +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 +379 -298
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -91
  19. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +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 +132 -104
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -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 +98 -50
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -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 +58 -36
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +41 -44
  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 +26 -18
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +193 -53
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -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/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  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 +43 -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 +44 -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 +13 -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 +34 -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 +42 -34
  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 +63 -78
  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 +51 -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 +45 -36
  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 -36
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  500. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  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,22 +1,25 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C
4
4
  #import <NativeAudioRecorder.h>
5
5
  #else
6
- typedef struct objc_object AVAudioFile;
7
6
  typedef struct objc_object NSURL;
7
+ typedef struct objc_object AVAudioFile;
8
8
  typedef struct objc_object AudioBufferList;
9
9
  typedef struct objc_object NativeAudioRecorder;
10
10
  #endif // __OBJC__
11
11
 
12
12
  #include <audioapi/core/inputs/AudioRecorder.h>
13
+ #include <audioapi/utils/Result.hpp>
14
+
15
+ #include <mutex>
13
16
 
14
17
  namespace audioapi {
15
18
 
16
- class AudioBus;
17
- class CircularAudioArray;
18
- class IOSAudioFileWriter;
19
- class IOSRecorderCallback;
19
+ class FileWriter;
20
+ class RecorderCallback;
21
+ class RecorderAdapterNode;
22
+ class AudioFileProperties;
20
23
  class AudioEventHandlerRegistry;
21
24
 
22
25
  class IOSAudioRecorder : public AudioRecorder {
@@ -24,26 +27,31 @@ class IOSAudioRecorder : public AudioRecorder {
24
27
  IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
25
28
  ~IOSAudioRecorder() override;
26
29
 
27
- std::string start() override;
28
- std::tuple<std::string, double, double> stop() override;
30
+ Result<std::string, std::string> start() override;
31
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
29
32
 
30
- void enableFileOutput(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags, size_t androidFlags)
31
- override;
33
+ Result<std::string, std::string> enableFileOutput(
34
+ std::shared_ptr<AudioFileProperties> properties) override;
32
35
  void disableFileOutput() override;
33
36
 
37
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
38
+ void disconnect() override;
39
+
34
40
  void pause() override;
35
41
  void resume() override;
36
42
 
37
- void setOnAudioReadyCallback(float sampleRate, size_t bufferLength, size_t channelCount, uint64_t callbackId)
38
- override;
39
- void clearOnAudioReadyCallback() override;
43
+ bool isRecording() const override;
44
+ bool isPaused() const override;
45
+ bool isIdle() const override;
40
46
 
41
- double getCurrentDuration() const override;
47
+ Result<NoneType, std::string> setOnAudioReadyCallback(
48
+ float sampleRate,
49
+ size_t bufferLength,
50
+ int channelCount,
51
+ uint64_t callbackId) override;
52
+ void clearOnAudioReadyCallback() override;
42
53
 
43
- private:
44
- std::shared_ptr<IOSAudioFileWriter> fileWriter_;
45
- std::shared_ptr<IOSRecorderCallback> callback_;
46
- std::string filePath_{""};
54
+ protected:
47
55
  NativeAudioRecorder *nativeRecorder_;
48
56
  };
49
57
 
@@ -1,30 +1,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>
10
- #include <audioapi/ios/core/IOSRecorderCallback.h>
15
+ #include <audioapi/ios/core/utils/IOSFileWriter.h>
16
+ #include <audioapi/ios/core/utils/IOSRecorderCallback.h>
17
+ #include <audioapi/ios/system/AudioEngine.h>
11
18
  #include <audioapi/utils/AudioArray.h>
12
19
  #include <audioapi/utils/AudioBus.h>
20
+ #include <audioapi/utils/AudioFileProperties.h>
13
21
  #include <audioapi/utils/CircularAudioArray.h>
14
22
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
23
+ #include <audioapi/utils/Result.hpp>
15
24
 
16
25
  namespace audioapi {
17
26
 
18
- IOSAudioRecorder::IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
19
- : AudioRecorder(audioEventHandlerRegistry), fileWriter_(nullptr)
27
+ IOSAudioRecorder::IOSAudioRecorder(
28
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
29
+ : AudioRecorder(audioEventHandlerRegistry)
20
30
  {
21
31
  AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
22
32
  if (usesFileOutput()) {
23
- fileWriter_->writeAudioData(inputBuffer, numFrames);
33
+ if (auto lock = Locker::tryLock(fileWriterMutex_)) {
34
+ std::dynamic_pointer_cast<IOSFileWriter>(fileWriter_)
35
+ ->writeAudioData(inputBuffer, numFrames);
36
+ }
24
37
  }
25
38
 
26
39
  if (usesCallback()) {
27
- callback_->receiveAudioData(inputBuffer, numFrames);
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
+ }
28
54
  }
29
55
  };
30
56
 
@@ -36,84 +62,168 @@ IOSAudioRecorder::~IOSAudioRecorder()
36
62
  stop();
37
63
  [nativeRecorder_ cleanup];
38
64
  }
39
- std::string IOSAudioRecorder::start()
40
- {
41
- size_t maxInputBufferLength = [nativeRecorder_ getBufferSize];
42
65
 
66
+ Result<std::string, std::string> IOSAudioRecorder::start()
67
+ {
43
68
  if (isRecording()) {
44
- return filePath_;
69
+ return Result<std::string, std::string>::Err("Already recording");
70
+ }
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");
45
83
  }
46
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
+
47
96
  if (usesFileOutput()) {
48
- filePath_ = fileWriter_->openFile([nativeRecorder_ getInputFormat], maxInputBufferLength);
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();
49
106
  }
50
107
 
51
108
  if (usesCallback()) {
52
- callback_->prepare([nativeRecorder_ getInputFormat], maxInputBufferLength);
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
+ }
53
116
  }
54
117
 
55
118
  if (isConnected()) {
56
- // TODO: set adapter node properties?
119
+ // TODO: pass sample rate, in case conversion is necessary
120
+ adapterNode_->init(maxInputBufferLength, inputFormat.channelCount);
57
121
  }
58
122
 
59
123
  [nativeRecorder_ start];
60
- state_.store(RecorderState::Recording);
61
-
62
- return filePath_;
124
+ state_.store(RecorderState::Recording, std::memory_order_release);
125
+ return Result<std::string, std::string>::Ok(filePath_);
63
126
  }
64
127
 
65
- std::tuple<std::string, double, double> IOSAudioRecorder::stop()
128
+ Result<std::tuple<std::string, double, double>, std::string> IOSAudioRecorder::stop()
66
129
  {
130
+ std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
131
+
67
132
  std::string filePath = filePath_;
68
133
  double outputFileSize = 0;
69
134
  double outputDuration = 0;
70
135
 
71
136
  if (!isRecording()) {
72
- return {filePath, 0, 0};
137
+ return Result<std::tuple<std::string, double, double>, std::string>::Err("Not recording");
73
138
  }
74
139
 
140
+ state_.store(RecorderState::Idle, std::memory_order_release);
75
141
  [nativeRecorder_ stop];
76
- state_.store(RecorderState::Idle);
77
142
 
78
143
  if (usesFileOutput()) {
79
- auto [size, duration] = fileWriter_->closeFile();
80
- outputFileSize = size;
81
- outputDuration = duration;
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());
82
153
  }
83
154
 
84
155
  if (usesCallback()) {
85
- callback_->cleanup();
156
+ dataCallback_->cleanup();
157
+ }
158
+
159
+ if (isConnected()) {
160
+ adapterNode_->cleanup();
86
161
  }
87
162
 
88
163
  filePath_ = "";
89
- return {filePath, outputFileSize, outputDuration};
164
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
165
+ std::make_tuple(filePath, outputFileSize, outputDuration));
90
166
  }
91
167
 
92
- void IOSAudioRecorder::enableFileOutput(
93
- float sampleRate,
94
- size_t channelCount,
95
- size_t bitRate,
96
- size_t iosFlags,
97
- size_t androidFlags)
168
+ Result<std::string, std::string> IOSAudioRecorder::enableFileOutput(
169
+ std::shared_ptr<AudioFileProperties> properties)
98
170
  {
99
- fileOutputEnabled_.store(true);
100
- 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_);
101
190
  }
102
191
 
103
192
  void IOSAudioRecorder::disableFileOutput()
104
193
  {
105
- fileOutputEnabled_.store(false);
194
+ std::scoped_lock lock(fileWriterMutex_);
195
+ fileOutputEnabled_.store(false, std::memory_order_release);
106
196
  fileWriter_ = nullptr;
107
197
  }
108
198
 
199
+ void IOSAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node)
200
+ {
201
+ std::scoped_lock lock(adapterNodeMutex_);
202
+ adapterNode_ = node;
203
+
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
+
109
219
  void IOSAudioRecorder::pause()
110
220
  {
111
221
  if (!isRecording()) {
112
222
  return;
113
223
  }
114
224
 
115
- [nativeRecorder_ stop];
116
- state_.store(RecorderState::Paused);
225
+ [nativeRecorder_ pause];
226
+ state_.store(RecorderState::Paused, std::memory_order_release);
117
227
  }
118
228
 
119
229
  void IOSAudioRecorder::resume()
@@ -122,36 +232,66 @@ void IOSAudioRecorder::resume()
122
232
  return;
123
233
  }
124
234
 
125
- [nativeRecorder_ start];
126
- state_.store(RecorderState::Recording);
235
+ [nativeRecorder_ resume];
236
+ state_.store(RecorderState::Recording, std::memory_order_release);
127
237
  }
128
238
 
129
- void IOSAudioRecorder::setOnAudioReadyCallback(
130
- float sampleRate,
131
- size_t bufferLength,
132
- size_t channelCount,
133
- uint64_t callbackId)
239
+ bool IOSAudioRecorder::isRecording() const
134
240
  {
135
- callback_ = std::make_shared<IOSRecorderCallback>(
136
- audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
137
- callbackOutputEnabled_.store(true);
241
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
242
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
243
+ [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;
138
244
  }
139
245
 
140
- void IOSAudioRecorder::clearOnAudioReadyCallback()
246
+ bool IOSAudioRecorder::isPaused() const
141
247
  {
142
- callbackOutputEnabled_.store(false);
143
- callback_ = nullptr;
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;
144
257
  }
145
258
 
146
- double IOSAudioRecorder::getCurrentDuration() const
259
+ bool IOSAudioRecorder::isIdle() const
147
260
  {
148
- double duration = 0.0;
261
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
262
+ }
149
263
 
150
- if (usesFileOutput() && fileWriter_) {
151
- duration = fileWriter_->getCurrentDuration();
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
+ }
152
282
  }
153
283
 
154
- return duration;
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;
155
295
  }
156
296
 
157
297
  } // namespace audioapi