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
@@ -3,9 +3,9 @@
3
3
  #include <audioapi/core/sources/AudioScheduledSourceNode.h>
4
4
  #include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
5
5
 
6
+ #include <atomic>
6
7
  #include <memory>
7
8
  #include <mutex>
8
- #include <atomic>
9
9
 
10
10
  namespace audioapi {
11
11
 
@@ -19,55 +19,58 @@ class AudioBufferBaseSourceNode : public AudioScheduledSourceNode {
19
19
  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
20
20
  [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;
21
21
 
22
- void clearOnPositionChangedCallback();
23
22
  void setOnPositionChangedCallbackId(uint64_t callbackId);
24
23
  void setOnPositionChangedInterval(int interval);
25
24
  [[nodiscard]] int getOnPositionChangedInterval() const;
25
+ [[nodiscard]] double getInputLatency() const;
26
+ [[nodiscard]] double getOutputLatency() const;
26
27
 
27
28
  protected:
28
- // pitch correction
29
- bool pitchCorrection_;
29
+ // pitch correction
30
+ bool pitchCorrection_;
30
31
 
31
- std::mutex bufferLock_;
32
+ std::mutex bufferLock_;
32
33
 
33
- // pitch correction
34
- std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
35
- std::shared_ptr<AudioBus> playbackRateBus_;
34
+ // pitch correction
35
+ std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;
36
+ std::shared_ptr<AudioBus> playbackRateBus_;
36
37
 
37
- // k-rate params
38
- std::shared_ptr<AudioParam> detuneParam_;
39
- std::shared_ptr<AudioParam> playbackRateParam_;
38
+ // k-rate params
39
+ std::shared_ptr<AudioParam> detuneParam_;
40
+ std::shared_ptr<AudioParam> playbackRateParam_;
40
41
 
41
- // internal helper
42
- double vReadIndex_;
42
+ // internal helper
43
+ double vReadIndex_;
43
44
 
44
- std::atomic<uint64_t> onPositionChangedCallbackId_ = 0; // 0 means no callback
45
- int onPositionChangedInterval_;
46
- int onPositionChangedTime_ = 0;
45
+ std::atomic<uint64_t> onPositionChangedCallbackId_ = 0; // 0 means no callback
46
+ int onPositionChangedInterval_;
47
+ int onPositionChangedTime_ = 0;
47
48
 
48
- std::mutex &getBufferLock();
49
- virtual double getCurrentPosition() const = 0;
49
+ std::mutex &getBufferLock();
50
+ virtual double getCurrentPosition() const = 0;
50
51
 
51
- void sendOnPositionChangedEvent();
52
+ void sendOnPositionChangedEvent();
52
53
 
53
- void processWithPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
54
- int framesToProcess);
55
- void processWithoutPitchCorrection(const std::shared_ptr<AudioBus> &processingBus,
56
- int framesToProcess);
54
+ void processWithPitchCorrection(
55
+ const std::shared_ptr<AudioBus> &processingBus,
56
+ int framesToProcess);
57
+ void processWithoutPitchCorrection(
58
+ const std::shared_ptr<AudioBus> &processingBus,
59
+ int framesToProcess);
57
60
 
58
- float getComputedPlaybackRateValue(int framesToProcess);
61
+ float getComputedPlaybackRateValue(int framesToProcess);
59
62
 
60
- virtual void processWithoutInterpolation(
61
- const std::shared_ptr<AudioBus>& processingBus,
62
- size_t startOffset,
63
- size_t offsetLength,
64
- float playbackRate) = 0;
63
+ virtual void processWithoutInterpolation(
64
+ const std::shared_ptr<AudioBus> &processingBus,
65
+ size_t startOffset,
66
+ size_t offsetLength,
67
+ float playbackRate) = 0;
65
68
 
66
- virtual void processWithInterpolation(
67
- const std::shared_ptr<AudioBus>& processingBus,
68
- size_t startOffset,
69
- size_t offsetLength,
70
- float playbackRate) = 0;
69
+ virtual void processWithInterpolation(
70
+ const std::shared_ptr<AudioBus> &processingBus,
71
+ size_t startOffset,
72
+ size_t offsetLength,
73
+ float playbackRate) = 0;
71
74
  };
72
75
 
73
76
  } // namespace audioapi
