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
@@ -4,19 +4,19 @@
4
4
 
5
5
  #include <algorithm>
6
6
  #include <atomic>
7
+ #include <cassert>
7
8
  #include <chrono>
9
+ #include <cstddef>
8
10
  #include <functional>
9
11
  #include <iostream>
10
12
  #include <limits>
11
13
  #include <memory>
12
14
  #include <thread>
13
- #include <cstddef>
14
- #include <cassert>
15
15
  #include <utility>
16
16
 
17
17
  namespace audioapi {
18
18
 
19
- class AudioEventHandlerRegistry;
19
+ class IAudioEventHandlerRegistry;
20
20
 
21
21
  class AudioScheduledSourceNode : public AudioNode {
22
22
  public:
@@ -28,7 +28,7 @@ class AudioScheduledSourceNode : public AudioNode {
28
28
  enum class PlaybackState { UNSCHEDULED, SCHEDULED, PLAYING, STOP_SCHEDULED, FINISHED };
29
29
  explicit AudioScheduledSourceNode(BaseAudioContext *context);
30
30
 
31
- void start(double when);
31
+ virtual void start(double when);
32
32
  virtual void stop(double when);
33
33
 
34
34
  bool isUnscheduled();
@@ -37,7 +37,6 @@ class AudioScheduledSourceNode : public AudioNode {
37
37
  bool isFinished();
38
38
  bool isStopScheduled();
39
39
 
40
- void clearOnEndedCallback();
41
40
  void setOnEndedCallbackId(uint64_t callbackId);
42
41
 
43
42
  void disable() override;
@@ -49,9 +48,10 @@ class AudioScheduledSourceNode : public AudioNode {
49
48
  PlaybackState playbackState_;
50
49
 
51
50
  std::atomic<uint64_t> onEndedCallbackId_ = 0;
51
+ std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;
52
52
 
53
53
  void updatePlaybackInfo(
54
- const std::shared_ptr<AudioBus>& processingBus,
54
+ const std::shared_ptr<AudioBus> &processingBus,
55
55
  int framesToProcess,
56
56
  size_t &startOffset,
57
57
  size_t &nonSilentFramesToProcess);
@@ -3,6 +3,7 @@
3
3
  #include <audioapi/dsp/AudioUtils.h>
4
4
  #include <audioapi/utils/AudioArray.h>
5
5
  #include <audioapi/utils/AudioBus.h>
6
+ #include <memory>
6
7
 
7
8
  namespace audioapi {
8
9
  ConstantSourceNode::ConstantSourceNode(BaseAudioContext *context)
@@ -29,13 +30,11 @@ std::shared_ptr<AudioBus> ConstantSourceNode::processNode(
29
30
  return processingBus;
30
31
  }
31
32
 
32
- auto offsetBus = offsetParam_->processARateParam(
33
- framesToProcess, context_->getCurrentTime());
33
+ auto offsetBus = offsetParam_->processARateParam(framesToProcess, context_->getCurrentTime());
34
34
 
35
35
  auto offsetChannelData = offsetBus->getChannel(0)->getData();
36
36
 
37
- for (int channel = 0; channel < processingBus->getNumberOfChannels();
38
- ++channel) {
37
+ for (int channel = 0; channel < processingBus->getNumberOfChannels(); ++channel) {
39
38
  auto outputChannelData = processingBus->getChannel(channel)->getData();
40
39
 
41
40
  std::copy(
@@ -18,7 +18,9 @@ class ConstantSourceNode : public AudioScheduledSourceNode {
18
18
  [[nodiscard]] std::shared_ptr<AudioParam> getOffsetParam() const;
19
19
 
20
20
  protected:
21
- std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
21
+ std::shared_ptr<AudioBus> processNode(
22
+ const std::shared_ptr<AudioBus> &processingBus,
23
+ int framesToProcess) override;
22
24
 
23
25
  private:
24
26
  std::shared_ptr<AudioParam> offsetParam_;
@@ -3,16 +3,14 @@
3
3
  #include <audioapi/dsp/AudioUtils.h>
4
4
  #include <audioapi/utils/AudioArray.h>
5
5
  #include <audioapi/utils/AudioBus.h>
6
+ #include <memory>
7
+ #include <string>
6
8
 
7
9
  namespace audioapi {
8
10
 
9
- OscillatorNode::OscillatorNode(BaseAudioContext *context)
10
- : AudioScheduledSourceNode(context) {
11
+ OscillatorNode::OscillatorNode(BaseAudioContext *context) : AudioScheduledSourceNode(context) {
11
12
  frequencyParam_ = std::make_shared<AudioParam>(
12
- 444.0,
13
- -context_->getNyquistFrequency(),
14
- context_->getNyquistFrequency(),
15
- context);
13
+ 444.0, -context_->getNyquistFrequency(), context_->getNyquistFrequency(), context);
16
14
  detuneParam_ = std::make_shared<AudioParam>(
17
15
  0.0,
18
16
  -1200 * LOG2_MOST_POSITIVE_SINGLE_FLOAT,
@@ -21,8 +19,7 @@ OscillatorNode::OscillatorNode(BaseAudioContext *context)
21
19
  type_ = OscillatorType::SINE;
22
20
  periodicWave_ = context_->getBasicWaveForm(type_);
23
21
 
24
- audioBus_ = std::make_shared<AudioBus>(
25
- RENDER_QUANTUM_SIZE, 1, context_->getSampleRate());
22
+ audioBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, 1, context_->getSampleRate());
26
23
 
27
24
  isInitialized_ = true;
28
25
  }
@@ -44,8 +41,7 @@ void OscillatorNode::setType(const std::string &type) {
44
41
  periodicWave_ = context_->getBasicWaveForm(type_);
45
42
  }
46
43
 
47
- void OscillatorNode::setPeriodicWave(
48
- const std::shared_ptr<PeriodicWave> &periodicWave) {
44
+ void OscillatorNode::setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave) {
49
45
  periodicWave_ = periodicWave;
50
46
  type_ = OscillatorType::CUSTOM;
51
47
  }
@@ -65,29 +61,22 @@ std::shared_ptr<AudioBus> OscillatorNode::processNode(
65
61
 
66
62
  auto time = context_->getCurrentTime() +
67
63
  static_cast<double>(startOffset) * 1.0 / context_->getSampleRate();
68
- auto detuneParamValues =
69
- detuneParam_->processARateParam(framesToProcess, time);
70
- auto frequencyParamValues =
71
- frequencyParam_->processARateParam(framesToProcess, time);
64
+ auto detuneParamValues = detuneParam_->processARateParam(framesToProcess, time);
65
+ auto frequencyParamValues = frequencyParam_->processARateParam(framesToProcess, time);
72
66
 
73
67
  for (size_t i = startOffset; i < offsetLength; i += 1) {
74
- auto detuneRatio = std::pow(
75
- 2.0f, detuneParamValues->getChannel(0)->getData()[i] / 1200.0f);
76
- auto detunedFrequency =
77
- frequencyParamValues->getChannel(0)->getData()[i] * detuneRatio;
68
+ auto detuneRatio = std::pow(2.0f, detuneParamValues->getChannel(0)->getData()[i] / 1200.0f);
69
+ auto detunedFrequency = frequencyParamValues->getChannel(0)->getData()[i] * detuneRatio;
78
70
  auto phaseIncrement = detunedFrequency * periodicWave_->getScale();
79
71
 
80
- float sample =
81
- periodicWave_->getSample(detunedFrequency, phase_, phaseIncrement);
72
+ float sample = periodicWave_->getSample(detunedFrequency, phase_, phaseIncrement);
82
73
 
83
74
  for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
84
75
  (*processingBus->getChannel(j))[i] = sample;
85
76
  }
86
77
 
87
78
  phase_ += phaseIncrement;
88
- phase_ -=
89
- floor(
90
- phase_ / static_cast<float>(periodicWave_->getPeriodicWaveSize())) *
79
+ phase_ -= floor(phase_ / static_cast<float>(periodicWave_->getPeriodicWaveSize())) *
91
80
  static_cast<float>(periodicWave_->getPeriodicWaveSize());
92
81
  }
93
82
 
@@ -1,10 +1,11 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/core/AudioParam.h>
4
+ #include <audioapi/core/effects/PeriodicWave.h>
4
5
  #include <audioapi/core/sources/AudioScheduledSourceNode.h>
5
6
  #include <audioapi/core/types/OscillatorType.h>
6
- #include <audioapi/core/effects/PeriodicWave.h>
7
7
 
8
+ #include <algorithm>
8
9
  #include <cmath>
9
10
  #include <memory>
10
11
  #include <string>
@@ -24,7 +25,9 @@ class OscillatorNode : public AudioScheduledSourceNode {
24
25
  void setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave);
25
26
 
26
27
  protected:
27
- std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
28
+ std::shared_ptr<AudioBus> processNode(
29
+ const std::shared_ptr<AudioBus> &processingBus,
30
+ int framesToProcess) override;
28
31
 
29
32
  private:
30
33
  std::shared_ptr<AudioParam> frequencyParam_;
@@ -35,8 +38,7 @@ class OscillatorNode : public AudioScheduledSourceNode {
35
38
 
36
39
  static OscillatorType fromString(const std::string &type) {
37
40
  std::string lowerType = type;
38
- std::transform(
39
- lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
41
+ std::transform(lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
40
42
 
41
43
  if (lowerType == "sine")
42
44
  return OscillatorType::SINE;
@@ -1,7 +1,10 @@
1
1
 
2
2
  #include <audioapi/core/sources/RecorderAdapterNode.h>
3
+ #include <audioapi/core/types/ChannelInterpretation.h>
4
+ #include <audioapi/core/utils/Constants.h>
3
5
  #include <audioapi/utils/AudioArray.h>
4
6
  #include <audioapi/utils/AudioBus.h>
7
+ #include <memory>
5
8
  #include <type_traits>
6
9
 
7
10
  namespace audioapi {
@@ -14,36 +17,60 @@ RecorderAdapterNode::RecorderAdapterNode(BaseAudioContext *context) noexcept(
14
17
  isInitialized_ = false;
15
18
  }
16
19
 
17
- void RecorderAdapterNode::init(size_t bufferSize) {
20
+ void RecorderAdapterNode::init(size_t bufferSize, int channelCount) {
18
21
  if (isInitialized_) {
19
- throw std::runtime_error(
20
- "RecorderAdapterNode should not be initialized more than once. Just create a new instance.");
22
+ return;
21
23
  }
24
+
25
+ channelCount_ = channelCount;
26
+
27
+ buff_.resize(channelCount_);
28
+
29
+ for (size_t i = 0; i < channelCount_; ++i) {
30
+ buff_[i] = std::make_shared<CircularOverflowableAudioArray>(bufferSize);
31
+ }
32
+
33
+ // This assumes that the sample rate is the same in audio context and recorder.
34
+ // (recorder is not enforcing any sample rate on the system*). This means that only
35
+ // channel mixing might be required. To do so, we create an output bus with
36
+ // the desired channel count and will take advantage of the AudioBus sum method.
37
+ //
38
+ // * any allocations required by the recorder (including this method) are during recording start
39
+ // or after, which means that audio context has already setup the system in 99% of sane cases.
40
+ // But if we would like to support cases when context is created on the fly during recording,
41
+ // we would need to add sample rate conversion as well or other weird bullshit like resampling
42
+ // context output and not enforcing anything on the system output/input configuration.
43
+ // A lot of words for a couple of lines of implementation :shrug:
44
+ adapterOutputBus_ =
45
+ std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
22
46
  isInitialized_ = true;
23
- buff_ = std::make_shared<CircularOverflowableAudioArray>(bufferSize);
47
+ }
48
+
49
+ void RecorderAdapterNode::cleanup() {
50
+ isInitialized_ = false;
51
+ buff_.clear();
52
+ adapterOutputBus_.reset();
24
53
  }
25
54
 
26
55
  std::shared_ptr<AudioBus> RecorderAdapterNode::processNode(
27
56
  const std::shared_ptr<AudioBus> &processingBus,
28
57
  int framesToProcess) {
29
- float *outputChannel = processingBus->getChannel(0)->getData();
30
- readFrames(outputChannel, framesToProcess);
31
-
32
- for (int i = 1; i < processingBus->getNumberOfChannels(); i++) {
33
- processingBus->getChannel(i)->copy(
34
- processingBus->getChannel(0), 0, framesToProcess);
58
+ if (!isInitialized_) {
59
+ processingBus->zero();
60
+ return processingBus;
35
61
  }
36
62
 
63
+ readFrames(framesToProcess);
64
+
65
+ processingBus->sum(adapterOutputBus_.get(), ChannelInterpretation::SPEAKERS);
37
66
  return processingBus;
38
67
  }
39
68
 
40
- void RecorderAdapterNode::readFrames(float *output, const size_t framesToRead) {
41
- size_t readFrames = buff_->read(output, framesToRead);
69
+ void RecorderAdapterNode::readFrames(const size_t framesToRead) {
70
+ adapterOutputBus_->zero();
42
71
 
43
- if (readFrames < framesToRead) {
44
- // Fill the rest with silence
45
- std::memset(
46
- output + readFrames, 0, (framesToRead - readFrames) * sizeof(float));
72
+ for (size_t channel = 0; channel < channelCount_; ++channel) {
73
+ buff_[channel]->read(adapterOutputBus_->getChannel(channel)->getData(), framesToRead);
47
74
  }
48
75
  }
49
76
 
@@ -1,11 +1,12 @@
1
1
  #pragma once
2
2
 
3
- #include <audioapi/core/AudioParam.h>
4
3
  #include <audioapi/core/AudioNode.h>
5
- #include <audioapi/core/inputs/AudioRecorder.h>
4
+ #include <audioapi/core/AudioParam.h>
6
5
  #include <audioapi/core/BaseAudioContext.h>
6
+ #include <audioapi/core/inputs/AudioRecorder.h>
7
7
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
8
8
  #include <memory>
9
+ #include <vector>
9
10
 
10
11
  namespace audioapi {
11
12
 
@@ -18,26 +19,30 @@ class AudioBus;
18
19
  /// @note it will push silence if it is not connected to any Recorder
19
20
  class RecorderAdapterNode : public AudioNode {
20
21
  public:
21
- explicit RecorderAdapterNode(BaseAudioContext *context);
22
+ explicit RecorderAdapterNode(BaseAudioContext *context);
23
+
24
+ /// @brief Initialize the RecorderAdapterNode with a buffer size and channel count.
25
+ /// @note This method should be called ONLY ONCE when the buffer size is known.
26
+ /// @param bufferSize The size of the buffer to be used.
27
+ /// @param channelCount The number of channels.
28
+ void init(size_t bufferSize, int channelCount);
29
+ void cleanup();
22
30
 
23
- /// @brief Initialize the RecorderAdapterNode with a buffer size.
24
- /// @note This method should be called ONLY ONCE when the buffer size is known.
25
- /// @throws std::runtime_error if the node is already initialized.
26
- /// @param bufferSize The size of the buffer to be used.
27
- void init(size_t bufferSize);
31
+ int channelCount_;
32
+ // TODO: CircularOverflowableAudioBus
33
+ std::vector<std::shared_ptr<CircularOverflowableAudioArray>> buff_;
28
34
 
29
35
  protected:
30
- std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus>& processingBus, int framesToProcess) override;
31
- std::shared_ptr<CircularOverflowableAudioArray> buff_;
36
+ std::shared_ptr<AudioBus> processNode(
37
+ const std::shared_ptr<AudioBus> &processingBus,
38
+ int framesToProcess) override;
39
+ std::shared_ptr<AudioBus> adapterOutputBus_;
32
40
 
33
41
  private:
34
- /// @brief Read audio frames from the recorder's internal adapterBuffer.
35
- /// @note If `framesToRead` is greater than the number of available frames, it will fill empty space with silence.
36
- /// @param output Pointer to the output buffer.
37
- /// @param framesToRead Number of frames to read.
38
- void readFrames(float *output, size_t framesToRead);
39
-
40
- friend class AudioRecorder;
42
+ /// @brief Read audio frames from the recorder's internal circular buffer into output buss.
43
+ /// @note If `framesToRead` is greater than the number of available frames, it will fill empty space with silence.
44
+ /// @param framesToRead Number of frames to read.
45
+ void readFrames(size_t framesToRead);
41
46
  };
42
47
 
43
48
  } // namespace audioapi
@@ -15,8 +15,13 @@
15
15
  #include <audioapi/utils/AudioArray.h>
16
16
  #include <audioapi/utils/AudioBus.h>
17
17
  #include <chrono>
18
+ #include <cstdio>
19
+ #include <memory>
20
+ #include <string>
21
+ #include <utility>
18
22
 
19
23
  namespace audioapi {
24
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
20
25
  StreamerNode::StreamerNode(BaseAudioContext *context)
21
26
  : AudioScheduledSourceNode(context),
22
27
  fmtCtx_(nullptr),
@@ -25,20 +30,24 @@ StreamerNode::StreamerNode(BaseAudioContext *context)
25
30
  codecpar_(nullptr),
26
31
  pkt_(nullptr),
27
32
  frame_(nullptr),
28
- pendingFrame_(nullptr),
29
- bufferedBus_(nullptr),
30
- bufferedBusIndex_(0),
31
- maxBufferSize_(0),
32
- audio_stream_index_(-1),
33
33
  swrCtx_(nullptr),
34
34
  resampledData_(nullptr),
35
- maxResampledSamples_(0) {}
35
+ bufferedBus_(nullptr),
36
+ audio_stream_index_(-1),
37
+ maxResampledSamples_(0),
38
+ processedSamples_(0) {}
39
+ #else
40
+ StreamerNode::StreamerNode(BaseAudioContext *context) : AudioScheduledSourceNode(context) {}
41
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
36
42
 
37
43
  StreamerNode::~StreamerNode() {
44
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
38
45
  cleanup();
46
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
39
47
  }
40
48
 
41
49
  bool StreamerNode::initialize(const std::string &input_url) {
50
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
42
51
  if (isInitialized_) {
43
52
  cleanup();
44
53
  }
@@ -66,26 +75,77 @@ bool StreamerNode::initialize(const std::string &input_url) {
66
75
  return false;
67
76
  }
68
77
 
69
- maxBufferSize_ = BUFFER_LENGTH_SECONDS * codecCtx_->sample_rate;
70
- // If decoding is faster than playing, we buffer few seconds of audio
71
- bufferedBus_ = std::make_shared<AudioBus>(
72
- maxBufferSize_, codecpar_->ch_layout.nb_channels, codecCtx_->sample_rate);
73
-
74
78
  channelCount_ = codecpar_->ch_layout.nb_channels;
75
- audioBus_ = std::make_shared<AudioBus>(
76
- RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
79
+ audioBus_ =
80
+ std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, context_->getSampleRate());
81
+
82
+ auto [sender, receiver] = channels::spsc::channel<
83
+ StreamingData,
84
+ channels::spsc::OverflowStrategy::WAIT_ON_FULL,
85
+ channels::spsc::WaitStrategy::ATOMIC_WAIT>(CHANNEL_CAPACITY);
86
+ sender_ = std::move(sender);
87
+ receiver_ = std::move(receiver);
77
88
 
78
89
  streamingThread_ = std::thread(&StreamerNode::streamAudio, this);
79
- streamFlag.store(true);
80
90
  isInitialized_ = true;
81
91
  return true;
92
+ #else
93
+ return false;
94
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
82
95
  }
83
96
 
84
- void StreamerNode::stop(double when) {
85
- AudioScheduledSourceNode::stop(when);
86
- streamFlag.store(false);
97
+ std::shared_ptr<AudioBus> StreamerNode::processNode(
98
+ const std::shared_ptr<AudioBus> &processingBus,
99
+ int framesToProcess) {
100
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
101
+ size_t startOffset = 0;
102
+ size_t offsetLength = 0;
103
+ updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
104
+ isNodeFinished_.store(isFinished(), std::memory_order_release);
105
+
106
+ if (!isPlaying() && !isStopScheduled()) {
107
+ processingBus->zero();
108
+ return processingBus;
109
+ }
110
+
111
+ int bufferRemaining = bufferedBusSize_ - processedSamples_;
112
+ int alreadyProcessed = 0;
113
+ if (bufferRemaining < framesToProcess) {
114
+ if (bufferedBus_ != nullptr) {
115
+ for (int ch = 0; ch < processingBus->getNumberOfChannels(); ch++) {
116
+ memcpy(
117
+ processingBus->getChannel(ch)->getData(),
118
+ bufferedBus_->getChannel(ch)->getData() + processedSamples_,
119
+ bufferRemaining * sizeof(float));
120
+ }
121
+ framesToProcess -= bufferRemaining;
122
+ alreadyProcessed += bufferRemaining;
123
+ }
124
+ StreamingData data;
125
+ auto res = receiver_.try_receive(data);
126
+ if (res == channels::spsc::ResponseStatus::SUCCESS) {
127
+ bufferedBus_ = std::make_shared<AudioBus>(std::move(data.bus));
128
+ bufferedBusSize_ = data.size;
129
+ processedSamples_ = 0;
130
+ } else {
131
+ bufferedBus_ = nullptr;
132
+ }
133
+ }
134
+ if (bufferedBus_ != nullptr) {
135
+ for (int ch = 0; ch < processingBus->getNumberOfChannels(); ch++) {
136
+ memcpy(
137
+ processingBus->getChannel(ch)->getData() + alreadyProcessed,
138
+ bufferedBus_->getChannel(ch)->getData() + processedSamples_,
139
+ framesToProcess * sizeof(float));
140
+ }
141
+ processedSamples_ += framesToProcess;
142
+ }
143
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
144
+
145
+ return processingBus;
87
146
  }
88
147
 
148
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
89
149
  bool StreamerNode::setupResampler() {
90
150
  // Allocate resampler context
91
151
  swrCtx_ = swr_alloc();
@@ -122,69 +182,23 @@ bool StreamerNode::setupResampler() {
122
182
  }
123
183
 
124
184
  void StreamerNode::streamAudio() {
125
- while (streamFlag.load()) {
126
- if (pendingFrame_ != nullptr) {
127
- if (!processFrameWithResampler(pendingFrame_)) {
185
+ while (!isNodeFinished_.load(std::memory_order_acquire)) {
186
+ if (av_read_frame(fmtCtx_, pkt_) < 0) {
187
+ return;
188
+ }
189
+ if (pkt_->stream_index == audio_stream_index_) {
190
+ if (avcodec_send_packet(codecCtx_, pkt_) != 0) {
128
191
  return;
129
192
  }
130
- } else {
131
- if (av_read_frame(fmtCtx_, pkt_) < 0) {
193
+ if (avcodec_receive_frame(codecCtx_, frame_) != 0) {
132
194
  return;
133
195
  }
134
- if (pkt_->stream_index == audio_stream_index_) {
135
- if (avcodec_send_packet(codecCtx_, pkt_) != 0) {
136
- return;
137
- }
138
- if (avcodec_receive_frame(codecCtx_, frame_) != 0) {
139
- return;
140
- }
141
- if (!processFrameWithResampler(frame_)) {
142
- return;
143
- }
196
+ if (!processFrameWithResampler(frame_)) {
197
+ return;
144
198
  }
145
- av_packet_unref(pkt_);
146
- }
147
- std::this_thread::sleep_for(std::chrono::milliseconds(10));
148
- }
149
- }
150
-
151
- std::shared_ptr<AudioBus> StreamerNode::processNode(
152
- const std::shared_ptr<AudioBus> &processingBus,
153
- int framesToProcess) {
154
- size_t startOffset = 0;
155
- size_t offsetLength = 0;
156
- updatePlaybackInfo(processingBus, framesToProcess, startOffset, offsetLength);
157
-
158
- if (!isPlaying() && !isStopScheduled()) {
159
- processingBus->zero();
160
- return processingBus;
161
- }
162
-
163
- // If we have enough buffered data, copy to output bus
164
- if (bufferedBusIndex_ >= framesToProcess) {
165
- Locker locker(mutex_);
166
- for (int ch = 0; ch < processingBus->getNumberOfChannels(); ch++) {
167
- memcpy(
168
- processingBus->getChannel(ch)->getData(),
169
- bufferedBus_->getChannel(ch)->getData(),
170
- offsetLength * sizeof(float));
171
-
172
- memmove(
173
- bufferedBus_->getChannel(ch)->getData(),
174
- bufferedBus_->getChannel(ch)->getData() + offsetLength,
175
- (maxBufferSize_ - offsetLength) * sizeof(float));
176
199
  }
177
- bufferedBusIndex_ -= offsetLength;
178
- } else {
179
- if (VERBOSE)
180
- printf(
181
- "Buffer underrun: have %zu, need %zu\n",
182
- bufferedBusIndex_,
183
- (size_t)framesToProcess);
184
- processingBus->zero();
200
+ av_packet_unref(pkt_);
185
201
  }
186
-
187
- return processingBus;
188
202
  }
189
203
 
190
204
  bool StreamerNode::processFrameWithResampler(AVFrame *frame) {
@@ -220,22 +234,21 @@ bool StreamerNode::processFrameWithResampler(AVFrame *frame) {
220
234
  return false;
221
235
  }
222
236
 
223
- // Check if converted data fits in buffer
224
- if (bufferedBusIndex_ + converted_samples > maxBufferSize_) {
225
- pendingFrame_ = frame;
237
+ // if we would like to finish dont copy anything
238
+ if (this->isFinished()) {
226
239
  return true;
227
- } else {
228
- pendingFrame_ = nullptr;
229
240
  }
230
-
231
- // Copy converted data to our buffer
232
- Locker locker(mutex_);
241
+ auto bus = AudioBus(
242
+ static_cast<size_t>(converted_samples),
243
+ codecCtx_->ch_layout.nb_channels,
244
+ context_->getSampleRate());
233
245
  for (int ch = 0; ch < codecCtx_->ch_layout.nb_channels; ch++) {
234
246
  auto *src = reinterpret_cast<float *>(resampledData_[ch]);
235
- float *dst = bufferedBus_->getChannel(ch)->getData() + bufferedBusIndex_;
247
+ float *dst = bus.getChannel(ch)->getData();
236
248
  memcpy(dst, src, converted_samples * sizeof(float));
237
249
  }
238
- bufferedBusIndex_ += converted_samples;
250
+ StreamingData data{std::move(bus), static_cast<size_t>(converted_samples)};
251
+ sender_.send(std::move(data));
239
252
  return true;
240
253
  }
241
254
 
@@ -280,10 +293,13 @@ bool StreamerNode::setupDecoder() {
280
293
  }
281
294
 
282
295
  void StreamerNode::cleanup() {
283
- streamFlag.store(false);
284
- // cleanup cannot be called from the streaming thread so there is no need to
285
- // check if we are in the same thread
286
- streamingThread_.join();
296
+ this->playbackState_ = PlaybackState::FINISHED;
297
+ if (streamingThread_.joinable()) {
298
+ StreamingData dummy;
299
+ while (receiver_.try_receive(dummy) == channels::spsc::ResponseStatus::SUCCESS)
300
+ ; // clear the receiver
301
+ streamingThread_.join();
302
+ }
287
303
  if (swrCtx_ != nullptr) {
288
304
  swr_free(&swrCtx_);
289
305
  }
@@ -315,4 +331,5 @@ void StreamerNode::cleanup() {
315
331
  codecpar_ = nullptr;
316
332
  maxResampledSamples_ = 0;
317
333
  }
334
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
318
335
  } // namespace audioapi