react-native-audio-api 0.11.0-alpha.0 → 0.11.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +257 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +33 -19
  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 +15 -15
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +170 -0
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +46 -0
  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 +381 -302
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +49 -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 +155 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -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 +109 -44
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -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 +31 -108
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +46 -46
  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 +28 -11
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +229 -44
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +67 -6
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -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/utils/IOSFileWriter.h +53 -0
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  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 +56 -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 +57 -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 +16 -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 +36 -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 +43 -30
  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 +86 -84
  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 +55 -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 +47 -32
  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 -35
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  500. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  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,28 +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>
8
+
9
+ #include <cstdio>
10
+ #include <memory>
11
+ #include <string>
6
12
 
7
13
  namespace audioapi {
8
14
 
9
- MiniAudioFileWriter::MiniAudioFileWriter(
10
- float sampleRate,
11
- size_t channelCount,
12
- size_t bitRate,
13
- size_t androidFlags)
14
- : AndroidFileWriterBackend(
15
- sampleRate,
16
- channelCount,
17
- bitRate,
18
- androidFlags) {
19
- fileOptions_ = std::make_shared<MiniAudioFileOptions>(
20
- 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
+ }
21
39
  }
22
40
 
41
+ MiniAudioFileWriter::MiniAudioFileWriter(
42
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
43
+ const std::shared_ptr<AudioFileProperties> &fileProperties)
44
+ : AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties) {}
45
+
23
46
  MiniAudioFileWriter::~MiniAudioFileWriter() {
24
- isFileOpen_.store(false);
25
- fileOptions_.reset();
47
+ isFileOpen_.store(false, std::memory_order_release);
48
+ fileProperties_.reset();
26
49
 
27
50
  if (encoder_ != nullptr) {
28
51
  ma_encoder_uninit(encoder_.get());
@@ -41,41 +64,59 @@ MiniAudioFileWriter::~MiniAudioFileWriter() {
41
64
  }
42
65
  }
43
66
 
44
- void MiniAudioFileWriter::openFile(
45
- 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,
46
77
  int32_t streamChannelCount,
47
78
  int32_t streamMaxBufferSize) {
48
79
  streamSampleRate_ = streamSampleRate;
49
80
  streamChannelCount_ = streamChannelCount;
50
81
  streamMaxBufferSize_ = streamMaxBufferSize;
51
- bool success = false;
82
+ ma_result result;
83
+ framesWritten_.store(0, std::memory_order_release);
52
84
 
53
85
  isConverterRequired_.store(
54
- (streamSampleRate_ != fileOptions_->getSampleRate()) ||
55
- (streamChannelCount_ != fileOptions_->getChannelCount()) ||
56
- (fileOptions_->getDataFormat() != ma_format_f32));
86
+ (streamSampleRate_ != fileProperties_->sampleRate) ||
87
+ (streamChannelCount_ != fileProperties_->channelCount) ||
88
+ (getDataFormat(fileProperties_) != ma_format_f32),
89
+ std::memory_order_release);
57
90
 
58
- success = initializeConverterIfNeeded();
91
+ result = initializeConverterIfNeeded();
59
92
 
60
- if (!success) {
61
- return;
93
+ if (result != MA_SUCCESS) {
94
+ return OpenFileResult ::Err(
95
+ "Failed to initialize converter" + std::string(ma_result_description(result)));
62
96
  }
63
97
 
64
- success = initializeEncoder();
98
+ result = initializeEncoder();
65
99
 
66
- if (!success) {
67
- return;
100
+ if (result != MA_SUCCESS) {
101
+ return OpenFileResult ::Err(
102
+ "Failed to initialize encoder" + std::string(ma_result_description(result)));
68
103
  }
69
104
 
70
- isFileOpen_.store(true);
105
+ isFileOpen_.store(true, std::memory_order_release);
106
+ return OpenFileResult ::Ok(filePath_);
71
107
  }
72
108
 
73
- std::string 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() {
74
115
  if (!isFileOpen()) {
75
- return "";
116
+ return CloseFileResult ::Err("File is not open");
76
117
  }
77
118
 
78
- isFileOpen_.store(false);
119
+ isFileOpen_.store(false, std::memory_order_release);
79
120
 
80
121
  if (encoder_ != nullptr) {
81
122
  ma_encoder_uninit(encoder_.get());
@@ -93,12 +134,43 @@ std::string MiniAudioFileWriter::closeFile() {
93
134
  processingBufferLength_ = 0;
94
135
  }
95
136
 
96
- std::string closedFilePath = filePath_;
97
- filePath_ = "";
137
+ // Retrieve duration and file size
138
+ std::string filePath = filePath_;
139
+ double durationInSeconds = 0.0;
140
+ double fileSizeInMB = 0.0;
141
+
142
+ ma_decoder decoder;
98
143
 
99
- return closedFilePath;
144
+ if (ma_decoder_init_file(filePath_.c_str(), NULL, &decoder) == MA_SUCCESS) {
145
+ ma_uint64 frameCount = 0;
146
+
147
+ if (ma_decoder_get_length_in_pcm_frames(&decoder, &frameCount) == MA_SUCCESS) {
148
+ durationInSeconds = static_cast<double>(frameCount) / decoder.outputSampleRate;
149
+ }
150
+
151
+ ma_decoder_uninit(&decoder);
152
+ }
153
+
154
+ FILE *file = fopen(filePath_.c_str(), "rb");
155
+
156
+ if (file != nullptr) {
157
+ fseek(file, 0, SEEK_END);
158
+ uint64_t fileSizeInBytes = ftell(file);
159
+ fclose(file);
160
+ fileSizeInMB = static_cast<double>(fileSizeInBytes) / MB_IN_BYTES;
161
+ }
162
+
163
+ filePath_ = "";
164
+ return CloseFileResult ::Ok({fileSizeInMB, durationInSeconds});
100
165
  }
101
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.
102
174
  bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
103
175
  ma_uint64 framesWritten = 0;
104
176
  ma_result result;
@@ -108,24 +180,16 @@ bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
108
180
  }
109
181
 
110
182
  if (!isConverterRequired()) {
111
- result = ma_encoder_write_pcm_frames(
112
- encoder_.get(), data, numFrames, &framesWritten);
113
-
114
- __android_log_print(
115
- ANDROID_LOG_DEBUG,
116
- "MiniAudioFileWriter",
117
- "Writing %llu frames without conversion to file: %s",
118
- framesWritten,
119
- filePath_.c_str());
183
+ result = ma_encoder_write_pcm_frames(encoder_.get(), data, numFrames, &framesWritten);
120
184
 
121
185
  if (result != MA_SUCCESS) {
122
- __android_log_print(
123
- ANDROID_LOG_ERROR,
124
- "MiniAudioFileWriter",
125
- "Failed to write audio data to file: %s",
126
- filePath_.c_str());
186
+ invokeOnErrorCallback(
187
+ "Failed to write audio data to file: " + filePath_ +
188
+ std::string(ma_result_description(result)));
189
+ return false;
127
190
  }
128
191
 
192
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
129
193
  return result == MA_SUCCESS;
130
194
  }
131
195
 
@@ -135,16 +199,20 @@ bool MiniAudioFileWriter::writeAudioData(void *data, int numFrames) {
135
199
  encoder_.get(), processingBuffer_, convertedFrameCount, &framesWritten);
136
200
 
137
201
  if (result != MA_SUCCESS) {
138
- __android_log_print(
139
- ANDROID_LOG_ERROR,
140
- "MiniAudioFileWriter",
141
- "Failed to write converted audio data to file: %s",
142
- 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;
143
206
  }
144
207
 
208
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
145
209
  return result == MA_SUCCESS;
146
210
  }
147
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.
148
216
  ma_uint64 MiniAudioFileWriter::convertBuffer(void *data, int numFrames) {
149
217
  ma_uint64 inputFrameCount = numFrames;
150
218
  ma_uint64 outputFrameCount = 0;
@@ -153,85 +221,77 @@ ma_uint64 MiniAudioFileWriter::convertBuffer(void *data, int numFrames) {
153
221
  converter_.get(), inputFrameCount, &outputFrameCount);
154
222
 
155
223
  ma_data_converter_process_pcm_frames(
156
- converter_.get(),
157
- data,
158
- &inputFrameCount,
159
- processingBuffer_,
160
- &outputFrameCount);
224
+ converter_.get(), data, &inputFrameCount, processingBuffer_, &outputFrameCount);
161
225
 
162
226
  return outputFrameCount;
163
227
  }
164
228
 
165
- 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() {
166
234
  if (!isConverterRequired_) {
167
- return true;
235
+ return MA_SUCCESS;
168
236
  }
169
237
 
170
238
  ma_result result;
239
+ ma_format dataFormat = getDataFormat(fileProperties_);
171
240
 
172
241
  ma_data_converter_config converterConfig = ma_data_converter_config_init(
173
242
  ma_format_f32,
174
- fileOptions_->getDataFormat(),
243
+ dataFormat,
175
244
  streamChannelCount_,
176
- fileOptions_->getChannelCount(),
177
- streamSampleRate_,
178
- fileOptions_->getSampleRate());
245
+ fileProperties_->channelCount,
246
+ static_cast<int32_t>(streamSampleRate_),
247
+ fileProperties_->sampleRate);
179
248
 
180
249
  converter_ = std::make_unique<ma_data_converter>();
181
250
  result = ma_data_converter_init(&converterConfig, NULL, converter_.get());
182
251
 
183
252
  if (result != MA_SUCCESS) {
184
- __android_log_print(
185
- ANDROID_LOG_ERROR,
186
- "MiniAudioFileWriter",
187
- "Failed to initialize miniaudio data converter for file: %s",
188
- filePath_.c_str());
189
- return false;
253
+ return result;
190
254
  }
191
255
 
192
256
  ma_data_converter_get_expected_output_frame_count(
193
257
  converter_.get(), streamMaxBufferSize_, &processingBufferLength_);
194
258
 
195
259
  processingBuffer_ = ma_malloc(
196
- processingBufferLength_ * fileOptions_->getChannelCount() *
197
- ma_get_bytes_per_sample(fileOptions_->getDataFormat()),
260
+ processingBufferLength_ * fileProperties_->channelCount * ma_get_bytes_per_sample(dataFormat),
198
261
  NULL);
199
262
 
200
- return true;
263
+ return MA_SUCCESS;
201
264
  }