@@ -8,6 +8,13 @@
8
8
  #include <audioapi/utils/AudioArray.h>
9
9
  #include <audioapi/utils/AudioBus.h>
10
10
 
11
+ #include <algorithm>
12
+ #include <memory>
13
+ #include <queue>
14
+ #include <string>
15
+ #include <unordered_map>
16
+ #include <utility>
17
+
11
18
  namespace audioapi {
12
19
 
13
20
  AudioBufferQueueSourceNode::AudioBufferQueueSourceNode(
@@ -17,6 +24,18 @@ AudioBufferQueueSourceNode::AudioBufferQueueSourceNode(
17
24
  buffers_ = {};
18
25
  stretch_->presetDefault(channelCount_, context_->getSampleRate());
19
26
 
27
+ if (pitchCorrection) {
28
+ // If pitch correction is enabled, add extra frames at the end
29
+ // to compensate for processing latency.
30
+ addExtraTailFrames_ = true;
31
+
32
+ int extraTailFrames = static_cast<int>(stretch_->inputLatency() + stretch_->outputLatency());
33
+ tailBuffer_ =
34
+ std::make_shared<AudioBuffer>(channelCount_, extraTailFrames, context_->getSampleRate());
35
+
36
+ tailBuffer_->bus_->zero();
37
+ }
38
+
20
39
  isInitialized_ = true;
21
40
  }
22
41
 
@@ -31,13 +50,29 @@ void AudioBufferQueueSourceNode::stop(double when) {
31
50
  isPaused_ = false;
32
51
  }
33
52
 
53
+ void AudioBufferQueueSourceNode::start(double when) {
54
+ isPaused_ = false;
55
+ stopTime_ = -1.0;
56
+ AudioScheduledSourceNode::start(when);
57
+ }
58
+
59
+ void AudioBufferQueueSourceNode::start(double when, double offset) {
60
+ start(when);
61
+
62
+ if (buffers_.empty()) {
63
+ return;
64
+ }
65
+
66
+ offset = std::min(offset, buffers_.front().second->getDuration());
67
+ vReadIndex_ = static_cast<double>(buffers_.front().second->getSampleRate() * offset);
68
+ }
69
+
34
70
  void AudioBufferQueueSourceNode::pause() {
35
71
  AudioScheduledSourceNode::stop(0.0);
36
72
  isPaused_ = true;
37
73
  }
38
74
 
39
- std::string AudioBufferQueueSourceNode::enqueueBuffer(
40
- const std::shared_ptr<AudioBuffer> &buffer) {
75
+ std::string AudioBufferQueueSourceNode::enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer) {
41
76
  auto locker = Locker(getBufferLock());
42
77
  buffers_.emplace(bufferId_, buffer);
43
78
 
@@ -79,6 +114,7 @@ void AudioBufferQueueSourceNode::disable() {
79
114
  playbackState_ = PlaybackState::UNSCHEDULED;
80
115
  startTime_ = -1.0;
81
116
  stopTime_ = -1.0;
117
+ isPaused_ = false;
82
118
 
83
119
  return;
84
120
  }
@@ -112,8 +148,7 @@ std::shared_ptr<AudioBus> AudioBufferQueueSourceNode::processNode(
112
148
  }
113
149
 
114
150
  double AudioBufferQueueSourceNode::getCurrentPosition() const {
115
- return dsp::sampleFrameToTime(
116
- static_cast<int>(vReadIndex_), context_->getSampleRate()) +
151
+ return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), context_->getSampleRate()) +
117
152
  playedBuffersDuration_;
118
153
  }
119
154
 
@@ -145,8 +180,7 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
145
180
  assert(readIndex + framesToCopy <= buffer->getLength());
146
181
  assert(writeIndex + framesToCopy <= processingBus->getSize());
147
182
 
148
- processingBus->copy(
149
- buffer->bus_.get(), readIndex, writeIndex, framesToCopy);
183
+ processingBus->copy(buffer->bus_.get(), readIndex, writeIndex, framesToCopy);
150
184
 
151
185
  writeIndex += framesToCopy;
152
186
  readIndex += framesToCopy;
@@ -162,10 +196,17 @@ void AudioBufferQueueSourceNode::processWithoutInterpolation(
162
196
  "ended", onEndedCallbackId_, body);
163
197
 
164
198
  if (buffers_.empty()) {
165
- processingBus->zero(writeIndex, framesLeft);
166
- readIndex = 0;
199
+ if (addExtraTailFrames_) {
200
+ buffers_.emplace(bufferId_, tailBuffer_);
201
+ bufferId_++;
167
202
 
168
- break;
203
+ addExtraTailFrames_ = false;
204
+ } else if (buffers_.empty()) {
205
+ processingBus->zero(writeIndex, framesLeft);
206
+ readIndex = 0;
207
+
208
+ break;
209
+ }
169
210
  }
170
211
 
171
212
  data = buffers_.front();
@@ -194,8 +235,7 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
194
235
  while (framesLeft > 0) {
195
236
  auto readIndex = static_cast<size_t>(vReadIndex_);
196
237
  size_t nextReadIndex = readIndex + 1;
197
- auto factor =
198
- static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
238
+ auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
199
239
 
200
240
  bool crossBufferInterpolation = false;
201
241
  std::shared_ptr<AudioBuffer> nextBuffer = nullptr;
@@ -220,11 +260,10 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
220
260
  const float *nextSource = nextBuffer->bus_->getChannel(i)->getData();
221
261
  float currentSample = currentSource[readIndex];
222
262
  float nextSample = nextSource[nextReadIndex];
223
- destination[writeIndex] =
224
- currentSample + factor * (nextSample - currentSample);
263
+ destination[writeIndex] = currentSample + factor * (nextSample - currentSample);
225
264
  } else {
226
- destination[writeIndex] = dsp::linearInterpolate(
227
- currentSource, readIndex, nextReadIndex, factor);
265
+ destination[writeIndex] =
266
+ dsp::linearInterpolate(currentSource, readIndex, nextReadIndex, factor);
228
267
  }
229
268
  }
