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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +219 -84
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +23 -23
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +47 -47
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +379 -298
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -91
  19. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +48 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +132 -104
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -16
  24. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
  25. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
  26. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  27. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  28. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  29. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  30. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  31. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  32. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  33. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  34. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  35. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  36. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  37. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  38. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  39. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  40. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  41. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  42. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  43. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  44. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  45. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  46. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  47. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  48. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  49. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  50. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  51. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  52. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  53. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  54. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  55. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  56. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  57. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  58. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  59. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  60. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  61. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  62. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  63. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  64. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  65. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  66. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  68. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  69. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  70. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  71. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +98 -50
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -2
  73. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  74. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  75. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  76. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  77. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  78. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  79. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  80. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  81. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  82. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  83. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  84. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  85. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  86. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  87. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  88. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  89. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  90. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  91. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  92. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  93. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  94. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  95. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  96. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  97. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  98. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  99. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  100. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  101. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  102. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  103. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  104. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  105. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  106. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +84 -66
  107. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
  108. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  109. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  110. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  111. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  112. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  113. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  114. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  115. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  116. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  117. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  118. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  119. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  120. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  121. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  122. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  123. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  124. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +58 -36
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +42 -44
  126. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  127. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  128. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  129. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  130. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  131. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  132. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  133. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  134. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  135. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  136. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  137. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  138. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  139. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  140. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  141. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  142. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +104 -87
  143. package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -33
  144. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  145. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  146. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  147. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  148. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  149. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +43 -0
  150. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  151. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  152. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  153. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  154. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  155. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  156. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  157. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +51 -0
  158. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  159. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  160. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  161. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  162. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  163. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  164. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  165. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  166. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  167. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  168. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  169. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  170. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  171. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  172. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  173. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  174. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  175. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  176. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  177. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  178. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  179. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  180. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  181. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  182. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  183. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  184. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  185. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  186. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  187. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  188. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  189. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  190. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  217. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  218. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  219. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  220. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  221. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  222. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  223. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  224. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  225. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  226. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  227. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  228. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  229. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  230. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  231. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  232. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  233. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  234. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  235. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  236. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  237. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  238. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  239. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  240. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  241. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  242. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  243. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  244. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  245. package/common/cpp/audioapi/utils/Result.hpp +286 -0
  246. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  247. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  248. package/common/cpp/test/CMakeLists.txt +20 -14
  249. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  250. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  251. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  252. package/common/cpp/test/src/DelayTest.cpp +108 -0
  253. package/common/cpp/test/src/GainTest.cpp +4 -5
  254. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  255. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  256. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  257. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  258. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  259. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  260. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  261. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  262. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  263. package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
  264. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  265. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  266. package/ios/audioapi/ios/core/IOSAudioRecorder.h +26 -18
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +193 -53
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
  272. package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
  273. package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
  274. package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  277. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
  278. package/ios/audioapi/ios/system/AudioEngine.h +19 -16
  279. package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
  280. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  281. package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
  282. package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
  283. package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
  284. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  285. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  286. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  287. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  288. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  289. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  290. package/lib/commonjs/api.js +18 -12
  291. package/lib/commonjs/api.js.map +1 -1
  292. package/lib/commonjs/api.web.js +8 -0
  293. package/lib/commonjs/api.web.js.map +1 -1
  294. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  295. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  296. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  297. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  298. package/lib/commonjs/core/AudioContext.js +5 -8
  299. package/lib/commonjs/core/AudioContext.js.map +1 -1
  300. package/lib/commonjs/core/AudioNode.js +1 -1
  301. package/lib/commonjs/core/AudioNode.js.map +1 -1
  302. package/lib/commonjs/core/AudioParam.js +18 -11
  303. package/lib/commonjs/core/AudioParam.js.map +1 -1
  304. package/lib/commonjs/core/AudioRecorder.js +43 -55
  305. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  306. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  307. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  308. package/lib/commonjs/core/ConvolverNode.js +37 -0
  309. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  310. package/lib/commonjs/core/DelayNode.js +17 -0
  311. package/lib/commonjs/core/DelayNode.js.map +1 -0
  312. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  313. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  314. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  315. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  316. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  317. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  318. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  319. package/lib/commonjs/system/AudioManager.js +4 -7
  320. package/lib/commonjs/system/AudioManager.js.map +1 -1
  321. package/lib/commonjs/types.js +16 -23
  322. package/lib/commonjs/types.js.map +1 -1
  323. package/lib/commonjs/utils/filePresets.js +43 -0
  324. package/lib/commonjs/utils/filePresets.js.map +1 -0
  325. package/lib/commonjs/utils/index.js +12 -27
  326. package/lib/commonjs/utils/index.js.map +1 -1
  327. package/lib/commonjs/web-core/AudioContext.js +21 -1
  328. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  329. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  330. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  331. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  332. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  333. package/lib/commonjs/web-core/DelayNode.js +17 -0
  334. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  335. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  336. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  337. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  338. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  339. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  340. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  341. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  342. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  343. package/lib/module/AudioAPIModule/index.js +4 -0
  344. package/lib/module/AudioAPIModule/index.js.map +1 -0
  345. package/lib/module/api.js +3 -12
  346. package/lib/module/api.js.map +1 -1
  347. package/lib/module/api.web.js +1 -0
  348. package/lib/module/api.web.js.map +1 -1
  349. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  350. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  351. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  352. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  353. package/lib/module/core/AudioContext.js +5 -8
  354. package/lib/module/core/AudioContext.js.map +1 -1
  355. package/lib/module/core/AudioNode.js +1 -1
  356. package/lib/module/core/AudioNode.js.map +1 -1
  357. package/lib/module/core/AudioParam.js +18 -11
  358. package/lib/module/core/AudioParam.js.map +1 -1
  359. package/lib/module/core/AudioRecorder.js +44 -56
  360. package/lib/module/core/AudioRecorder.js.map +1 -1
  361. package/lib/module/core/BaseAudioContext.js +63 -32
  362. package/lib/module/core/BaseAudioContext.js.map +1 -1
  363. package/lib/module/core/ConvolverNode.js +31 -0
  364. package/lib/module/core/ConvolverNode.js.map +1 -0
  365. package/lib/module/core/DelayNode.js +11 -0
  366. package/lib/module/core/DelayNode.js.map +1 -0
  367. package/lib/module/core/IIRFilterNode.js +13 -0
  368. package/lib/module/core/IIRFilterNode.js.map +1 -0
  369. package/lib/module/core/OfflineAudioContext.js +3 -6
  370. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  371. package/lib/module/plugin/withAudioAPI.js +47 -1
  372. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  373. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  374. package/lib/module/system/AudioManager.js +4 -7
  375. package/lib/module/system/AudioManager.js.map +1 -1
  376. package/lib/module/types.js +15 -22
  377. package/lib/module/types.js.map +1 -1
  378. package/lib/module/utils/filePresets.js +39 -0
  379. package/lib/module/utils/filePresets.js.map +1 -0
  380. package/lib/module/utils/index.js +10 -10
  381. package/lib/module/utils/index.js.map +1 -1
  382. package/lib/module/web-core/AudioContext.js +21 -1
  383. package/lib/module/web-core/AudioContext.js.map +1 -1
  384. package/lib/module/web-core/ConvolverNode.js +34 -0
  385. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  386. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  387. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  388. package/lib/module/web-core/DelayNode.js +11 -0
  389. package/lib/module/web-core/DelayNode.js.map +1 -0
  390. package/lib/module/web-core/IIRFilterNode.js +13 -0
  391. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  392. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  393. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  394. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  395. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  396. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  397. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  398. package/lib/typescript/api.d.ts +3 -9
  399. package/lib/typescript/api.d.ts.map +1 -1
  400. package/lib/typescript/api.web.d.ts +1 -0
  401. package/lib/typescript/api.web.d.ts.map +1 -1
  402. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  403. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  404. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  405. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  406. package/lib/typescript/core/AudioContext.d.ts +1 -1
  407. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  408. package/lib/typescript/core/AudioNode.d.ts +2 -1
  409. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  410. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  411. package/lib/typescript/core/AudioRecorder.d.ts +13 -6
  412. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  413. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  414. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  415. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  416. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  417. package/lib/typescript/core/DelayNode.d.ts +9 -0
  418. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  419. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  420. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  421. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  422. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  423. package/lib/typescript/events/types.d.ts +4 -0
  424. package/lib/typescript/events/types.d.ts.map +1 -1
  425. package/lib/typescript/interfaces.d.ts +34 -34
  426. package/lib/typescript/interfaces.d.ts.map +1 -1
  427. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  428. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  429. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
  430. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  431. package/lib/typescript/system/AudioManager.d.ts +3 -2
  432. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  433. package/lib/typescript/types.d.ts +42 -34
  434. package/lib/typescript/types.d.ts.map +1 -1
  435. package/lib/typescript/utils/filePresets.d.ts +9 -0
  436. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  437. package/lib/typescript/utils/index.d.ts +1 -8
  438. package/lib/typescript/utils/index.d.ts.map +1 -1
  439. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  440. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  441. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  442. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  443. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  444. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  445. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  446. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  447. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  448. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  449. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  450. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  451. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  452. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  453. package/package.json +11 -4
  454. package/scripts/download-prebuilt-binaries.sh +61 -0
  455. package/scripts/rnaa_utils.rb +8 -0
  456. package/scripts/validate-worklets-version.js +27 -0
  457. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  458. package/src/AudioAPIModule/globals.d.ts +33 -0
  459. package/src/AudioAPIModule/index.ts +1 -0
  460. package/src/api.ts +4 -52
  461. package/src/api.web.ts +1 -0
  462. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  463. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  464. package/src/core/AudioContext.ts +5 -8
  465. package/src/core/AudioNode.ts +4 -3
  466. package/src/core/AudioParam.ts +18 -11
  467. package/src/core/AudioRecorder.ts +63 -78
  468. package/src/core/BaseAudioContext.ts +120 -54
  469. package/src/core/ConvolverNode.ts +35 -0
  470. package/src/core/DelayNode.ts +13 -0
  471. package/src/core/IIRFilterNode.ts +25 -0
  472. package/src/core/OfflineAudioContext.ts +4 -7
  473. package/src/events/types.ts +5 -0
  474. package/src/interfaces.ts +51 -34
  475. package/src/plugin/withAudioAPI.ts +61 -0
  476. package/src/specs/NativeAudioAPIModule.ts +3 -2
  477. package/src/system/AudioManager.ts +13 -19
  478. package/src/types.ts +45 -36
  479. package/src/utils/filePresets.ts +47 -0
  480. package/src/utils/index.ts +13 -19
  481. package/src/web-core/AudioContext.tsx +40 -1
  482. package/src/web-core/BaseAudioContext.tsx +11 -1
  483. package/src/web-core/ConvolverNode.tsx +43 -0
  484. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  485. package/src/web-core/DelayNode.tsx +12 -0
  486. package/src/web-core/IIRFilterNode.tsx +25 -0
  487. package/src/web-core/OfflineAudioContext.tsx +39 -0
  488. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  489. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  490. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  491. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  492. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  493. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  494. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  495. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  496. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  497. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  500. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  501. package/lib/commonjs/utils/bitEnums.js +0 -33
  502. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  503. package/lib/module/utils/bitEnums.js +0 -27
  504. package/lib/module/utils/bitEnums.js.map +0 -1
  505. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  506. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  507. package/metro-config/index.d.ts +0 -5
  508. package/metro-config/index.js +0 -41
  509. package/metro-config/tsconfig.json +0 -3
  510. package/src/utils/bitEnums.ts +0 -51
  511. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  512. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  513. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  514. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  515. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  516. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  517. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  518. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  519. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  520. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  521. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  522. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -1,30 +1,51 @@