202
265
 
203
- bool MiniAudioFileWriter::initializeEncoder() {
204
- filePath_ = fileOptions_->getFilePath("audio");
205
-
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() {
206
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();
207
280
 
208
281
  ma_encoder_config config = ma_encoder_config_init(
209
- fileOptions_->getFormat(),
210
- fileOptions_->getDataFormat(),
211
- fileOptions_->getChannelCount(),
212
- fileOptions_->getSampleRate());
282
+ getFormat(fileProperties_),
283
+ getDataFormat(fileProperties_),
284
+ fileProperties_->channelCount,
285
+ fileProperties_->sampleRate);
213
286
 
214
287
  encoder_ = std::make_unique<ma_encoder>();
215
288
  result = ma_encoder_init_file(filePath_.c_str(), &config, encoder_.get());
216
289
 
217
- if (result != MA_SUCCESS) {
218
- __android_log_print(
219
- ANDROID_LOG_ERROR,
220
- "MiniAudioFileWriter",
221
- "Failed to initialize miniaudio encoder for file: %s",
222
- filePath_.c_str());
223
- return false;
224
- }
225
-
226
- return true;
227
- }
228
-
229
- bool MiniAudioFileWriter::isFileOpen() {
230
- return isFileOpen_.load();
290
+ return result;
231
291
  }