230
269
 
@@ -237,8 +276,7 @@ void AudioBufferQueueSourceNode::processWithInterpolation(
237
276
  playedBuffersDuration_ += buffer->getDuration();
238
277
  buffers_.pop();
239
278
 
240
- std::unordered_map<std::string, EventValue> body = {
241
- {"bufferId", std::to_string(bufferId)}};
279
+ std::unordered_map<std::string, EventValue> body = {{"bufferId", std::to_string(bufferId)}};
242
280
  context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
243
281
  "ended", onEndedCallbackId_, body);
244
282
 
@@ -4,11 +4,11 @@
4
4
  #include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
5
5
  #include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
6
6
 
7
- #include <memory>
8
- #include <cstddef>
9
7
  #include <algorithm>
10
- #include <string>
8
+ #include <cstddef>
9
+ #include <memory>
11
10
  #include <queue>
11
+ #include <string>
12
12
 
13
13
  namespace audioapi {
14
14
 
@@ -17,41 +17,48 @@ class AudioParam;
17
17
 
18
18
  class AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode {
19
19
  public:
20
- explicit AudioBufferQueueSourceNode(BaseAudioContext *context, bool pitchCorrection);
21
- ~AudioBufferQueueSourceNode() override;
20
+ explicit AudioBufferQueueSourceNode(BaseAudioContext *context, bool pitchCorrection);
21
+ ~AudioBufferQueueSourceNode() override;
22
+
23
+ void stop(double when) override;
22
24
 
23
- void stop(double when) override;
24
- void pause();
25
+ void start(double when) override;
26
+ void start(double when, double offset);
27
+ void pause();
25
28
 
26
- std::string enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer);
27
- void dequeueBuffer(size_t bufferId);
28
- void clearBuffers();
29
- void disable() override;
29
+ std::string enqueueBuffer(const std::shared_ptr<AudioBuffer> &buffer);
30
+ void dequeueBuffer(size_t bufferId);
31
+ void clearBuffers();
32
+ void disable() override;
30
33
 
31
34
  protected:
32
- std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
33
- double getCurrentPosition() const override;
35
+ std::shared_ptr<AudioBus> processNode(
36
+ const std::shared_ptr<AudioBus> &processingBus,
37
+ int framesToProcess) override;
38
+ double getCurrentPosition() const override;
34
39
 
35
40
  private:
36
- // User provided buffers
37
- std::queue<std::pair<size_t, std::shared_ptr<AudioBuffer>>> buffers_;
38
- size_t bufferId_ = 0;
41
+ // User provided buffers
42
+ std::queue<std::pair<size_t, std::shared_ptr<AudioBuffer>>> buffers_;
43
+ size_t bufferId_ = 0;
39
44
 
40
- bool isPaused_ = false;
45
+ bool isPaused_ = false;
46
+ bool addExtraTailFrames_ = false;
47
+ std::shared_ptr<AudioBuffer> tailBuffer_;
41
48
 
42
- double playedBuffersDuration_ = 0;
49
+ double playedBuffersDuration_ = 0;
43
50
 
44
- void processWithoutInterpolation(
45
- const std::shared_ptr<AudioBus>& processingBus,
46
- size_t startOffset,
47
- size_t offsetLength,
48
- float playbackRate) override;
51
+ void processWithoutInterpolation(
52
+ const std::shared_ptr<AudioBus> &processingBus,
53
+ size_t startOffset,
54
+ size_t offsetLength,
55
+ float playbackRate) override;
49
56
 
50
- void processWithInterpolation(
51
- const std::shared_ptr<AudioBus>& processingBus,
52
- size_t startOffset,
53
- size_t offsetLength,
54
- float playbackRate) override;
57
+ void processWithInterpolation(
58
+ const std::shared_ptr<AudioBus> &processingBus,
59
+ size_t startOffset,
60
+ size_t offsetLength,
61
+ float playbackRate) override;
55
62
  };