1
1
  #include <android/log.h>
2
2
  #include <audioapi/android/core/utils/AndroidFileWriterBackend.h>
3
- #include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h>
3
+ #include <audioapi/android/core/utils/FileOptions.h>
4
4
  #include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
5
5
  #include <audioapi/libs/miniaudio/miniaudio.h>
6
+ #include <audioapi/utils/AudioFileProperties.h>
7
+ #include <audioapi/utils/UnitConversion.h>
6
8
 
7
- constexpr double BYTES_TO_MB = 1024.0 * 1024.0;
9
+ #include <cstdio>
10
+ #include <memory>
11
+ #include <string>
8
12
 
9
13
  namespace audioapi {
10
14
 
11
- MiniAudioFileWriter::MiniAudioFileWriter(
12
- float sampleRate,
13
- size_t channelCount,
14
- size_t bitRate,
15
- size_t androidFlags)
16
- : AndroidFileWriterBackend(
17
- sampleRate,
18
- channelCount,
19
- bitRate,
20
- androidFlags) {
21
- fileOptions_ = std::make_shared<MiniAudioFileOptions>(
22
- sampleRate, channelCount, bitRate, androidFlags);
15
+ /// @brief Get the encoding format based on the audio file properties (only WAV supported).
16
+ // Currently, miniaudio supports only WAV encoding, but out of convenience
17
+ // or potential future shenanigans, we keep this as a separate function.
18
+ inline ma_encoding_format getFormat(const std::shared_ptr<AudioFileProperties> &properties) {
19
+ return ma_encoding_format_wav;
20
+ }
21
+
22
+ /// @brief Get the data format based on the bit depth.
23
+ /// @param properties The audio file properties.
24
+ /// @return The corresponding ma_format.
25
+ inline ma_format getDataFormat(const std::shared_ptr<AudioFileProperties> &properties) {
26
+ switch (properties->bitDepth) {
27
+ case AudioFileProperties::BitDepth::Bit16:
28
+ return ma_format_s16;
29
+
30
+ case AudioFileProperties::BitDepth::Bit24:
31
+ return ma_format_s24;
32
+
33
+ case AudioFileProperties::BitDepth::Bit32:
34
+ return ma_format_f32;
35
+
36
+ default:
37
+ return ma_format_f32;
38
+ }
23
39
  }
24
40
 
41
+ MiniAudioFileWriter::MiniAudioFileWriter(
42
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
43
+ const std::shared_ptr<AudioFileProperties> &fileProperties)
44
+ : AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties) {}
45
+
25
46
  MiniAudioFileWriter::~MiniAudioFileWriter() {
26
- isFileOpen_.store(false);
27
- fileOptions_.reset();
47
+ isFileOpen_.store(false, std::memory_order_release);
48
+ fileProperties_.reset();
28
49
 
29
50
  if (encoder_ != nullptr) {
30
51
  ma_encoder_uninit(encoder_.get());
@@ -43,43 +64,59 @@ MiniAudioFileWriter::~MiniAudioFileWriter() {
43
64
  }
44
65
  }
45
66
 
46
- std::string MiniAudioFileWriter::openFile(
47
- int32_t streamSampleRate,
67
+ /// @brief Opens the audio file for writing.
68
+ /// This method initializes the audio converter and encoder together with any
69
+ /// necessary buffers required during the writing process.
70
+ /// this method should be called only on the JS thread.
71
+ /// @param streamSampleRate The sample rate of the incoming audio stream.
72
+ /// @param streamChannelCount The channel count of the incoming audio stream.
73
+ /// @param streamMaxBufferSize The maximum buffer size of the incoming audio stream.
74
+ /// @return The status of the file opening operation.
75
+ OpenFileResult MiniAudioFileWriter::openFile(
76
+ float streamSampleRate,
48
77
  int32_t streamChannelCount,
49
78
  int32_t streamMaxBufferSize) {
50
79
  streamSampleRate_ = streamSampleRate;
51
80
  streamChannelCount_ = streamChannelCount;
52
81
  streamMaxBufferSize_ = streamMaxBufferSize;
53
- bool success = false;
82
+ ma_result result;
83
+ framesWritten_.store(0, std::memory_order_release);
54
84
 
55
85
  isConverterRequired_.store(
56
- (streamSampleRate_ != fileOptions_->getSampleRate()) ||
57
- (streamChannelCount_ != fileOptions_->getChannelCount()) ||
58
- (fileOptions_->getDataFormat() != ma_format_f32));
86
+ (streamSampleRate_ != fileProperties_->sampleRate) ||
87
+ (streamChannelCount_ != fileProperties_->channelCount) ||
88
+ (getDataFormat(fileProperties_) != ma_format_f32),
89
+ std::memory_order_release);
59
90
 
60
- success = initializeConverterIfNeeded();
91
+ result = initializeConverterIfNeeded();
61
92
 
62
- if (!success) {
63
- return "";
93
+ if (result != MA_SUCCESS) {
94
+ return OpenFileResult ::Err(
95
+ "Failed to initialize converter" + std::string(ma_result_description(result)));
64
96
  }
65
97
 
66
- success = initializeEncoder();
98
+ result = initializeEncoder();
67
99
 
68
- if (!success) {
69
- return "";
100
+ if (result != MA_SUCCESS) {
101
+ return OpenFileResult ::Err(
102
+ "Failed to initialize encoder" + std::string(ma_result_description(result)));
70
103
  }
71
104
 
72
- isFileOpen_.store(true);
73
-
74
- return filePath_;
105
+ isFileOpen_.store(true, std::memory_order_release);
106
+ return OpenFileResult ::Ok(filePath_);
75
107
  }
76
108
 
77
- std::tuple<double, double> MiniAudioFileWriter::closeFile() {
109
+ /// @brief Closes the audio file.
110
+ /// This method finalizes the writing process, releases resources,
111
+ /// and retrieves the duration and size of the written audio file.
112
+ /// It should be called only on the JS thread.
113
+ /// @return The status of the file closing operation.
114
+ CloseFileResult MiniAudioFileWriter::closeFile() {
78
115
  if (!isFileOpen()) {
79
- return {0.0, 0.0};
116
+ return CloseFileResult ::Err("File is not open");
80
117
  }
81
118
 
82
- isFileOpen_.store(false);
119
+ isFileOpen_.store(false, std::memory_order_release);
83
120
 
84
121
  if (encoder_ != nullptr) {
85
122
  ma_encoder_uninit(encoder_.get());
@@ -107,10 +144,8 @@ std::tuple<double, double> MiniAudioFileWriter::closeFile() {
107
144
  if (ma_decoder_init_file(filePath_.c_str(), NULL, &decoder) == MA_SUCCESS) {
108
145
  ma_uint64 frameCount = 0;
109
146
 
110
- if (ma_decoder_get_length_in_pcm_frames(&decoder, &frameCount) ==
111
- MA_SUCCESS) {
112
- durationInSeconds =
113
- static_cast<double>(frameCount) / decoder.outputSampleRate;
147
+ if (ma_decoder_get_length_in_pcm_frames(&decoder, &frameCount) == MA_SUCCESS) {
148
+ durationInSeconds = static_cast<double>(frameCount) / decoder.outputSampleRate;
114
149
  }
115
150
 
116
151
  ma_decoder_uninit(&decoder);
@@ -120,15 +155,22 @@ std::tuple<double, double> MiniAudioFileWriter::closeFile() {
120
155
 
121
156
  if (file != nullptr) {
122
157
  fseek(file, 0, SEEK_END);
123
- long fileSizeInBytes = ftell(file);
158
+ uint64_t fileSizeInBytes = ftell(file);
124
159
  fclose(file);
125
- fileSizeInMB = static_cast<double>(fileSizeInBytes) / BYTES_TO_MB;
160
+ fileSizeInMB = static_cast<double>(fileSizeInBytes) / MB_IN_BYTES;
126
161
  }
127
162
 
128
163
  filePath_ = "";
129
- return {fileSizeInMB, durationInSeconds};
164
+ return CloseFileResult ::Ok({fileSizeInMB, durationInSeconds});
130
165
  }
131
166
 
167
+ /// @brief Writes audio data to the file.
168
+ /// If possible (sample format, channel count, and interleaving matches),
169
+ /// the data is written directly, otherwise in-memory conversion is performed first
170
+ /// It should be called only on the audio thread.
171
+ /// @param data Pointer to the audio data buffer. (Interleaved float32 format - as oboe likes it)
172
+ /// @param numFrames Number of audio frames to write.
173
+ /// @return True if the write operation was successful, false otherwise.
132
174
  bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
133
175
  ma_uint64 framesWritten = 0;
134
176
  ma_result result;
@@ -138,25 +180,16 @@ bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
138
180
  }
139
181
 
140
182
  if (!isConverterRequired()) {
141
- result = ma_encoder_write_pcm_frames(
142
- encoder_.get(), data, numFrames, &framesWritten);
143
-
144
- __android_log_print(
145
- ANDROID_LOG_DEBUG,
146
- "MiniAudioFileWriter",
147
- "Writing %llu frames without conversion to file: %s",
148
- framesWritten,
149
- filePath_.c_str());
183
+ result = ma_encoder_write_pcm_frames(encoder_.get(), data, numFrames, &framesWritten);
150
184
 
151
185
  if (result != MA_SUCCESS) {
152
- __android_log_print(
153
- ANDROID_LOG_ERROR,
154
- "MiniAudioFileWriter",
155
- "Failed to write audio data to file: %s",
156
- filePath_.c_str());
186
+ invokeOnErrorCallback(
187
+ "Failed to write audio data to file: " + filePath_ +
188
+ std::string(ma_result_description(result)));
189
+ return false;
157
190
  }
158
191
 
159
- framesWritten_.fetch_add(numFrames);
192
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
160
193
  return result == MA_SUCCESS;
161
194
  }
162
195
 
@@ -166,17 +199,20 @@ bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
166
199
  encoder_.get(), processingBuffer_, convertedFrameCount, &framesWritten);
167
200
 
168
201
  if (result != MA_SUCCESS) {
169
- __android_log_print(
170
- ANDROID_LOG_ERROR,
171
- "MiniAudioFileWriter",
172
- "Failed to write converted audio data to file: %s",
173
- filePath_.c_str());
202
+ invokeOnErrorCallback(
203
+ "Failed to write converted audio data to file: " + filePath_ +
204
+ std::string(ma_result_description(result)));
205
+ return false;
174
206
  }
175
207
 
176
- framesWritten_.fetch_add(numFrames);
208
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
177
209
  return result == MA_SUCCESS;
178
210
  }
179
211
 
212
+ /// @brief Converts the audio data buffer if necessary.
213
+ /// @param data Pointer to the audio data buffer.
214
+ /// @param numFrames Number of audio frames to convert.
215
+ /// @return The number of frames after conversion.
180
216
  ma_uint64 MiniAudioFileWriter::convertBuffer(void *data, int numFrames) {
181
217
  ma_uint64 inputFrameCount = numFrames;
182
218
  ma_uint64 outputFrameCount = 0;
@@ -185,85 +221,77 @@ ma_uint64 MiniAudioFileWriter::convertBuffer(void *data, int numFrames) {
185
221
  converter_.get(), inputFrameCount, &outputFrameCount);
186
222
 
187
223
  ma_data_converter_process_pcm_frames(
188
- converter_.get(),
189
- data,
190
- &inputFrameCount,
191
- processingBuffer_,
192
- &outputFrameCount);
224
+ converter_.get(), data, &inputFrameCount, processingBuffer_, &outputFrameCount);
193
225
 
194
226
  return outputFrameCount;
195
227
  }
196
228
 
197
- bool MiniAudioFileWriter::initializeConverterIfNeeded() {
229
+ /// @brief Initializes the data converter if needed.
230
+ /// This method sets up the data converter and allocates, so it should be called
231
+ /// only on the JS thread. (during file opening)
232
+ /// @return MA_SUCCESS if initialization was successful, otherwise an error code.
233
+ ma_result MiniAudioFileWriter::initializeConverterIfNeeded() {
198
234
  if (!isConverterRequired_) {
199
- return true;
235
+ return MA_SUCCESS;
200
236
  }
201
237
 
202
238
  ma_result result;
239
+ ma_format dataFormat = getDataFormat(fileProperties_);
203
240
 
204
241
  ma_data_converter_config converterConfig = ma_data_converter_config_init(
205
242
  ma_format_f32,
206
- fileOptions_->getDataFormat(),
243
+ dataFormat,
207
244
  streamChannelCount_,
208
- fileOptions_->getChannelCount(),
209
- streamSampleRate_,
210
- fileOptions_->getSampleRate());
245
+ fileProperties_->channelCount,
246
+ static_cast<int32_t>(streamSampleRate_),
247
+ fileProperties_->sampleRate);
211
248
 
212
249
  converter_ = std::make_unique<ma_data_converter>();
213
250
  result = ma_data_converter_init(&converterConfig, NULL, converter_.get());
214
251
 
215
252
  if (result != MA_SUCCESS) {
216
- __android_log_print(
217
- ANDROID_LOG_ERROR,
218
- "MiniAudioFileWriter",
219
- "Failed to initialize miniaudio data converter for file: %s",
220
- filePath_.c_str());
221
- return false;
253
+ return result;
222
254
  }
223
255
 
224
256
  ma_data_converter_get_expected_output_frame_count(
225
257
  converter_.get(), streamMaxBufferSize_, &processingBufferLength_);
226
258
 
227
259
  processingBuffer_ = ma_malloc(
228
- processingBufferLength_ * fileOptions_->getChannelCount() *
229
- ma_get_bytes_per_sample(fileOptions_->getDataFormat()),
260
+ processingBufferLength_ * fileProperties_->channelCount * ma_get_bytes_per_sample(dataFormat),
230
261
  NULL);
231
262
 
232
- return true;
263
+ return MA_SUCCESS;
233
264
  }
234
265
 
235
- bool MiniAudioFileWriter::initializeEncoder() {
236
- filePath_ = fileOptions_->getFilePath("audio");
237
-
266
+ /// @brief Initializes the audio encoder.
267
+ /// This method sets up the audio encoder for writing to the file,
268
+ /// it should be called only on the JS thread. (during file opening)
269
+ /// @return MA_SUCCESS if initialization was successful, otherwise an error code.
270
+ ma_result MiniAudioFileWriter::initializeEncoder() {
238
271
  ma_result result;
272
+ Result<std::string, std::string> filePathResult =
273
+ android::fileoptions::getFilePath(fileProperties_);
274
+
275
+ if (!filePathResult.is_ok()) {
276
+ return MA_ERROR;
277
+ }
278
+
279
+ filePath_ = filePathResult.unwrap();
239
280
 
240
281
  ma_encoder_config config = ma_encoder_config_init(
241
- fileOptions_->getFormat(),
242
- fileOptions_->getDataFormat(),
243
- fileOptions_->getChannelCount(),
244
- fileOptions_->getSampleRate());
282
+ getFormat(fileProperties_),
283
+ getDataFormat(fileProperties_),
284
+ fileProperties_->channelCount,
285
+ fileProperties_->sampleRate);
245
286
 
246
287
  encoder_ = std::make_unique<ma_encoder>();
247
288
  result = ma_encoder_init_file(filePath_.c_str(), &config, encoder_.get());
248
289
 
249
- if (result != MA_SUCCESS) {
250
- __android_log_print(
251
- ANDROID_LOG_ERROR,
252
- "MiniAudioFileWriter",
253
- "Failed to initialize miniaudio encoder for file: %s",
254
- filePath_.c_str());
255
- return false;
256
- }
257
-
258
- return true;
259
- }
260
-
261
- bool MiniAudioFileWriter::isFileOpen() {
262
- return isFileOpen_.load();
290
+ return result;
263
291
  }
264
292
 
265
293
  bool MiniAudioFileWriter::isConverterRequired() {
266
- return isConverterRequired_.load();
294
+ return isConverterRequired_.load(std::memory_order_acquire);
267
295
  }
268
296
 
269
297
  } // namespace audioapi
@@ -9,26 +9,19 @@
9
9
 
10
10
  namespace audioapi {
11
11
 
12
- class MiniAudioFileOptions;
13
-
14
12
  class MiniAudioFileWriter : public AndroidFileWriterBackend {
15
13
  public:
16
- MiniAudioFileWriter(
17
- float sampleRate,
18
- size_t channelCount,
19
- size_t bitRate,
20
- size_t androidFlags);
21
- ~MiniAudioFileWriter() override;
14
+ explicit MiniAudioFileWriter(
15
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
16
+ const std::shared_ptr<AudioFileProperties> &fileProperties);
17
+ ~MiniAudioFileWriter();
22
18
 
23
- std::string openFile(int32_t streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) override;
24
- std::tuple<double, double> closeFile() override;
19
+ OpenFileResult openFile(float streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) override;
20
+ CloseFileResult closeFile() override;
25
21
 
26
22
  bool writeAudioData(void *data, int numFrames) override;
27
23
 
28
24
  private:
29
- std::shared_ptr<MiniAudioFileOptions> fileOptions_;
30
-
31
- std::atomic<bool> isFileOpen_{false};
32
25
  std::atomic<bool> isConverterRequired_{false};
33
26
 
34
27
  std::unique_ptr<ma_encoder> encoder_{nullptr};
@@ -36,11 +29,10 @@ class MiniAudioFileWriter : public AndroidFileWriterBackend {
36
29
  void *processingBuffer_{nullptr};
37
30
  ma_uint64 processingBufferLength_{0};
38
31
 
39
- bool initializeConverterIfNeeded();
40
- bool initializeEncoder();
32
+ ma_result initializeConverterIfNeeded();
33
+ ma_result initializeEncoder();
41
34
  ma_uint64 convertBuffer(void *data, int numFrames);
42
35
 
43
- bool isFileOpen();
44
36
  bool isConverterRequired();
45
37
  };
46
38
 
@@ -1,6 +1,7 @@
1
1
  package com.swmansion.audioapi
2
2
 
3
3
  import com.facebook.jni.HybridData
4
+ import com.facebook.react.bridge.LifecycleEventListener
4
5
  import com.facebook.react.bridge.Promise
5
6
  import com.facebook.react.bridge.ReactApplicationContext
6
7
  import com.facebook.react.bridge.ReadableArray
@@ -17,7 +18,8 @@ import java.lang.ref.WeakReference
17
18
  @ReactModule(name = AudioAPIModule.NAME)
18
19
  class AudioAPIModule(
19
20
  reactContext: ReactApplicationContext,
20
- ) : NativeAudioAPIModuleSpec(reactContext) {
21
+ ) : NativeAudioAPIModuleSpec(reactContext),
22
+ LifecycleEventListener {
21
23
  companion object {
22
24
  const val NAME = NativeAudioAPIModuleSpec.NAME
23
25
  }
@@ -66,6 +68,27 @@ class AudioAPIModule(
66
68
  return true
67
69
  }
68
70
 
71
+ override fun onHostResume() {
72
+ // do nothing
73
+ }
74
+
75
+ override fun onHostPause() {
76
+ // do nothing
77
+ }
78
+
79
+ override fun onHostDestroy() {
80
+ // do nothing
81
+ }
82
+
83
+ override fun initialize() {
84
+ reactContext.get()?.addLifecycleEventListener(this)
85
+ }
86
+
87
+ override fun invalidate() {
88
+ reactContext.get()?.removeLifecycleEventListener(this)
89
+ // think about cleaning up resources, singletons etc.
90
+ }
91
+
69
92
  override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()
70
93
 
71
94
  override fun setAudioSessionActivity(
@@ -84,6 +107,10 @@ class AudioAPIModule(
84
107
  // noting to do here
85
108
  }
86
109
 
110
+ override fun disableSessionManagement() {
111
+ // nothing to do here
112
+ }
113
+
87
114
  override fun setLockScreenInfo(info: ReadableMap?) {
88
115
  MediaSessionManager.setLockScreenInfo(info)
89
116
  }
@@ -42,13 +42,11 @@ class LockScreenManager(
42
42
  private var playbackState: Int = PlaybackStateCompat.STATE_PAUSED
43
43
 
44
44
  init {
45
- this.pb.setActions(controls)
46
-
47
- this.nb.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
48
- this.nb.setPriority(NotificationCompat.PRIORITY_HIGH)
45
+ pb.setActions(controls)
46
+ nb.setPriority(NotificationCompat.PRIORITY_HIGH)
47
+ nb.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
49
48
 
50
49
  updateNotificationMediaStyle()
51
-
52
50
  mediaNotificationManager.get()?.updateActions(controls)
53
51
  }
54
52
 
@@ -157,6 +155,7 @@ class LockScreenManager(
157
155
  "state_playing" -> {
158
156
  this.playbackState = PlaybackStateCompat.STATE_PLAYING
159
157
  }
158
+
160
159
  "state_paused" -> {
161
160
  this.playbackState = PlaybackStateCompat.STATE_PAUSED
162
161
  }
@@ -174,8 +173,31 @@ class LockScreenManager(
174
173
  if (artworkThread != null && artworkThread!!.isAlive) artworkThread!!.interrupt()
175
174
  artworkThread = null
176
175
 
177
- mediaNotificationManager.get()?.cancelNotification()
176
+ title = null
177
+ artist = null
178
+ album = null
179
+ description = null
180
+ duration = 0L
181
+ speed = 1.0F
182
+ elapsedTime = 0L
183
+ artwork = null
184
+ playbackState = PlaybackStateCompat.STATE_PAUSED
185
+ isPlaying = false
186
+
187
+ val emptyMetadata = MediaMetadataCompat.Builder().build()
188
+ mediaSession.get()?.setMetadata(emptyMetadata)
189
+
190
+ pb.setState(PlaybackStateCompat.STATE_NONE, 0, 0f)
191
+ pb.setActions(controls)
192
+ state = pb.build()
193
+ mediaSession.get()?.setPlaybackState(state)
178
194
  mediaSession.get()?.setActive(false)
195
+
196
+ nb.setContentTitle("")
197
+ nb.setContentText("")
198
+ nb.setContentInfo("")
199
+
200
+ mediaNotificationManager.get()?.updateNotification(nb, isPlaying)
179
201
  }
180
202
 
181
203
  fun enableRemoteCommand(
@@ -258,5 +258,16 @@ class MediaNotificationManager(
258
258
  }
259
259
  super.onDestroy()
260
260
  }
261
+
262
+ override fun onTimeout(startId: Int) {
263
+ stopForegroundService()
264
+ }
265
+
266
+ override fun onTimeout(
267
+ startId: Int,
268
+ fgsType: Int,
269
+ ) {
270
+ stopForegroundService()
271
+ }
261
272
  }
262
273
  }
@@ -50,6 +50,10 @@
50
50
  @DoNotStrip
51
51
  public abstract void setAudioSessionOptions(String category, String mode, ReadableArray options, boolean allowHaptics);
52
52
 
53
+ @ReactMethod
54
+ @DoNotStrip
55
+ public abstract void disableSessionManagement();
56
+
53
57
  @ReactMethod
54
58
  @DoNotStrip
55
59
  public abstract void setLockScreenInfo(ReadableMap info);