232
292
 
233
293
  bool MiniAudioFileWriter::isConverterRequired() {
234
- return isConverterRequired_.load();
294
+ return isConverterRequired_.load(std::memory_order_acquire);
235
295
  }
236
296
 
237
297
  } // namespace audioapi
@@ -5,29 +5,23 @@
5
5
 
6
6
  #include <string>
7
7
  #include <memory>
8
+ #include <tuple>
8
9
 
9
10
  namespace audioapi {
10
11
 
11
- class MiniAudioFileOptions;
12
-
13
12
  class MiniAudioFileWriter : public AndroidFileWriterBackend {
14
13
  public:
15
- MiniAudioFileWriter(
16
- float sampleRate,
17
- size_t channelCount,
18
- size_t bitRate,
19
- size_t androidFlags);
20
- ~MiniAudioFileWriter() override;
14
+ explicit MiniAudioFileWriter(
15
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
16
+ const std::shared_ptr<AudioFileProperties> &fileProperties);
17
+ ~MiniAudioFileWriter();
21
18
 
22
- void openFile(int32_t streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) override;
23
- std::string closeFile() override;
19
+ OpenFileResult openFile(float streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) override;
20
+ CloseFileResult closeFile() override;
24
21
 
25
22
  bool writeAudioData(void *data, int numFrames) override;
26
23
 
27
24
  private:
28
- std::shared_ptr<MiniAudioFileOptions> fileOptions_;
29
-
30
- std::atomic<bool> isFileOpen_{false};
31
25
  std::atomic<bool> isConverterRequired_{false};
32
26
 
33
27
  std::unique_ptr<ma_encoder> encoder_{nullptr};
@@ -35,11 +29,10 @@ class MiniAudioFileWriter : public AndroidFileWriterBackend {
35
29
  void *processingBuffer_{nullptr};
36
30
  ma_uint64 processingBufferLength_{0};
37
31
 
38
- bool initializeConverterIfNeeded();
39
- bool initializeEncoder();
32
+ ma_result initializeConverterIfNeeded();
33
+ ma_result initializeEncoder();
40
34
  ma_uint64 convertBuffer(void *data, int numFrames);
41
35
 
42
- bool isFileOpen();
43
36
  bool isConverterRequired();
44
37
  };
45
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);