56
63
 
57
64
  } // namespace audioapi
@@ -7,12 +7,12 @@
7
7
  #include <audioapi/events/AudioEventHandlerRegistry.h>
8
8
  #include <audioapi/utils/AudioArray.h>
9
9
  #include <audioapi/utils/AudioBus.h>
10
+ #include <algorithm>
11
+ #include <memory>
10
12
 
11
13
  namespace audioapi {
12
14
 
13
- AudioBufferSourceNode::AudioBufferSourceNode(
14
- BaseAudioContext *context,
15
- bool pitchCorrection)
15
+ AudioBufferSourceNode::AudioBufferSourceNode(BaseAudioContext *context, bool pitchCorrection)
16
16
  : AudioBufferBaseSourceNode(context, pitchCorrection),
17
17
  loop_(false),
18
18
  loopSkip_(false),
@@ -70,8 +70,7 @@ void AudioBufferSourceNode::setLoopEnd(double loopEnd) {
70
70
  loopEnd_ = loopEnd;
71
71
  }
72
72
 
73
- void AudioBufferSourceNode::setBuffer(
74
- const std::shared_ptr<AudioBuffer> &buffer) {
73
+ void AudioBufferSourceNode::setBuffer(const std::shared_ptr<AudioBuffer> &buffer) {
75
74
  Locker locker(getBufferLock());
76
75
 
77
76
  if (!buffer) {
@@ -82,17 +81,29 @@ void AudioBufferSourceNode::setBuffer(
82
81
  }
83
82
 
84
83
  buffer_ = buffer;
85
- alignedBus_ = std::make_shared<AudioBus>(*buffer_->bus_);
86
84
  channelCount_ = buffer_->getNumberOfChannels();
87
85
 
88
- audioBus_ = std::make_shared<AudioBus>(
89
- RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
90
- playbackRateBus_ = std::make_shared<AudioBus>(
91
- RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
86
+ stretch_->presetDefault(channelCount_, buffer_->getSampleRate());
92
87
 
93
- loopEnd_ = buffer_->getDuration();
88
+ if (pitchCorrection_) {
89
+ int extraTailFrames =
90
+ static_cast<int>((getInputLatency() + getOutputLatency()) * context_->getSampleRate());
91
+ size_t totalSize = buffer_->getLength() + extraTailFrames;
94
92
 
95
- stretch_->presetDefault(channelCount_, buffer_->getSampleRate());
93
+ alignedBus_ = std::make_shared<AudioBus>(totalSize, channelCount_, buffer_->getSampleRate());
94
+ alignedBus_->copy(buffer_->bus_.get(), 0, 0, buffer_->getLength());
95
+
96
+ alignedBus_->zero(buffer_->getLength(), extraTailFrames);
97
+ } else {
98
+ alignedBus_ = std::make_shared<AudioBus>(*buffer_->bus_);
99
+ }
100
+
101
+ audioBus_ =
102
+ std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
103
+ playbackRateBus_ =
104
+ std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE * 3, channelCount_, context_->getSampleRate());
105
+
106
+ loopEnd_ = buffer_->getDuration();
96
107
  }
97
108
 
98
109
  void AudioBufferSourceNode::start(double when, double offset, double duration) {
@@ -106,10 +117,8 @@ void AudioBufferSourceNode::start(double when, double offset, double duration) {
106
117
  return;
107
118
  }
108
119
 
109
- offset = std::min(
110
- offset,
111
- static_cast<double>(alignedBus_->getSize()) /
112
- alignedBus_->getSampleRate());
120
+ offset =
121
+ std::min(offset, static_cast<double>(alignedBus_->getSize()) / alignedBus_->getSampleRate());
113
122
 
114
123
  if (loop_) {
115
124
  offset = std::min(offset, loopEnd_);
@@ -123,19 +132,12 @@ void AudioBufferSourceNode::disable() {
123
132
  alignedBus_.reset();
124
133
  }
125
134
 
126
- void AudioBufferSourceNode::clearOnLoopEndedCallback() {
127
- if (onLoopEndedCallbackId_ == 0 || context_ == nullptr ||
128
- context_->audioEventHandlerRegistry_ == nullptr) {
129
- return;
130
- }
131
-
132
- context_->audioEventHandlerRegistry_->unregisterHandler(
133
- "loopEnded", onLoopEndedCallbackId_);
134
- onLoopEndedCallbackId_ = 0;
135
- }
136
-
137
135
  void AudioBufferSourceNode::setOnLoopEndedCallbackId(uint64_t callbackId) {
138
- onLoopEndedCallbackId_ = callbackId;
136
+ auto oldCallbackId = onLoopEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
137
+
138
+ if (oldCallbackId != 0) {
139
+ audioEventHandlerRegistry_->unregisterHandler("loopEnded", oldCallbackId);
140
+ }
139
141
  }
140
142
 
141
143
  std::shared_ptr<AudioBus> AudioBufferSourceNode::processNode(
@@ -163,16 +165,13 @@ std::shared_ptr<AudioBus> AudioBufferSourceNode::processNode(
163
165
  }
164
166
 
165
167
  double AudioBufferSourceNode::getCurrentPosition() const {
166
- return dsp::sampleFrameToTime(
167
- static_cast<int>(vReadIndex_), buffer_->getSampleRate());
168
+ return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), buffer_->getSampleRate());
168
169
  }
169
170
 
170
171
  void AudioBufferSourceNode::sendOnLoopEndedEvent() {
171
- auto onLoopEndedCallbackId =
172
- onLoopEndedCallbackId_.load(std::memory_order_acquire);
172
+ auto onLoopEndedCallbackId = onLoopEndedCallbackId_.load(std::memory_order_acquire);
173
173
  if (onLoopEndedCallbackId != 0) {
174
- context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
175
- "loopEnded", onLoopEndedCallbackId_, {});
174
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody("loopEnded", onLoopEndedCallbackId, {});
176
175
  }
177
176
  }
178
177
 
@@ -199,10 +198,9 @@ void AudioBufferSourceNode::processWithoutInterpolation(
199
198
  // if we are moving towards loop, we do nothing because we will achieve it
200
199
  // otherwise, we wrap to the start of the loop if necessary
201
200
  if (loop_ &&
202
- ((readIndex >= frameEnd && direction == 1) ||
203
- (readIndex < frameStart && direction == -1))) {
201
+ ((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1))) {
204
202
  readIndex = frameStart +
205
- ((long long int)readIndex - (long long int)frameStart) % frameDelta;
203
+ (static_cast<int64_t>(readIndex) - static_cast<int64_t>(frameStart)) % frameDelta;
206
204
  }
207
205
 
208
206
  while (framesLeft > 0) {
@@ -217,8 +215,7 @@ void AudioBufferSourceNode::processWithoutInterpolation(
217
215
 
218
216
  // Direction is forward, we can normally copy the data
219
217
  if (direction == 1) {
220
- processingBus->copy(
221
- alignedBus_.get(), readIndex, writeIndex, framesToCopy);
218
+ processingBus->copy(alignedBus_.get(), readIndex, writeIndex, framesToCopy);
222
219
  } else {
223
220
  for (int i = 0; i < framesToCopy; i += 1) {
224
221
  for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
@@ -234,8 +231,7 @@ void AudioBufferSourceNode::processWithoutInterpolation(
234
231
 
235
232
  // if we are moving towards loop, we do nothing because we will achieve it
236
233
  // otherwise, we wrap to the start of the loop if necessary
237
- if ((readIndex >= frameEnd && direction == 1) ||
238
- (readIndex < frameStart && direction == -1)) {
234
+ if ((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1)) {
239
235
  readIndex -= direction * frameDelta;
240
236
 
241
237
  if (!loop_) {
@@ -272,15 +268,13 @@ void AudioBufferSourceNode::processWithInterpolation(
272
268
 
273
269
  // Wrap to the start of the loop if necessary
274
270
  if (loop_ && (vReadIndex_ >= vFrameEnd || vReadIndex_ < vFrameStart)) {
275
- vReadIndex_ =
276
- vFrameStart + std::fmod(vReadIndex_ - vFrameStart, vFrameDelta);
271
+ vReadIndex_ = vFrameStart + std::fmod(vReadIndex_ - vFrameStart, vFrameDelta);
277
272
  }
278
273
 
279
274
  while (framesLeft > 0) {
280
275
  auto readIndex = static_cast<size_t>(vReadIndex_);
281
276
  size_t nextReadIndex = readIndex + 1;
282
- auto factor =
283
- static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
277
+ auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));
284
278
 
285
279
  if (nextReadIndex >= frameEnd) {
286
280
  nextReadIndex = loop_ ? frameStart : readIndex;
@@ -290,8 +284,7 @@ void AudioBufferSourceNode::processWithInterpolation(
290
284
  float *destination = processingBus->getChannel(i)->getData();
291
285
  const float *source = alignedBus_->getChannel(i)->getData();
292
286
 
293
- destination[writeIndex] =
294
- dsp::linearInterpolate(source, readIndex, nextReadIndex, factor);
287
+ destination[writeIndex] = dsp::linearInterpolate(source, readIndex, nextReadIndex, factor);
295
288
  }
296
289
 
297
290
  writeIndex += 1;
@@ -315,8 +308,7 @@ void AudioBufferSourceNode::processWithInterpolation(
315
308
  double AudioBufferSourceNode::getVirtualStartFrame() {
316
309
  auto loopStartFrame = loopStart_ * context_->getSampleRate();
317
310
 
318
- return loop_ && loopStartFrame >= 0 && loopStart_ < loopEnd_ ? loopStartFrame
319
- : 0.0;
311
+ return loop_ && loopStartFrame >= 0 && loopStart_ < loopEnd_ ? loopStartFrame : 0.0;
320
312
  }
321
313
 
322
314
  double AudioBufferSourceNode::getVirtualEndFrame() {
@@ -4,9 +4,9 @@
4
4
  #include <audioapi/core/sources/AudioBufferBaseSourceNode.h>
5
5
  #include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>
6
6
 
7
- #include <memory>
8
- #include <cstddef>
9
7
  #include <algorithm>
8
+ #include <cstddef>
9
+ #include <memory>
10
10
  #include <string>
11
11
 
12
12
  namespace audioapi {
@@ -31,14 +31,16 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
31
31
  void setLoopEnd(double loopEnd);
32
32
  void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);
33
33
 
34
+ using AudioScheduledSourceNode::start;
34
35
  void start(double when, double offset, double duration = -1);
35
36
  void disable() override;
36
37
 
37
- void clearOnLoopEndedCallback();
38
38
  void setOnLoopEndedCallbackId(uint64_t callbackId);
39
39
 
40
40
  protected:
41
- std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
41
+ std::shared_ptr<AudioBus> processNode(
42
+ const std::shared_ptr<AudioBus> &processingBus,
43
+ int framesToProcess) override;
42
44
  double getCurrentPosition() const override;
43
45
 
44
46
  private:
@@ -56,13 +58,13 @@ class AudioBufferSourceNode : public AudioBufferBaseSourceNode {
56
58
  void sendOnLoopEndedEvent();
57
59
 
58
60
  void processWithoutInterpolation(
59
- const std::shared_ptr<AudioBus>& processingBus,
61
+ const std::shared_ptr<AudioBus> &processingBus,
60
62
  size_t startOffset,
61
63
  size_t offsetLength,
62
64
  float playbackRate) override;
63
65
 
64
66
  void processWithInterpolation(
65
- const std::shared_ptr<AudioBus>& processingBus,
67
+ const std::shared_ptr<AudioBus> &processingBus,
66
68
  size_t startOffset,
67
69
  size_t offsetLength,
68
70
  float playbackRate) override;
@@ -6,6 +6,14 @@
6
6
  #include <audioapi/utils/AudioArray.h>
7
7
  #include <audioapi/utils/AudioBus.h>
8
8
 
9
+ #if !RN_AUDIO_API_TEST
10
+ #include <audioapi/core/AudioContext.h>
11
+ #endif
12
+
13
+ #include <algorithm>
14
+ #include <limits>
15
+ #include <memory>
16
+
9
17
  namespace audioapi {
10
18
 
11
19
  AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
@@ -14,9 +22,16 @@ AudioScheduledSourceNode::AudioScheduledSourceNode(BaseAudioContext *context)
14
22
  stopTime_(-1.0),
15
23
  playbackState_(PlaybackState::UNSCHEDULED) {
16
24
  numberOfInputs_ = 0;
25
+ audioEventHandlerRegistry_ = context_->audioEventHandlerRegistry_;
17
26
  }
18
27
 
19
28
  void AudioScheduledSourceNode::start(double when) {
29
+ #if !RN_AUDIO_API_TEST
30
+ if (auto context = dynamic_cast<AudioContext *>(context_)) {
31
+ context->start();
32
+ }
33
+ #endif
34
+
20
35
  playbackState_ = PlaybackState::SCHEDULED;
21
36
  startTime_ = when;
22
37
  }
@@ -45,19 +60,12 @@ bool AudioScheduledSourceNode::isStopScheduled() {
45
60
  return playbackState_ == PlaybackState::STOP_SCHEDULED;
46
61
  }
47
62
 
48
- void AudioScheduledSourceNode::clearOnEndedCallback() {
49
- if (onEndedCallbackId_ == 0 || context_ == nullptr ||
50
- context_->audioEventHandlerRegistry_ == nullptr) {
51
- return;
52
- }
53
-
54
- context_->audioEventHandlerRegistry_->unregisterHandler(
55
- "ended", onEndedCallbackId_);
56
- onEndedCallbackId_ = 0;
57
- }
58
-
59
63
  void AudioScheduledSourceNode::setOnEndedCallbackId(const uint64_t callbackId) {
60
- onEndedCallbackId_ = callbackId;
64
+ auto oldCallbackId = onEndedCallbackId_.exchange(callbackId, std::memory_order_acq_rel);
65
+
66
+ if (oldCallbackId != 0) {
67
+ audioEventHandlerRegistry_->unregisterHandler("ended", oldCallbackId);
68
+ }
61
69
  }
62
70
 
63
71
  void AudioScheduledSourceNode::updatePlaybackInfo(
@@ -76,14 +84,11 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
76
84
  auto sampleRate = context_->getSampleRate();
77
85
 
78
86
  size_t firstFrame = context_->getCurrentSampleFrame();
79
- size_t lastFrame = firstFrame + framesToProcess;
80
-
81
- size_t startFrame =
82
- std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
83
- size_t stopFrame = stopTime_ == -1.0
84
- ? std::numeric_limits<size_t>::max()
85
- : dsp::timeToSampleFrame(stopTime_, sampleRate);
87
+ size_t lastFrame = firstFrame + framesToProcess - 1;
86
88
 
89
+ size_t startFrame = std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
90
+ size_t stopFrame = stopTime_ == -1.0 ? std::numeric_limits<size_t>::max()
91
+ : dsp::timeToSampleFrame(stopTime_, sampleRate);
87
92
  if (isFinished()) {
88
93
  startOffset = 0;
89
94
  nonSilentFramesToProcess = 0;
@@ -105,7 +110,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
105
110
  ? std::max(startFrame, firstFrame) - firstFrame
106
111
  : 0;
107
112
  nonSilentFramesToProcess =
108
- std::max(std::min(lastFrame, stopFrame), startFrame) - startFrame;
113
+ std::max(std::min(lastFrame, stopFrame) + 1, startFrame) - startFrame;
109
114
 
110
115
  assert(startOffset <= framesToProcess);
111
116
  assert(nonSilentFramesToProcess <= framesToProcess);
@@ -124,7 +129,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
124
129
 
125
130
  // stop will happen in this render quantum
126
131
  // zero remaining frames after stop frame
127
- if (stopFrame < lastFrame && stopFrame >= firstFrame) {
132
+ if (stopFrame <= lastFrame && stopFrame >= firstFrame) {
128
133
  playbackState_ = PlaybackState::STOP_SCHEDULED;
129
134
  startOffset = 0;
130
135
  nonSilentFramesToProcess = stopFrame - firstFrame;
@@ -160,9 +165,9 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
160
165
  void AudioScheduledSourceNode::disable() {
161
166
  AudioNode::disable();
162
167
 
163
- if (context_->audioEventHandlerRegistry_ != nullptr) {
164
- context_->audioEventHandlerRegistry_->invokeHandlerWithEventBody(
165
- "ended", onEndedCallbackId_, {});
168
+ auto onEndedCallbackId = onEndedCallbackId_.load(std::memory_order_acquire);
169
+ if (onEndedCallbackId != 0) {
170
+ audioEventHandlerRegistry_->invokeHandlerWithEventBody("ended", onEndedCallbackId, {});
166
171
  }
167
172
  }
168
173