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

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 +23 -23
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +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 +42 -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
@@ -1,16 +1,14 @@
1
1
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
2
+ #include <algorithm>
2
3
  #include <type_traits>
3
4
 
4
5
  namespace audioapi {
5
6
 
6
- CircularOverflowableAudioArray::CircularOverflowableAudioArray(
7
- size_t
8
- size) noexcept(std::is_nothrow_constructible<AudioArray, size_t>::value)
7
+ CircularOverflowableAudioArray::CircularOverflowableAudioArray(size_t size) noexcept(
8
+ std::is_nothrow_constructible<AudioArray, size_t>::value)
9
9
  : AudioArray(size) {}
10
10
 
11
- void CircularOverflowableAudioArray::write(
12
- const float *data,
13
- const size_t size) {
11
+ void CircularOverflowableAudioArray::write(const float *data, const size_t size) {
14
12
  size_t writeIndex = vWriteIndex_.load(std::memory_order_relaxed);
15
13
 
16
14
  if (size > size_) {
@@ -43,8 +41,7 @@ size_t CircularOverflowableAudioArray::read(float *output, size_t size) const {
43
41
  size_t partSize = size_ - vReadIndex_;
44
42
  if (readSize > partSize) {
45
43
  std::memcpy(output, data_ + vReadIndex_, partSize * sizeof(float));
46
- std::memcpy(
47
- output + partSize, data_, (readSize - partSize) * sizeof(float));
44
+ std::memcpy(output + partSize, data_, (readSize - partSize) * sizeof(float));
48
45
  } else {
49
46
  std::memcpy(output, data_ + vReadIndex_, readSize * sizeof(float));
50
47
  }
@@ -54,8 +51,7 @@ size_t CircularOverflowableAudioArray::read(float *output, size_t size) const {
54
51
  }
55
52
 
56
53
  size_t CircularOverflowableAudioArray::getAvailableSpace() const {
57
- return (size_ + vWriteIndex_.load(std::memory_order_relaxed) - vReadIndex_) %
58
- size_;
54
+ return (size_ + vWriteIndex_.load(std::memory_order_relaxed) - vReadIndex_) % size_;
59
55
  }
60
56
 
61
57
  } // namespace audioapi
@@ -2,9 +2,9 @@
2
2
  #pragma once
3
3
 
4
4
  #include <audioapi/utils/AudioArray.h>
5
- #include <stdexcept>
6
5
  #include <atomic>
7
6
  #include <mutex>
7
+ #include <stdexcept>
8
8
 
9
9
  namespace audioapi {
10
10
 
@@ -32,7 +32,7 @@ class CircularOverflowableAudioArray : public AudioArray {
32
32
  size_t read(float *output, size_t size) const;
33
33
 
34
34
  private:
35
- std::atomic<size_t> vWriteIndex_ = { 0 };
35
+ std::atomic<size_t> vWriteIndex_ = {0};
36
36
  mutable size_t vReadIndex_ = 0; // it is only used after acquiring readLock_
37
37
  mutable std::mutex readLock_;
38
38
 
@@ -0,0 +1,286 @@
1
+ #pragma once
2
+
3
+ #include <utility>
4
+ #include <string>
5
+ #include <stdexcept>
6
+ #include <functional>
7
+ #include <new>
8
+ #include <type_traits>
9
+
10
+ struct NoneType {};
11
+ inline constexpr NoneType None{};
12
+
13
+ /// @brief A Result type that can represent either a success (Ok) or an error (Err).
14
+ /// @tparam T value type for success
15
+ /// @tparam E error type for failure
16
+ /// @note Specializations for void T and/or void E are not provided. Use NoneType instead.
17
+ /// Design inspired by Rust's Result type.
18
+ /// https://doc.rust-lang.org/std/result/
19
+ ///
20
+ /// @example
21
+ /// /// Creating an Ok Result and mapping its error:
22
+ /// Result<int, std::string> res = Result<int, int>::Err(404)
23
+ /// .map_err<std::string>([](auto code){
24
+ /// return "Error code: " + std::to_string(code);
25
+ /// });
26
+ ///
27
+ template<typename T = NoneType, typename E = NoneType>
28
+ class Result {
29
+ struct OkTag {};
30
+ struct ErrTag {};
31
+
32
+ explicit Result(OkTag, const T& value) : ok_value(value), is_ok_(true) {}
33
+ explicit Result(OkTag, T&& value) : ok_value(std::move(value)), is_ok_(true) {}
34
+ explicit Result(ErrTag, const E& error) : err_value(error), is_ok_(false) {}
35
+ explicit Result(ErrTag, E&& error) : err_value(std::move(error)), is_ok_(false) {}
36
+
37
+ public:
38
+ Result(const Result<T, E>& other) {
39
+ is_ok_ = other.is_ok_;
40
+ if (is_ok_) {
41
+ new (&ok_value) T(other.ok_value);
42
+ } else {
43
+ new (&err_value) E(other.err_value);
44
+ }
45
+ }
46
+
47
+ Result(Result<T, E>&& other) noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>) {
48
+ is_ok_ = other.is_ok_;
49
+ if (is_ok_) {
50
+ new (&ok_value) T(std::move(other.ok_value));
51
+ } else {
52
+ new (&err_value) E(std::move(other.err_value));
53
+ }
54
+ }
55
+
56
+ Result& operator=(const Result& other) {
57
+ if (this == &other) return *this;
58
+ if (is_ok_ == other.is_ok_) {
59
+ if (is_ok_) ok_value = other.ok_value;
60
+ else err_value = other.err_value;
61
+ } else {
62
+ if (is_ok_) {
63
+ ok_value.~T();
64
+ new (&err_value) E(other.err_value);
65
+ is_ok_ = false;
66
+ } else {
67
+ err_value.~E();
68
+ new (&ok_value) T(other.ok_value);
69
+ is_ok_ = true;
70
+ }
71
+ }
72
+ return *this;
73
+ }
74
+
75
+ Result& operator=(Result&& other) noexcept(std::is_nothrow_move_assignable_v<T> && std::is_nothrow_move_assignable_v<E> && std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>) {
76
+ if (this == &other) return *this;
77
+ if (is_ok_ == other.is_ok_) {
78
+ if (is_ok_) ok_value = std::move(other.ok_value);
79
+ else err_value = std::move(other.err_value);
80
+ } else {
81
+ if (is_ok_) {
82
+ ok_value.~T();
83
+ new (&err_value) E(std::move(other.err_value));
84
+ is_ok_ = false;
85
+ } else {
86
+ err_value.~E();
87
+ new (&ok_value) T(std::move(other.ok_value));
88
+ is_ok_ = true;
89
+ }
90
+ }
91
+ return *this;
92
+ }
93
+
94
+ ~Result() {
95
+ if (is_ok_) {
96
+ ok_value.~T();
97
+ } else {
98
+ err_value.~E();
99
+ }
100
+ }
101
+
102
+ /// @brief Creates a success Result.
103
+ static Result<T, E> Ok(const T& value) {
104
+ return Result<T, E>(OkTag{}, value);
105
+ }
106
+
107
+ /// @brief Creates a success Result from an rvalue.
108
+ static Result<T, E> Ok(T&& value) {
109
+ return Result<T, E>(OkTag{}, std::move(value));
110
+ }
111
+
112
+ /// @brief Creates an error Result.
113
+ static Result<T, E> Err(const E& error) {
114
+ return Result<T, E>(ErrTag{}, error);
115
+ }
116
+
117
+ /// @brief Creates an error Result from an rvalue.
118
+ static Result<T, E> Err(E&& error) {
119
+ return Result<T, E>(ErrTag{}, std::move(error));
120
+ }
121
+
122
+ /// @brief Returns true if the result is Ok.
123
+ [[nodiscard]] bool is_ok() const {
124
+ return is_ok_;
125
+ }
126
+
127
+ /// @brief Returns true if the result is Err.
128
+ [[nodiscard]] bool is_err() const {
129
+ return !is_ok_;
130
+ }
131
+
132
+ /// @brief Returns the contained Ok value, consuming the Result.
133
+ /// @throws std::runtime_error if the value is an Err.
134
+ [[nodiscard]] T expect(const std::string& msg) && {
135
+ if (!is_ok_) {
136
+ throw std::runtime_error(msg);
137
+ }
138
+ return std::move(ok_value);
139
+ }
140
+
141
+ /// @brief Returns the contained Ok value.
142
+ /// @throws std::runtime_error if the value is an Err.
143
+ [[nodiscard]] const T& expect(const std::string& msg) const & {
144
+ if (!is_ok_) {
145
+ throw std::runtime_error(msg);
146
+ }
147
+ return ok_value;
148
+ }
149
+
150
+ /// @brief Returns the contained Ok value, consuming the Result.
151
+ /// @throws std::runtime_error if the value is an Err.
152
+ [[nodiscard]] T unwrap() && {
153
+ if (!is_ok_) {
154
+ throw std::runtime_error("Called unwrap on an Err value");
155
+ }
156
+ return std::move(ok_value);
157
+ }
158
+
159
+ /// @brief Returns the contained Ok value.
160
+ /// @throws std::runtime_error if the value is an Err.
161
+ [[nodiscard]] const T& unwrap() const & {
162
+ if (!is_ok_) {
163
+ throw std::runtime_error("Called unwrap on an Err value");
164
+ }
165
+ return ok_value;
166
+ }
167
+
168
+ /// @brief Returns the contained Ok value or a default. Consumes self.
169
+ [[nodiscard]] T unwrap_or(T&& default_value) && {
170
+ if (is_ok_) {
171
+ return std::move(ok_value);
172
+ }
173
+ return std::move(default_value);
174
+ }
175
+
176
+ /// @brief Returns the contained Ok value or computes it from a closure. Consumes self.
177
+ [[nodiscard]] T unwrap_or_else(const std::function<T(E&&)>& func) && {
178
+ if (is_ok_) {
179
+ return std::move(ok_value);
180
+ }
181
+ return func(std::move(err_value));
182
+ }
183
+
184
+ /// @brief Returns the contained Ok value without checking. UB if Err.
185
+ [[nodiscard]] T unwrap_unchecked() && noexcept {
186
+ return std::move(ok_value);
187
+ }
188
+
189
+ /// @brief Returns the contained Ok value without checking. UB if Err.
190
+ [[nodiscard]] const T& unwrap_unchecked() const & noexcept {
191
+ return ok_value;
192
+ }
193
+
194
+ /// @brief Returns the contained Err value, consuming the Result.
195
+ /// @throws std::runtime_error if the value is Ok.
196
+ [[nodiscard]] E unwrap_err() && {
197
+ if (is_ok_) {
198
+ throw std::runtime_error("Called unwrap_err on an Ok value");
199
+ }
200
+ return std::move(err_value);
201
+ }
202
+
203
+ /// @brief Returns the contained Err value.
204
+ /// @throws std::runtime_error if the value is Ok.
205
+ [[nodiscard]] const E& unwrap_err() const & {
206
+ if (is_ok_) {
207
+ throw std::runtime_error("Called unwrap_err on an Ok value");
208
+ }
209
+ return err_value;
210
+ }
211
+
212
+ /// @brief Returns the contained Err value, consuming the Result.
213
+ /// @throws std::runtime_error if the value is Ok.
214
+ [[nodiscard]] E expect_err(const std::string& msg) && {
215
+ if (is_ok_) {
216
+ throw std::runtime_error(msg);
217
+ }
218
+ return std::move(err_value);
219
+ }
220
+
221
+ /// @brief Returns the contained Err value.
222
+ /// @throws std::runtime_error if the value is Ok.
223
+ [[nodiscard]] const E& expect_err(const std::string& msg) const & {
224
+ if (is_ok_) {
225
+ throw std::runtime_error(msg);
226
+ }
227
+ return err_value;
228
+ }
229
+
230
+ /// @brief Returns the contained Err value without checking. UB if Ok.
231
+ [[nodiscard]] E unwrap_err_unchecked() && noexcept {
232
+ return std::move(err_value);
233
+ }
234
+
235
+ /// @brief Returns the contained Err value without checking. UB if Ok.
236
+ [[nodiscard]] const E& unwrap_err_unchecked() const & noexcept {
237
+ return err_value;
238
+ }
239
+
240
+ /// @brief Maps a Result<T, E> to Result<U, E> by applying a function to a contained Ok value.
241
+ template<typename TNew>
242
+ [[nodiscard]] std::enable_if_t<!std::is_void_v<T>, Result<TNew, E>> map(std::function<TNew(T&&)> ok_func) && {
243
+ if (is_ok_) {
244
+ return Result<TNew, E>::Ok(ok_func(std::move(ok_value)));
245
+ } else {
246
+ return Result<TNew, E>::Err(std::move(err_value));
247
+ }
248
+ }
249
+
250
+ /// @brief Maps a Result<T, E> to Result<T, F> by applying a function to a contained Err value.
251
+ template<typename ENew>
252
+ [[nodiscard]] std::enable_if_t<!std::is_void_v<ENew>, Result<T, ENew>> map_err(std::function<ENew(E&&)> err_func) && {
253
+ if (is_ok_) {
254
+ return Result<T, ENew>::Ok(std::move(ok_value));
255
+ } else {
256
+ return Result<T, ENew>::Err(err_func(std::move(err_value)));
257
+ }
258
+ }
259
+
260
+ /// @brief Returns the provided default (if Err), or applies a function to the contained value (if Ok).
261
+ template<typename TNew>
262
+ [[nodiscard]] std::enable_if_t<!std::is_void_v<TNew>, TNew> map_or(std::function<TNew(T&&)> ok_func, TNew&& default_value) && {
263
+ if (is_ok_) {
264
+ return ok_func(std::move(ok_value));
265
+ } else {
266
+ return std::move(default_value);
267
+ }
268
+ }
269
+
270
+ /// @brief Maps a Result<T, E> to U by applying fallback function default to a contained Err value, or function f to a contained Ok value.
271
+ template <typename TNew>
272
+ [[nodiscard]] std::enable_if_t<!std::is_void_v<TNew>, TNew> map_or_else(std::function<TNew(T&&)> ok_func, std::function<TNew(E&&)> err_func) && {
273
+ if (is_ok_) {
274
+ return ok_func(std::move(ok_value));
275
+ } else {
276
+ return err_func(std::move(err_value));
277
+ }
278
+ }
279
+
280
+ private:
281
+ union {
282
+ T ok_value;
283
+ E err_value;
284
+ };
285
+ bool is_ok_;
286
+ };
@@ -20,6 +20,11 @@ class ThreadPool {
20
20
  struct TaskEvent { audioapi::move_only_function<void()> task; };
21
21
  using Event = std::variant<TaskEvent, StopEvent>;
22
22
 
23
+ struct Cntrl {
24
+ std::atomic<bool> waitingForTasks{false};
25
+ std::atomic<size_t> tasksScheduled{0};
26
+ };
27
+
23
28
  using Sender = channels::spsc::Sender<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
24
29
  using Receiver = channels::spsc::Receiver<Event, channels::spsc::OverflowStrategy::WAIT_ON_FULL, channels::spsc::WaitStrategy::ATOMIC_WAIT>;
25
30
  public:
@@ -38,8 +43,30 @@ public:
38
43
  workerSenders.emplace_back(std::move(workerSender));
39
44
  }
40
45
  loadBalancerThread = std::thread(&ThreadPool::loadBalancerThreadFunc, this, std::move(receiver), std::move(workerSenders));
46
+ controlBlock_ = std::make_unique<Cntrl>();
47
+ }
48
+ ThreadPool(const ThreadPool&) = delete;
49
+ ThreadPool& operator=(const ThreadPool&) = delete;
50
+ ThreadPool(ThreadPool&& other):
51
+ loadBalancerThread(std::move(other.loadBalancerThread)),
52
+ workers(std::move(other.workers)),
53
+ loadBalancerSender(std::move(other.loadBalancerSender)),
54
+ controlBlock_(std::move(other.controlBlock_)) {}
55
+ ThreadPool& operator=(ThreadPool&& other) {
56
+ if (this != &other) {
57
+ loadBalancerThread = std::move(other.loadBalancerThread);
58
+ workers = std::move(other.workers);
59
+ loadBalancerSender = std::move(other.loadBalancerSender);
60
+ controlBlock_ = std::move(other.controlBlock_);
61
+ other.movedFrom_ = true;
62
+ }
63
+ return *this;
41
64
  }
65
+
42
66
  ~ThreadPool() {
67
+ if (movedFrom_) {
68
+ return;
69
+ }
43
70
  loadBalancerSender.send(StopEvent{});
44
71
  loadBalancerThread.join();
45
72
  for (auto& worker : workers) {
@@ -59,16 +86,47 @@ public:
59
86
  /// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only.
60
87
  template<typename Func, typename ... Args, typename = std::enable_if_t<std::is_invocable_r_v<void, Func, Args...>>>
61
88
  void schedule(Func &&task, Args &&... args) noexcept {
62
- auto boundTask = [f = std::forward<Func>(task), ...capturedArgs = std::forward<Args>(args)]() mutable {
89
+ controlBlock_->tasksScheduled.fetch_add(1, std::memory_order_release);
90
+
91
+ /// We know that lifetime of each worker thus spsc thus lambda is strongly bounded by ThreadPool lifetime
92
+ /// so we can safely capture control block pointer unsafely here
93
+ Cntrl *cntrl = controlBlock_.get();
94
+ auto boundTask = [cntrl, f= std::forward<Func>(task), ...capturedArgs = std::forward<Args>(args)]() mutable {
63
95
  f(std::forward<Args>(capturedArgs)...);
96
+ size_t left = cntrl->tasksScheduled.fetch_sub(1, std::memory_order_acq_rel) - 1;
97
+ if (left == 0) {
98
+ cntrl->waitingForTasks.store(false, std::memory_order_release);
99
+ cntrl->waitingForTasks.notify_one();
100
+ }
64
101
  };
65
102
  loadBalancerSender.send(TaskEvent{audioapi::move_only_function<void()>(std::move(boundTask))});
66
103
  }
67
104
 
105
+ /// @brief Waits for all scheduled tasks to complete
106
+ void wait() {
107
+ /// This logic might seem incorrect at first glance
108
+ /// Main principle for this is that there is only one thread scheduling tasks
109
+ /// If he is waiting for the tasks he CANNOT schedule new tasks so we can assume partial
110
+ /// synchronization here.
111
+ /// We first store true so if any task finishes at this moment he will flip it
112
+ /// Then we check if there are any tasks scheduled
113
+ /// If there are none we can return immediately
114
+ /// If there are some we wait until the last task flips the flag to false
115
+ controlBlock_->waitingForTasks.store(true, std::memory_order_release);
116
+ if (controlBlock_->tasksScheduled.load(std::memory_order_acquire) == 0) {
117
+ controlBlock_->waitingForTasks.store(false, std::memory_order_release);
118
+ return;
119
+ }
120
+ controlBlock_->waitingForTasks.wait(true, std::memory_order_acquire);
121
+ return;
122
+ }
123
+
68
124
  private:
69
125
  std::thread loadBalancerThread;
70
126
  std::vector<std::thread> workers;
71
127
  Sender loadBalancerSender;
128
+ std::unique_ptr<Cntrl> controlBlock_;
129
+ bool movedFrom_ = false;
72
130
 
73
131
  void workerThreadFunc(Receiver &&receiver) {
74
132
  Receiver localReceiver = std::move(receiver);
@@ -0,0 +1,9 @@
1
+ #pragma once
2
+
3
+ namespace audioapi {
4
+
5
+ static constexpr double KB_IN_BYTES = 1024.0;
6
+ static constexpr double MB_IN_BYTES = KB_IN_BYTES * 1024.0;
7
+ static constexpr double GB_IN_BYTES = MB_IN_BYTES * 1024.0;
8
+
9
+ } // namespace audioapi
@@ -12,41 +12,44 @@ FetchContent_Declare(
12
12
  googletest
13
13
  URL https://github.com/google/googletest/archive/3983f67e32fb3e9294487b9d4f9586efa6e5d088.zip
14
14
  )
15
+
15
16
  # For Windows: Prevent overriding the parent project's compiler/linker settings
16
17
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
17
18
  FetchContent_MakeAvailable(googletest)
18
19
 
19
20
  enable_testing()
20
21
 
22
+ set(REACT_NATIVE_AUDIO_API_DIR "${ROOT}/node_modules/react-native-audio-api")
23
+
21
24
  file(GLOB_RECURSE RNAUDIOAPI_SRC
22
25
  CONFIGURE_DEPENDS
23
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/*.cpp"
24
- "${ROOT}/node_modules/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp"
26
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/*.cpp"
27
+ "${REACT_NATIVE_AUDIO_API_DIR}/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp"
25
28
  )
26
29
 
27
30
  # exclude HostObjects from tests
28
31
  list(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX ".*/audioapi/HostObjects/.*\\.cpp$")
29
32
 
30
33
  list(REMOVE_ITEM RNAUDIOAPI_SRC
31
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp"
32
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletNode.cpp"
33
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp"
34
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp"
35
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.cpp"
36
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.h"
37
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp"
38
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h"
34
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/AudioContext.cpp"
35
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/effects/WorkletNode.cpp"
36
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp"
37
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp"
38
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/sources/StreamerNode.cpp"
39
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/sources/StreamerNode.h"
40
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp"
41
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h"
39
42
  )
40
43
 
41
44
  file(GLOB_RECURSE RNAUDIOAPI_LIBS
42
45
  CONFIGURE_DEPENDS
43
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.c"
44
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/*.h"
46
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/*.c"
47
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/*.h"
45
48
  )
46
49
 
47
50
  list(REMOVE_ITEM RNAUDIOAPI_LIBS
48
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.c"
49
- "${ROOT}/node_modules/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.c"
51
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.c"
52
+ "${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.c"
50
53
  )
51
54
 
52
55
  add_library(rnaudioapi STATIC ${RNAUDIOAPI_SRC})
@@ -57,6 +60,8 @@ target_include_directories(rnaudioapi PUBLIC
57
60
  ${JSI_DIR}
58
61
  "${REACT_NATIVE_DIR}/ReactCommon"
59
62
  "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
63
+ ${gtest_SOURCE_DIR}/include
64
+ ${gmock_SOURCE_DIR}/include
60
65
  )
61
66
 
62
67
  target_include_directories(rnaudioapi_libs PUBLIC
@@ -76,6 +81,7 @@ add_executable(
76
81
  add_compile_definitions(AUDIO_API_TEST_SUITE)
77
82
  add_compile_definitions(RN_AUDIO_API_ENABLE_WORKLETS=0)
78
83
  add_compile_definitions(RN_AUDIO_API_TEST=1)
84
+ add_compile_definitions(RN_AUDIO_API_FFMPEG_DISABLED=1)
79
85
 
80
86
  target_link_libraries(tests
81
87
  rnaudioapi
@@ -3,12 +3,14 @@
3
3
  #include <audioapi/core/utils/worklets/SafeIncludes.h>
4
4
  #include <gtest/gtest.h>
5
5
  #include <test/src/MockAudioEventHandlerRegistry.h>
6
+ #include <memory>
7
+ #include <vector>
6
8
 
7
9
  using namespace audioapi;
8
10
 
9
11
  class AudioParamTest : public ::testing::Test {
10
12
  protected:
11
- std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
13
+ std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
12
14
  std::unique_ptr<OfflineAudioContext> context;
13
15
  static constexpr int sampleRate = 44100;
14
16
 
@@ -119,8 +121,7 @@ TEST_F(AudioParamTest, SetTargetAtTime) {
119
121
  TEST_F(AudioParamTest, SetValueCurveAtTime) {
120
122
  AudioParam param = AudioParam(0.0, 0.0, 1.0, context.get());
121
123
  param.setValue(0.5);
122
- auto curve = std::make_shared<std::vector<float>>(
123
- std::vector<float>{0.1, 0.4, 0.2, 0.8, 0.5});
124
+ auto curve = std::make_shared<std::vector<float>>(std::vector<float>{0.1, 0.4, 0.2, 0.8, 0.5});
124
125
  param.setValueCurveAtTime(curve, curve->size(), 0.1, 0.2);
125
126
  // 5 elements over 0.2s => each element is 0.04s apart
126
127
 
@@ -0,0 +1,113 @@
1
+ #include <audioapi/core/OfflineAudioContext.h>
2
+ #include <audioapi/core/destinations/AudioDestinationNode.h>
3
+ #include <audioapi/core/sources/AudioScheduledSourceNode.h>
4
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
5
+ #include <audioapi/utils/AudioBus.h>
6
+ #include <gtest/gtest.h>
7
+ #include <test/src/MockAudioEventHandlerRegistry.h>
8
+ #include <memory>
9
+
10
+ using namespace audioapi;
11
+ static constexpr int SAMPLE_RATE = 44100;
12
+ static constexpr int RENDER_QUANTUM = 128;
13
+ static constexpr double RENDER_QUANTUM_TIME = static_cast<double>(RENDER_QUANTUM) / SAMPLE_RATE;
14
+
15
+ class AudioScheduledSourceTest : 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 * SAMPLE_RATE, SAMPLE_RATE, eventRegistry, RuntimeRegistry{});
24
+ }
25
+ };
26
+
27
+ class TestableAudioScheduledSourceNode : public AudioScheduledSourceNode {
28
+ public:
29
+ explicit TestableAudioScheduledSourceNode(BaseAudioContext *context)
30
+ : AudioScheduledSourceNode(context) {
31
+ isInitialized_ = true;
32
+ }
33
+
34
+ void updatePlaybackInfo(
35
+ const std::shared_ptr<AudioBus> &processingBus,
36
+ int framesToProcess,
37
+ size_t &startOffset,
38
+ size_t &nonSilentFramesToProcess) {
39
+ AudioScheduledSourceNode::updatePlaybackInfo(
40
+ processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
41
+ }
42
+
43
+ std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus> &, int) override {
44
+ return nullptr;
45
+ }
46
+
47
+ PlaybackState getPlaybackState() const {
48
+ return playbackState_;
49
+ }
50
+
51
+ void playFrames(int frames) {
52
+ size_t startOffset = 0;
53
+ size_t nonSilentFramesToProcess = 0;
54
+ auto processingBus = std::make_shared<AudioBus>(128, 2, static_cast<float>(SAMPLE_RATE));
55
+ updatePlaybackInfo(processingBus, frames, startOffset, nonSilentFramesToProcess);
56
+ context_->getDestination()->renderAudio(processingBus, frames);
57
+ }
58
+ };
59
+
60
+ TEST_F(AudioScheduledSourceTest, IsUnscheduledStateSetCorrectly) {
61
+ auto sourceNode = TestableAudioScheduledSourceNode(context.get());
62
+ EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);
63
+
64
+ sourceNode.start(RENDER_QUANTUM_TIME);
65
+ EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);
66
+ }
67
+
68
+ TEST_F(AudioScheduledSourceTest, IsScheduledStateSetCorrectly) {
69
+ auto sourceNode = TestableAudioScheduledSourceNode(context.get());
70
+ sourceNode.start(RENDER_QUANTUM_TIME);
71
+ EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);
72
+
73
+ sourceNode.playFrames(RENDER_QUANTUM);
74
+ EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);
75
+
76
+ sourceNode.playFrames(1);
77
+ EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);
78
+ }
79
+
80
+ TEST_F(AudioScheduledSourceTest, IsPlayingStateSetCorrectly) {
81
+ auto sourceNode = TestableAudioScheduledSourceNode(context.get());
82
+ sourceNode.start(0);
83
+ sourceNode.stop(RENDER_QUANTUM_TIME);
84
+
85
+ sourceNode.playFrames(RENDER_QUANTUM);
86
+ EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::PLAYING);
87
+
88
+ sourceNode.playFrames(1);
89
+ EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::PLAYING);
90
+ }
91
+
92
+ TEST_F(AudioScheduledSourceTest, IsStopScheduledStateSetCorrectly) {
93
+ auto sourceNode = TestableAudioScheduledSourceNode(context.get());
94
+ sourceNode.start(0);
95
+ sourceNode.stop(RENDER_QUANTUM_TIME);
96
+ sourceNode.playFrames(1); // start playing
97
+ sourceNode.playFrames(RENDER_QUANTUM);
98
+ EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);
99
+
100
+ sourceNode.playFrames(1);
101
+ EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);
102
+ }
103
+
104
+ TEST_F(AudioScheduledSourceTest, IsFinishedStateSetCorrectly) {
105
+ auto sourceNode = TestableAudioScheduledSourceNode(context.get());
106
+ sourceNode.start(0);
107
+ sourceNode.stop(RENDER_QUANTUM_TIME);
108
+ sourceNode.playFrames(1); // start playing
109
+
110
+ sourceNode.playFrames(RENDER_QUANTUM);
111
+ sourceNode.playFrames(1);
112
+ EXPECT_TRUE(sourceNode.isFinished());
113
+ }