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

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 (623) 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 +315 -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 +46 -58
  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 +363 -299
  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 +56 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +114 -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 -105
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +9 -16
  24. package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +2 -1
  25. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +189 -14
  26. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioPlayer.kt +10 -8
  27. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +10 -8
  28. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -2
  29. package/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt +128 -0
  30. package/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt +116 -0
  31. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +115 -107
  32. package/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt +2 -1
  33. package/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt +47 -0
  34. package/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt +191 -0
  35. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +669 -0
  36. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +33 -0
  37. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt +303 -0
  38. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +45 -0
  39. package/android/src/main/java/com/swmansion/audioapi/system/notification/SimpleNotification.kt +119 -0
  40. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  42. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  43. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  44. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  45. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  46. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  47. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  48. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  49. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  50. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  51. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  52. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  53. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  54. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  55. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  56. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +100 -76
  57. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  58. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  59. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  60. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  61. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  62. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  63. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  64. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  65. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  66. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  68. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  69. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  70. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  71. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  72. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  73. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  74. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  75. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  76. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  77. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  78. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  79. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  80. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  81. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  82. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  83. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  84. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +98 -50
  85. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -2
  86. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  87. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  88. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  89. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  90. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  91. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  92. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  93. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  94. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  95. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  96. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  97. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  98. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  99. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  100. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  101. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  102. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  103. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  104. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  105. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  106. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  107. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  108. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  109. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  110. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  111. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  112. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  113. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  114. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  115. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  116. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  117. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  118. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  119. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +96 -74
  120. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +44 -15
  121. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  122. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  123. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  124. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  125. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  126. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  127. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  128. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  129. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  130. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  131. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  132. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  133. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  134. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  135. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  136. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  137. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +66 -36
  138. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +42 -44
  139. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  140. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  141. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  142. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  143. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  144. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  145. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  146. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  147. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  148. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  149. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  150. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  151. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  152. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  153. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  154. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  155. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +105 -87
  156. package/common/cpp/audioapi/core/sources/StreamerNode.h +67 -33
  157. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  158. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  159. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  160. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  161. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  162. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +44 -0
  163. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  164. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  165. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  166. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  167. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  168. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  169. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  170. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +52 -0
  171. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  172. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  173. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  174. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  175. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  176. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  177. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  178. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  179. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  180. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  181. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  182. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  183. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  184. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  185. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  186. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  187. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  188. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  189. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  190. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  217. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  218. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  219. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  220. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  221. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  222. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  223. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  224. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  225. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  226. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  227. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  228. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  229. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  230. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  231. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  232. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  233. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  234. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  235. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  236. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  237. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  238. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  239. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  240. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  241. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  242. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  243. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  244. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  245. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  246. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  247. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  248. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +53 -0
  249. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  250. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  251. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  252. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  253. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  254. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  255. package/common/cpp/audioapi/utils/Benchmark.hpp +50 -47
  256. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  257. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  258. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  259. package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +12 -9
  260. package/common/cpp/audioapi/utils/MoveOnlyFunction.hpp +17 -15
  261. package/common/cpp/audioapi/utils/Result.hpp +323 -0
  262. package/common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp +22 -28
  263. package/common/cpp/audioapi/utils/SpscChannel.hpp +329 -305
  264. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -20
  265. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  266. package/common/cpp/test/CMakeLists.txt +15 -15
  267. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  268. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  269. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  270. package/common/cpp/test/src/DelayTest.cpp +108 -0
  271. package/common/cpp/test/src/GainTest.cpp +4 -5
  272. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  273. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  274. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  275. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  276. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  277. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  278. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  279. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  280. package/ios/audioapi/ios/AudioAPIModule.h +4 -3
  281. package/ios/audioapi/ios/AudioAPIModule.mm +148 -34
  282. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  283. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  284. package/ios/audioapi/ios/core/IOSAudioRecorder.h +26 -18
  285. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +244 -54
  286. package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
  287. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  288. package/ios/audioapi/ios/core/NativeAudioRecorder.m +49 -7
  289. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
  290. package/ios/audioapi/ios/core/utils/FileOptions.h +33 -0
  291. package/ios/audioapi/ios/core/utils/FileOptions.mm +195 -0
  292. package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  293. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
  294. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  295. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +185 -0
  296. package/ios/audioapi/ios/system/AudioEngine.h +21 -16
  297. package/ios/audioapi/ios/system/AudioEngine.mm +153 -132
  298. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  299. package/ios/audioapi/ios/system/AudioSessionManager.mm +277 -203
  300. package/ios/audioapi/ios/system/NotificationManager.mm +47 -53
  301. package/ios/audioapi/ios/system/notification/BaseNotification.h +58 -0
  302. package/ios/audioapi/ios/system/notification/NotificationRegistry.h +70 -0
  303. package/ios/audioapi/ios/system/notification/NotificationRegistry.mm +172 -0
  304. package/ios/audioapi/ios/system/notification/PlaybackNotification.h +27 -0
  305. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +427 -0
  306. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  307. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  308. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  309. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  310. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  311. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  312. package/lib/commonjs/api.js +89 -12
  313. package/lib/commonjs/api.js.map +1 -1
  314. package/lib/commonjs/api.web.js +35 -14
  315. package/lib/commonjs/api.web.js.map +1 -1
  316. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  317. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  318. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  319. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  320. package/lib/commonjs/core/AudioContext.js +5 -8
  321. package/lib/commonjs/core/AudioContext.js.map +1 -1
  322. package/lib/commonjs/core/AudioNode.js +1 -1
  323. package/lib/commonjs/core/AudioNode.js.map +1 -1
  324. package/lib/commonjs/core/AudioParam.js +18 -11
  325. package/lib/commonjs/core/AudioParam.js.map +1 -1
  326. package/lib/commonjs/core/AudioRecorder.js +43 -55
  327. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  328. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  329. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  330. package/lib/commonjs/core/ConvolverNode.js +37 -0
  331. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  332. package/lib/commonjs/core/DelayNode.js +17 -0
  333. package/lib/commonjs/core/DelayNode.js.map +1 -0
  334. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  335. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  336. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  337. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  338. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  339. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  340. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  341. package/lib/commonjs/system/AudioManager.js +9 -15
  342. package/lib/commonjs/system/AudioManager.js.map +1 -1
  343. package/lib/commonjs/system/index.js +13 -0
  344. package/lib/commonjs/system/index.js.map +1 -1
  345. package/lib/commonjs/system/notification/PlaybackNotificationManager.js +138 -0
  346. package/lib/commonjs/system/notification/PlaybackNotificationManager.js.map +1 -0
  347. package/lib/commonjs/system/notification/RecordingNotificationManager.js +185 -0
  348. package/lib/commonjs/system/notification/RecordingNotificationManager.js.map +1 -0
  349. package/lib/commonjs/system/notification/SimpleNotificationManager.js +125 -0
  350. package/lib/commonjs/system/notification/SimpleNotificationManager.js.map +1 -0
  351. package/lib/commonjs/system/notification/index.js +45 -0
  352. package/lib/commonjs/system/notification/index.js.map +1 -0
  353. package/lib/commonjs/system/notification/types.js +6 -0
  354. package/lib/commonjs/system/notification/types.js.map +1 -0
  355. package/lib/commonjs/types.js +28 -35
  356. package/lib/commonjs/types.js.map +1 -1
  357. package/lib/commonjs/utils/filePresets.js +43 -0
  358. package/lib/commonjs/utils/filePresets.js.map +1 -0
  359. package/lib/commonjs/utils/index.js +12 -27
  360. package/lib/commonjs/utils/index.js.map +1 -1
  361. package/lib/commonjs/web-core/AudioContext.js +21 -1
  362. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  363. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  364. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  365. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  366. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  367. package/lib/commonjs/web-core/DelayNode.js +17 -0
  368. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  369. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  370. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  371. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  372. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  373. package/lib/commonjs/web-system/index.js +17 -0
  374. package/lib/commonjs/web-system/index.js.map +1 -0
  375. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js +37 -0
  376. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  377. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js +37 -0
  378. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js.map +1 -0
  379. package/lib/commonjs/web-system/notification/index.js +21 -0
  380. package/lib/commonjs/web-system/notification/index.js.map +1 -0
  381. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  382. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  383. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  384. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  385. package/lib/module/AudioAPIModule/index.js +4 -0
  386. package/lib/module/AudioAPIModule/index.js.map +1 -0
  387. package/lib/module/api.js +7 -12
  388. package/lib/module/api.js.map +1 -1
  389. package/lib/module/api.web.js +4 -1
  390. package/lib/module/api.web.js.map +1 -1
  391. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  392. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  393. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  394. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  395. package/lib/module/core/AudioContext.js +5 -8
  396. package/lib/module/core/AudioContext.js.map +1 -1
  397. package/lib/module/core/AudioNode.js +1 -1
  398. package/lib/module/core/AudioNode.js.map +1 -1
  399. package/lib/module/core/AudioParam.js +18 -11
  400. package/lib/module/core/AudioParam.js.map +1 -1
  401. package/lib/module/core/AudioRecorder.js +44 -56
  402. package/lib/module/core/AudioRecorder.js.map +1 -1
  403. package/lib/module/core/BaseAudioContext.js +63 -32
  404. package/lib/module/core/BaseAudioContext.js.map +1 -1
  405. package/lib/module/core/ConvolverNode.js +31 -0
  406. package/lib/module/core/ConvolverNode.js.map +1 -0
  407. package/lib/module/core/DelayNode.js +11 -0
  408. package/lib/module/core/DelayNode.js.map +1 -0
  409. package/lib/module/core/IIRFilterNode.js +13 -0
  410. package/lib/module/core/IIRFilterNode.js.map +1 -0
  411. package/lib/module/core/OfflineAudioContext.js +3 -6
  412. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  413. package/lib/module/plugin/withAudioAPI.js +47 -1
  414. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  415. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  416. package/lib/module/system/AudioManager.js +9 -15
  417. package/lib/module/system/AudioManager.js.map +1 -1
  418. package/lib/module/system/index.js +1 -0
  419. package/lib/module/system/index.js.map +1 -1
  420. package/lib/module/system/notification/PlaybackNotificationManager.js +134 -0
  421. package/lib/module/system/notification/PlaybackNotificationManager.js.map +1 -0
  422. package/lib/module/system/notification/RecordingNotificationManager.js +181 -0
  423. package/lib/module/system/notification/RecordingNotificationManager.js.map +1 -0
  424. package/lib/module/system/notification/SimpleNotificationManager.js +121 -0
  425. package/lib/module/system/notification/SimpleNotificationManager.js.map +1 -0
  426. package/lib/module/system/notification/index.js +7 -0
  427. package/lib/module/system/notification/index.js.map +1 -0
  428. package/lib/module/system/notification/types.js +4 -0
  429. package/lib/module/system/notification/types.js.map +1 -0
  430. package/lib/module/types.js +27 -34
  431. package/lib/module/types.js.map +1 -1
  432. package/lib/module/utils/filePresets.js +39 -0
  433. package/lib/module/utils/filePresets.js.map +1 -0
  434. package/lib/module/utils/index.js +10 -10
  435. package/lib/module/utils/index.js.map +1 -1
  436. package/lib/module/web-core/AudioContext.js +21 -1
  437. package/lib/module/web-core/AudioContext.js.map +1 -1
  438. package/lib/module/web-core/ConvolverNode.js +34 -0
  439. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  440. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  441. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  442. package/lib/module/web-core/DelayNode.js +11 -0
  443. package/lib/module/web-core/DelayNode.js.map +1 -0
  444. package/lib/module/web-core/IIRFilterNode.js +13 -0
  445. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  446. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  447. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  448. package/lib/module/web-system/index.js +4 -0
  449. package/lib/module/web-system/index.js.map +1 -0
  450. package/lib/module/web-system/notification/PlaybackNotificationManager.js +33 -0
  451. package/lib/module/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  452. package/lib/module/web-system/notification/RecordingNotificationManager.js +33 -0
  453. package/lib/module/web-system/notification/RecordingNotificationManager.js.map +1 -0
  454. package/lib/module/web-system/notification/index.js +5 -0
  455. package/lib/module/web-system/notification/index.js.map +1 -0
  456. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  457. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  458. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  459. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  460. package/lib/typescript/api.d.ts +5 -9
  461. package/lib/typescript/api.d.ts.map +1 -1
  462. package/lib/typescript/api.web.d.ts +4 -1
  463. package/lib/typescript/api.web.d.ts.map +1 -1
  464. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  465. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  466. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  467. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  468. package/lib/typescript/core/AudioContext.d.ts +1 -1
  469. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  470. package/lib/typescript/core/AudioNode.d.ts +2 -1
  471. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  472. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  473. package/lib/typescript/core/AudioRecorder.d.ts +13 -6
  474. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  475. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  476. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  477. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  478. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  479. package/lib/typescript/core/DelayNode.d.ts +9 -0
  480. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  481. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  482. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  483. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  484. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  485. package/lib/typescript/events/types.d.ts +6 -2
  486. package/lib/typescript/events/types.d.ts.map +1 -1
  487. package/lib/typescript/interfaces.d.ts +34 -34
  488. package/lib/typescript/interfaces.d.ts.map +1 -1
  489. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  490. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  491. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +18 -6
  492. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  493. package/lib/typescript/system/AudioManager.d.ts +5 -5
  494. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  495. package/lib/typescript/system/index.d.ts +1 -0
  496. package/lib/typescript/system/index.d.ts.map +1 -1
  497. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts +23 -0
  498. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  499. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts +24 -0
  500. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts.map +1 -0
  501. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts +21 -0
  502. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts.map +1 -0
  503. package/lib/typescript/system/notification/index.d.ts +5 -0
  504. package/lib/typescript/system/notification/index.d.ts.map +1 -0
  505. package/lib/typescript/system/notification/types.d.ts +65 -0
  506. package/lib/typescript/system/notification/types.d.ts.map +1 -0
  507. package/lib/typescript/system/types.d.ts +0 -16
  508. package/lib/typescript/system/types.d.ts.map +1 -1
  509. package/lib/typescript/types.d.ts +57 -49
  510. package/lib/typescript/types.d.ts.map +1 -1
  511. package/lib/typescript/utils/filePresets.d.ts +9 -0
  512. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  513. package/lib/typescript/utils/index.d.ts +1 -8
  514. package/lib/typescript/utils/index.d.ts.map +1 -1
  515. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  516. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  517. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  518. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  519. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  520. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  521. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  522. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  523. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  524. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  525. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  526. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  527. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  528. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  529. package/lib/typescript/web-system/index.d.ts +2 -0
  530. package/lib/typescript/web-system/index.d.ts.map +1 -0
  531. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts +20 -0
  532. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  533. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts +20 -0
  534. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts.map +1 -0
  535. package/lib/typescript/web-system/notification/index.d.ts +3 -0
  536. package/lib/typescript/web-system/notification/index.d.ts.map +1 -0
  537. package/package.json +11 -5
  538. package/scripts/download-prebuilt-binaries.sh +61 -0
  539. package/scripts/rnaa_utils.rb +8 -0
  540. package/scripts/validate-worklets-version.js +27 -0
  541. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  542. package/src/AudioAPIModule/globals.d.ts +33 -0
  543. package/src/AudioAPIModule/index.ts +1 -0
  544. package/src/api.ts +21 -52
  545. package/src/api.web.ts +8 -2
  546. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  547. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  548. package/src/core/AudioContext.ts +5 -8
  549. package/src/core/AudioNode.ts +4 -3
  550. package/src/core/AudioParam.ts +18 -11
  551. package/src/core/AudioRecorder.ts +63 -78
  552. package/src/core/BaseAudioContext.ts +120 -54
  553. package/src/core/ConvolverNode.ts +35 -0
  554. package/src/core/DelayNode.ts +13 -0
  555. package/src/core/IIRFilterNode.ts +25 -0
  556. package/src/core/OfflineAudioContext.ts +4 -7
  557. package/src/events/types.ts +7 -3
  558. package/src/interfaces.ts +51 -34
  559. package/src/plugin/withAudioAPI.ts +61 -0
  560. package/src/specs/NativeAudioAPIModule.ts +26 -9
  561. package/src/system/AudioManager.ts +13 -32
  562. package/src/system/index.ts +1 -0
  563. package/src/system/notification/PlaybackNotificationManager.ts +197 -0
  564. package/src/system/notification/RecordingNotificationManager.ts +247 -0
  565. package/src/system/notification/SimpleNotificationManager.ts +175 -0
  566. package/src/system/notification/index.ts +4 -0
  567. package/src/system/notification/types.ts +111 -0
  568. package/src/system/types.ts +0 -18
  569. package/src/types.ts +59 -50
  570. package/src/utils/filePresets.ts +47 -0
  571. package/src/utils/index.ts +13 -19
  572. package/src/web-core/AudioContext.tsx +40 -1
  573. package/src/web-core/BaseAudioContext.tsx +11 -1
  574. package/src/web-core/ConvolverNode.tsx +43 -0
  575. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  576. package/src/web-core/DelayNode.tsx +12 -0
  577. package/src/web-core/IIRFilterNode.tsx +25 -0
  578. package/src/web-core/OfflineAudioContext.tsx +39 -0
  579. package/src/web-system/index.ts +1 -0
  580. package/src/web-system/notification/PlaybackNotificationManager.ts +64 -0
  581. package/src/web-system/notification/RecordingNotificationManager.ts +64 -0
  582. package/src/web-system/notification/index.ts +2 -0
  583. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  584. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  585. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  586. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  587. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  588. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  589. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +0 -325
  590. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +0 -262
  591. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +0 -57
  592. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -61
  593. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  594. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  595. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  596. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
  597. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  598. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  599. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  600. package/ios/audioapi/ios/system/LockScreenManager.h +0 -24
  601. package/ios/audioapi/ios/system/LockScreenManager.mm +0 -310
  602. package/lib/commonjs/utils/bitEnums.js +0 -33
  603. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  604. package/lib/module/utils/bitEnums.js +0 -27
  605. package/lib/module/utils/bitEnums.js.map +0 -1
  606. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  607. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  608. package/metro-config/index.d.ts +0 -5
  609. package/metro-config/index.js +0 -41
  610. package/metro-config/tsconfig.json +0 -3
  611. package/src/utils/bitEnums.ts +0 -51
  612. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  613. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  614. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  615. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  616. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  617. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  618. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  619. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  620. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  621. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  622. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  623. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -42,17 +42,35 @@ static inline uint32_t nextPowerOfTwo(uint32_t x)
42
42
  return self;
43
43
  }
44
44
 
45
+ // Note: this method should be called only after the session is activated
45
46
  - (AVAudioFormat *)getInputFormat
46
47
  {
47
- return [AudioEngine.sharedInstance.audioEngine.inputNode inputFormatForBus:0];
48
+ AVAudioFormat *format = [AudioEngine.sharedInstance.audioEngine.inputNode inputFormatForBus:0];
49
+
50
+ if (format.sampleRate == 0 || format.channelCount == 0) {
51
+ AudioSessionManager *sessionManager = [AudioSessionManager sharedInstance];
52
+
53
+ format = [[AVAudioFormat alloc]
54
+ initStandardFormatWithSampleRate:[[sessionManager getDevicePreferredSampleRate] doubleValue]
55
+ channels:[[sessionManager getDevicePreferredInputChannelCount]
56
+ intValue]];
57
+ }
58
+
59
+ return format;
48
60
  }
49
61
 
50
62
  - (int)getBufferSize
51
63
  {
52
64
  // NOTE: this method should be called only after the session is activated
53
65
  AVAudioSession *audioSession = [AVAudioSession sharedInstance];
54
- float bufferDuration = audioSession.IOBufferDuration > 0 ? audioSession.IOBufferDuration : 0.02;
55
66
 
67
+ // TMPfix: it seems that buffer duration in some cases (background/device change) can switch
68
+ // to longer values, exceeding buffer size predicted after session start
69
+ // since it is just a couple of buffers we can set min value of 200ms
70
+ // to enforce we always have enough frames allocated to pass further down the pipeline
71
+ float bufferDuration = MAX(audioSession.IOBufferDuration, 0.2);
72
+
73
+ // IOS returns buffer duration rounded, but expects the buffer size to be power of two in runtime
56
74
  return nextPowerOfTwo(ceil(bufferDuration * audioSession.sampleRate));
57
75
  }
58
76
 
@@ -61,14 +79,15 @@ static inline uint32_t nextPowerOfTwo(uint32_t x)
61
79
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
62
80
  assert(audioEngine != nil);
63
81
 
64
- // AudioEngine allows us to attach and connect nodes at runtime but with few limitations
65
- // in this case if it is the first recorder node and player started the engine we need to restart.
66
- // It can be optimized by tracking if we haven't break rules of at runtime modifications from docs
82
+ // AudioEngine allows us to attach and connect nodes at runtime but with few
83
+ // limitations in this case if it is the first recorder node and player
84
+ // started the engine we need to restart. It can be optimized by tracking if
85
+ // we haven't break rules of at runtime modifications from docs
67
86
  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc
68
87
  //
69
88
  // Currently we are restarting because we do not see any significant performance issue and case when
70
89
  // you will need to start and stop recorder very frequently
71
- [audioEngine stopEngine];
90
+ [audioEngine stopIfNecessary];
72
91
  [audioEngine attachInputNode:self.sinkNode];
73
92
  [audioEngine startIfNecessary];
74
93
  }
@@ -78,7 +97,30 @@ static inline uint32_t nextPowerOfTwo(uint32_t x)
78
97
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
79
98
  assert(audioEngine != nil);
80
99
  [audioEngine detachInputNode];
81
- [audioEngine stopIfNecessary];
100
+ [audioEngine stopIfPossible];
101
+
102
+ // This makes sure that the engine releases the input properly when we no longer need it
103
+ // (i.e. no more misleading dot)
104
+ // Restart only if is not running to avoid interruptions of playback
105
+ if ([audioEngine getState] != AudioEngineStateRunning) {
106
+ [audioEngine restartAudioEngine];
107
+ }
108
+ }
109
+
110
+ - (void)pause
111
+ {
112
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
113
+ assert(audioEngine != nil);
114
+
115
+ [audioEngine pauseIfNecessary];
116
+ }
117
+
118
+ - (void)resume
119
+ {
120
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
121
+ assert(audioEngine != nil);
122
+
123
+ [audioEngine startIfNecessary];
82
124
  }
83
125
 
84
126
  - (void)cleanup
@@ -9,7 +9,9 @@
9
9
  #include <audioapi/dsp/VectorMath.h>
10
10
  #include <audioapi/libs/audio-stretch/stretch.h>
11
11
  #include <audioapi/libs/base64/base64.h>
12
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
12
13
  #include <audioapi/libs/ffmpeg/FFmpegDecoding.h>
14
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
13
15
  #include <audioapi/utils/AudioArray.h>
14
16
  #include <audioapi/utils/AudioBus.h>
15
17
 
@@ -63,19 +65,27 @@ std::shared_ptr<AudioBuffer> AudioDecoder::makeAudioBufferFromFloatBuffer(
63
65
  return std::make_shared<AudioBuffer>(audioBus);
64
66
  }
65
67
 
66
- std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(const std::string &path, float sampleRate)
68
+ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(
69
+ const std::string &path,
70
+ float sampleRate)
67
71
  {
68
72
  if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
73
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
69
74
  auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
70
75
  if (buffer == nullptr) {
71
76
  NSLog(@"Failed to decode with FFmpeg: %s", path.c_str());
72
77
  return nullptr;
73
78
  }
74
79
  return buffer;
80
+ #else
81
+ NSLog(@"FFmpeg is disabled, cannot decode file: %s", path.c_str());
82
+ return nullptr;
83
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
75
84
  }
76
85
  ma_decoder decoder;
77
86
  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
78
- ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
87
+ ma_decoding_backend_vtable *customBackends[] = {
88
+ ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
79
89
 
80
90
  config.ppCustomBackendVTables = customBackends;
81
91
  config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
@@ -94,21 +104,28 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(const std::string
94
104
  return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
95
105
  }
96
106
 
97
- std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate)
107
+ std::shared_ptr<AudioBuffer>
108
+ AudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate)
98
109
  {
99
110
  const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
100
111
  if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
112
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
101
113
  auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));
102
114
  if (buffer == nullptr) {
103
115
  NSLog(@"Failed to decode with FFmpeg");
104
116
  return nullptr;
105
117
  }
106
118
  return buffer;
119
+ #else
120
+ NSLog(@"FFmpeg is disabled, cannot decode memory block");
121
+ return nullptr;
122
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
107
123
  }
108
124
  ma_decoder decoder;
109
125
  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
110
126
 
111
- ma_decoding_backend_vtable *customBackends[] = {ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
127
+ ma_decoding_backend_vtable *customBackends[] = {
128
+ ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};
112
129
 
113
130
  config.ppCustomBackendVTables = customBackends;
114
131
  config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
@@ -0,0 +1,33 @@
1
+ #pragma once
2
+
3
+ #ifndef __OBJC__ // when compiled as C++
4
+ typedef struct objc_object AVAudioFile;
5
+ typedef struct objc_object NSURL;
6
+ typedef struct objc_object AudioBufferList;
7
+ #endif // __OBJC__
8
+
9
+ #include <memory>
10
+
11
+ namespace audioapi {
12
+
13
+ class AudioFileProperties;
14
+
15
+ namespace ios::fileoptions {
16
+
17
+ AudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties);
18
+ NSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties);
19
+ NSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties);
20
+ NSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties);
21
+ NSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties);
22
+ float getSampleRate(const std::shared_ptr<AudioFileProperties> &properties);
23
+
24
+ NSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties);
25
+ NSURL *getFileURL(const std::shared_ptr<AudioFileProperties> &properties);
26
+ NSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties);
27
+
28
+ NSString *getDateString();
29
+ NSString *getTimestampString();
30
+
31
+ } // namespace ios::fileoptions
32
+
33
+ } // namespace audioapi
@@ -0,0 +1,195 @@
1
+ #import <AVFoundation/AVFoundation.h>
2
+ #import <Foundation/Foundation.h>
3
+
4
+ #include <audioapi/ios/core/utils/FileOptions.h>
5
+ #include <audioapi/utils/AudioFileProperties.h>
6
+
7
+ namespace audioapi::ios::fileoptions {
8
+
9
+ /// @brief Maps AudioFileProperties to iOS AVFoundation AudioFormatID.
10
+ /// @param properties Shared pointer to AudioFileProperties.
11
+ /// @returns Corresponding AudioFormatID for AVFoundation.
12
+ AudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties)
13
+ {
14
+ switch (properties->format) {
15
+ case AudioFileProperties::Format::WAV:
16
+ return kAudioFormatLinearPCM;
17
+
18
+ case AudioFileProperties::Format::CAF:
19
+ return kAudioFormatLinearPCM;
20
+
21
+ case AudioFileProperties::Format::M4A:
22
+ return kAudioFormatMPEG4AAC;
23
+
24
+ case AudioFileProperties::Format::FLAC:
25
+ return kAudioFormatFLAC;
26
+
27
+ default:
28
+ return kAudioFormatLinearPCM;
29
+ }
30
+ }
31
+
32
+ /// @brief Maps AudioFileProperties to iOS AVFoundation audio quality settings.
33
+ /// @param properties Shared pointer to AudioFileProperties.
34
+ /// @returns Corresponding NSInteger value for AVAudioQuality.
35
+ NSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties)
36
+ {
37
+ switch (properties->iosAudioQuality) {
38
+ case AudioFileProperties::IOSAudioQuality::Min:
39
+ return AVAudioQualityMin;
40
+
41
+ case AudioFileProperties::IOSAudioQuality::Low:
42
+ return AVAudioQualityLow;
43
+
44
+ case AudioFileProperties::IOSAudioQuality::Medium:
45
+ return AVAudioQualityMedium;
46
+
47
+ case AudioFileProperties::IOSAudioQuality::High:
48
+ return AVAudioQualityHigh;
49
+
50
+ case AudioFileProperties::IOSAudioQuality::Max:
51
+ return AVAudioQualityMax;
52
+
53
+ default:
54
+ return AVAudioQualityMedium;
55
+ }
56
+ }
57
+
58
+ /// @brief Retrieves the FLAC compression level from AudioFileProperties.
59
+ /// @param properties Shared pointer to AudioFileProperties.
60
+ /// @returns NSInteger representing the FLAC compression level.
61
+ NSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties)
62
+ {
63
+ return properties->flacCompressionLevel;
64
+ }
65
+
66
+ /// @brief Retrieves the file extension based on AudioFileProperties format.
67
+ /// @param properties Shared pointer to AudioFileProperties.
68
+ /// @returns NSString representing the file extension.
69
+ NSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties)
70
+ {
71
+ switch (properties->format) {
72
+ case AudioFileProperties::Format::WAV:
73
+ return @"wav";
74
+
75
+ case AudioFileProperties::Format::CAF:
76
+ return @"caf";
77
+
78
+ case AudioFileProperties::Format::M4A:
79
+ return @"m4a";
80
+
81
+ case AudioFileProperties::Format::FLAC:
82
+ return @"flac";
83
+
84
+ default:
85
+ return @"wav";
86
+ }
87
+ }
88
+
89
+ /// @brief Retrieves the bit depth from AudioFileProperties.
90
+ /// @param properties Shared pointer to AudioFileProperties.
91
+ /// @returns NSInteger representing the bit depth.
92
+ NSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties)
93
+ {
94
+ switch (properties->bitDepth) {
95
+ case AudioFileProperties::BitDepth::Bit16:
96
+ return 16;
97
+
98
+ case AudioFileProperties::BitDepth::Bit24:
99
+ return 24;
100
+
101
+ case AudioFileProperties::BitDepth::Bit32:
102
+ return 32;
103
+
104
+ default:
105
+ return 32;
106
+ }
107
+ }
108
+
109
+ /// @brief Constructs AVFoundation file settings dictionary from AudioFileProperties.
110
+ /// @param properties Shared pointer to AudioFileProperties.
111
+ /// @returns NSDictionary containing AVFoundation audio file settings.
112
+ NSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties)
113
+ {
114
+ AudioFormatID format = getFormat(properties);
115
+ NSMutableDictionary *settings = [NSMutableDictionary dictionary];
116
+
117
+ settings[AVFormatIDKey] = @(format);
118
+ settings[AVSampleRateKey] = @(properties->sampleRate);
119
+ settings[AVNumberOfChannelsKey] = @(properties->channelCount);
120
+ settings[AVEncoderAudioQualityKey] = @(getQuality(properties));
121
+
122
+ if (format == kAudioFormatMPEG4AAC) {
123
+ settings[AVEncoderBitRateKey] = @(properties->bitRate);
124
+ }
125
+
126
+ if (format == kAudioFormatLinearPCM) {
127
+ NSInteger bitDepth = getBitDepth(properties);
128
+
129
+ settings[AVLinearPCMBitDepthKey] = @(bitDepth);
130
+ settings[AVLinearPCMIsFloatKey] = @(bitDepth == 32);
131
+ settings[AVLinearPCMIsBigEndianKey] = @(NO);
132
+ settings[AVLinearPCMIsNonInterleaved] = @(NO);
133
+ }
134
+
135
+ if (format == kAudioFormatFLAC) {
136
+ settings[@"FLACCompressionLevel"] = @(getFlacCompressionLevel(properties));
137
+ }
138
+
139
+ return settings;
140
+ }
141
+
142
+ NSURL *getFileURL(const std::shared_ptr<AudioFileProperties> &properties)
143
+ {
144
+ NSError *error = nil;
145
+
146
+ NSSearchPathDirectory directory = getDirectory(properties);
147
+ NSString *subDirectory = [NSString stringWithUTF8String:properties->subDirectory.c_str()];
148
+
149
+ NSURL *baseURL = [[[NSFileManager defaultManager] URLsForDirectory:directory
150
+ inDomains:NSUserDomainMask] firstObject];
151
+ NSURL *directoryURL = [baseURL URLByAppendingPathComponent:subDirectory isDirectory:YES];
152
+
153
+ [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL
154
+ withIntermediateDirectories:YES
155
+ attributes:nil
156
+ error:&error];
157
+
158
+ if (error != nil) {
159
+ NSLog(@"Error creating directory for audio recordings: %@", [error debugDescription]);
160
+ directoryURL = baseURL;
161
+ }
162
+
163
+ NSString *fileNamePrefix = [NSString stringWithUTF8String:properties->fileNamePrefix.c_str()];
164
+ NSString *timestamp = getTimestampString();
165
+ NSString *fileExtension = getFileExtension(properties);
166
+
167
+ NSString *fileName =
168
+ [NSString stringWithFormat:@"%@_%@.%@", fileNamePrefix, timestamp, fileExtension];
169
+ return [directoryURL URLByAppendingPathComponent:fileName];
170
+ }
171
+
172
+ NSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties)
173
+ {
174
+ switch (properties->directory) {
175
+ case AudioFileProperties::FileDirectory::Document:
176
+ return NSDocumentDirectory;
177
+
178
+ case AudioFileProperties::FileDirectory::Cache:
179
+ return NSCachesDirectory;
180
+
181
+ default:
182
+ return NSCachesDirectory;
183
+ }
184
+ }
185
+
186
+ NSString *getTimestampString()
187
+ {
188
+ NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
189
+ fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
190
+ fmt.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; // or local if you prefer
191
+ fmt.dateFormat = @"yyyyMMdd_HHmmss_SSS";
192
+ return [fmt stringFromDate:[NSDate date]];
193
+ }
194
+
195
+ } // namespace audioapi::ios::fileoptions
@@ -1,5 +1,7 @@
1
1
  #pragma once
2
2
 
3
+ #include <audioapi/core/utils/AudioFileWriter.h>
4
+ #include <audioapi/utils/Result.hpp>
3
5
  #include <memory>
4
6
  #include <string>
5
7
  #include <tuple>
@@ -15,30 +17,30 @@ typedef struct objc_object AVAudioConverter;
15
17
 
16
18
  namespace audioapi {
17
19
 
18
- class IOSAudioFileOptions;
20
+ class AudioFileProperties;
21
+ class AudioEventHandlerRegistry;
19
22
 
20
- class IOSAudioFileWriter {
23
+ class IOSFileWriter : public AudioFileWriter {
21
24
  public:
22
- IOSAudioFileWriter(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags);
23
- ~IOSAudioFileWriter();
25
+ IOSFileWriter(
26
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
27
+ const std::shared_ptr<AudioFileProperties> &fileProperties);
28
+ ~IOSFileWriter();
24
29
 
25
- std::string openFile(AVAudioFormat *bufferFormat, size_t maxInputBufferLength);
26
- std::tuple<double, double> closeFile();
30
+ Result<std::string, std::string> openFile(
31
+ AVAudioFormat *bufferFormat,
32
+ size_t maxInputBufferLength);
33
+ Result<std::tuple<double, double>, std::string> closeFile() override;
27
34
 
28
35
  bool writeAudioData(const AudioBufferList *audioBufferList, int numFrames);
36
+ double getCurrentDuration() const override;
29
37
 
30
- double getCurrentDuration() const;
38
+ std::string getFilePath() const override;
31
39
 
32
- private:
40
+ protected:
33
41
  size_t converterInputBufferSize_;
34
42
  size_t converterOutputBufferSize_;
35
- std::atomic<size_t> framesWritten_{0};
36
43
 
37
- NSString *getISODateStringForDirectory();
38
- NSString *getTimestampForFilename();
39
- NSURL *getFileURL();
40
-
41
- std::shared_ptr<IOSAudioFileOptions> fileOptions_;
42
44
  AVAudioFile *audioFile_;
43
45
  AVAudioFormat *bufferFormat_;
44
46
  AVAudioConverter *converter_;
@@ -0,0 +1,239 @@
1
+ #import <AVFoundation/AVFoundation.h>
2
+ #import <Foundation/Foundation.h>
3
+
4
+ #include <audioapi/events/AudioEventHandlerRegistry.h>
5
+ #include <audioapi/ios/core/utils/FileOptions.h>
6
+ #include <audioapi/ios/core/utils/IOSFileWriter.h>
7
+ #include <audioapi/utils/AudioFileProperties.h>
8
+ #include <audioapi/utils/Result.hpp>
9
+ #include <audioapi/utils/UnitConversion.h>
10
+
11
+ namespace audioapi {
12
+ IOSFileWriter::IOSFileWriter(
13
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
14
+ const std::shared_ptr<AudioFileProperties> &fileProperties)
15
+ : AudioFileWriter(audioEventHandlerRegistry, fileProperties)
16
+ {
17
+ }
18
+
19
+ IOSFileWriter::~IOSFileWriter()
20
+ {
21
+ @autoreleasepool {
22
+ fileURL_ = nil;
23
+ audioFile_ = nil;
24
+ converter_ = nil;
25
+ bufferFormat_ = nil;
26
+ }
27
+ }
28
+
29
+ /// @brief Opens an audio file for writing with the specified buffer format and maximum input buffer length.
30
+ /// This method initializes the AVAudioFile and AVAudioConverter for audio data writing and conversion.
31
+ /// This method should be called from the JS thread only.
32
+ /// @param bufferFormat The audio format of the input buffer.
33
+ /// @param maxInputBufferLength The maximum length of the input buffer in frames.
34
+ /// @returns An OpenFileResult indicating success with the file path or an error message.
35
+ OpenFileResult IOSFileWriter::openFile(AVAudioFormat *bufferFormat, size_t maxInputBufferLength)
36
+ {
37
+ @autoreleasepool {
38
+ if (audioFile_ != nil) {
39
+ return OpenFileResult::Err("file already open");
40
+ }
41
+
42
+ framesWritten_.store(0, std::memory_order_release);
43
+ bufferFormat_ = bufferFormat;
44
+
45
+ NSError *error = nil;
46
+ NSDictionary *settings = ios::fileoptions::getFileSettings(fileProperties_);
47
+ fileURL_ = ios::fileoptions::getFileURL(fileProperties_);
48
+
49
+ if (fileProperties_->sampleRate == 0 || fileProperties_->channelCount == 0) {
50
+ return OpenFileResult::Err(
51
+ "Invalid file properties: sampleRate and channelCount must be greater than 0");
52
+ }
53
+
54
+ if (bufferFormat.sampleRate == 0 || bufferFormat.channelCount == 0) {
55
+ return OpenFileResult::Err(
56
+ "Invalid input format: sampleRate and channelCount must be greater than 0");
57
+ }
58
+
59
+ audioFile_ = [[AVAudioFile alloc] initForWriting:fileURL_
60
+ settings:settings
61
+ commonFormat:AVAudioPCMFormatFloat32
62
+ interleaved:bufferFormat.interleaved
63
+ error:&error];
64
+
65
+ if (error != nil) {
66
+ return OpenFileResult::Err(
67
+ std::string("Error creating audio file for writing: ") +
68
+ [[error debugDescription] UTF8String]);
69
+ }
70
+
71
+ converter_ = [[AVAudioConverter alloc] initFromFormat:bufferFormat
72
+ toFormat:[audioFile_ processingFormat]];
73
+ converter_.sampleRateConverterAlgorithm = AVSampleRateConverterAlgorithm_Normal;
74
+ converter_.sampleRateConverterQuality = AVAudioQualityMax;
75
+ converter_.primeMethod = AVAudioConverterPrimeMethod_None;
76
+
77
+ converterInputBufferSize_ = maxInputBufferLength;
78
+ converterOutputBufferSize_ = std::max(
79
+ (double)maxInputBufferLength,
80
+ fileProperties_->sampleRate / bufferFormat.sampleRate * maxInputBufferLength);
81
+
82
+ converterInputBuffer_ =
83
+ [[AVAudioPCMBuffer alloc] initWithPCMFormat:bufferFormat
84
+ frameCapacity:(AVAudioFrameCount)maxInputBufferLength];
85
+ converterOutputBuffer_ =
86
+ [[AVAudioPCMBuffer alloc] initWithPCMFormat:[audioFile_ processingFormat]
87
+ frameCapacity:(AVAudioFrameCount)converterOutputBufferSize_];
88
+
89
+ if (converterInputBuffer_ == nil || converterOutputBuffer_ == nil || audioFile_ == nil ||
90
+ converter_ == nil) {
91
+ audioFile_ = nil;
92
+ converter_ = nil;
93
+ converterInputBuffer_ = nil;
94
+ converterOutputBuffer_ = nil;
95
+
96
+ return OpenFileResult::Err("Error creating converter buffers");
97
+ }
98
+
99
+ return OpenFileResult::Ok([[fileURL_ path] UTF8String]);
100
+ }
101
+ }
102
+
103
+ /// @brief Closes the currently open audio file and finalizes writing.
104
+ /// This method retrieves the final file duration and size before closing.
105
+ /// This method should be called from the JS thread only.
106
+ /// @returns A CloseFileResult indicating success with file duration and size or an error message.
107
+ CloseFileResult IOSFileWriter::closeFile()
108
+ {
109
+ @autoreleasepool {
110
+ NSError *error;
111
+ std::string filePath = [[fileURL_ path] UTF8String];
112
+
113
+ if (audioFile_ == nil) {
114
+ return CloseFileResult::Err("file is not open: " + filePath);
115
+ }
116
+
117
+ // AVAudioFile automatically finalizes the file when deallocated
118
+ audioFile_ = nil;
119
+
120
+ double fileDuration = CMTimeGetSeconds([[AVURLAsset URLAssetWithURL:fileURL_
121
+ options:nil] duration]);
122
+ double fileSizeBytesMb = static_cast<double>([[[NSFileManager defaultManager]
123
+ attributesOfItemAtPath:fileURL_.path
124
+ error:&error] fileSize]) /
125
+ MB_IN_BYTES;
126
+
127
+ if (error != nil) {
128
+ NSLog(@"⚠️ closeFile: error while retrieving file size");
129
+ fileSizeBytesMb = 0;
130
+ }
131
+
132
+ fileURL_ = nil;
133
+ framesWritten_.store(0, std::memory_order_release);
134
+
135
+ return CloseFileResult::Ok(std::make_tuple(fileDuration, fileSizeBytesMb));
136
+ }
137
+ }
138
+
139
+ /// @brief Writes audio data to the open audio file, performing format conversion if necessary.
140
+ /// This method should be called from the audio thread.
141
+ /// @param audioBufferList Pointer to the AudioBufferList containing the audio data to write.
142
+ /// @param numFrames Number of audio frames in the audioBufferList.
143
+ /// @returns True if the write operation was successful, false otherwise.
144
+ bool IOSFileWriter::writeAudioData(const AudioBufferList *audioBufferList, int numFrames)
145
+ {
146
+ if (audioFile_ == nil) {
147
+ invokeOnErrorCallback("Attempted to write audio data when file is not open");
148
+ return false;
149
+ }
150
+
151
+ @autoreleasepool {
152
+ NSError *error = nil;
153
+ AVAudioFormat *fileFormat = [audioFile_ processingFormat];
154
+
155
+ if (bufferFormat_.sampleRate == fileFormat.sampleRate &&
156
+ bufferFormat_.channelCount == fileFormat.channelCount &&
157
+ bufferFormat_.isInterleaved == fileFormat.isInterleaved) {
158
+ // We can use the converter input buffer as a "transport" layer to the file
159
+ for (size_t i = 0; i < bufferFormat_.channelCount; ++i) {
160
+ memcpy(
161
+ converterInputBuffer_.mutableAudioBufferList->mBuffers[i].mData,
162
+ audioBufferList->mBuffers[i].mData,
163
+ audioBufferList->mBuffers[i].mDataByteSize);
164
+ }
165
+ converterInputBuffer_.frameLength = numFrames;
166
+
167
+ [audioFile_ writeFromBuffer:converterInputBuffer_ error:&error];
168
+
169
+ if (error != nil) {
170
+ invokeOnErrorCallback(
171
+ std::string("Error writing audio data to file, native error: ") +
172
+ [[error debugDescription] UTF8String]);
173
+ return false;
174
+ }
175
+
176
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
177
+ return true;
178
+ }
179
+
180
+ for (size_t i = 0; i < bufferFormat_.channelCount; ++i) {
181
+ memcpy(
182
+ converterInputBuffer_.mutableAudioBufferList->mBuffers[i].mData,
183
+ audioBufferList->mBuffers[i].mData,
184
+ audioBufferList->mBuffers[i].mDataByteSize);
185
+ }
186
+
187
+ converterInputBuffer_.frameLength = numFrames;
188
+
189
+ __block BOOL handedOff = false;
190
+ AVAudioConverterInputBlock inputBlock = ^AVAudioBuffer *_Nullable(
191
+ AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)
192
+ {
193
+ if (handedOff) {
194
+ *outStatus = AVAudioConverterInputStatus_NoDataNow;
195
+ return nil;
196
+ }
197
+
198
+ handedOff = true;
199
+ *outStatus = AVAudioConverterInputStatus_HaveData;
200
+ return converterInputBuffer_;
201
+ };
202
+
203
+ [converter_ convertToBuffer:converterOutputBuffer_ error:&error withInputFromBlock:inputBlock];
204
+ converterOutputBuffer_.frameLength =
205
+ fileProperties_->sampleRate / bufferFormat_.sampleRate * numFrames;
206
+
207
+ if (error != nil) {
208
+ invokeOnErrorCallback(
209
+ std::string("Error during audio conversion, native error: ") +
210
+ [[error debugDescription] UTF8String]);
211
+ return false;
212
+ }
213
+
214
+ [audioFile_ writeFromBuffer:converterOutputBuffer_ error:&error];
215
+
216
+ if (error != nil) {
217
+ invokeOnErrorCallback(
218
+ std::string("Error writing audio data to file, native error: ") +
219
+ [[error debugDescription] UTF8String]);
220
+ return false;
221
+ }
222
+
223
+ framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);
224
+ return true;
225
+ }
226
+ }
227
+
228
+ double IOSFileWriter::getCurrentDuration() const
229
+ {
230
+ return static_cast<double>(framesWritten_.load(std::memory_order_acquire)) /
231
+ bufferFormat_.sampleRate;
232
+ }
233
+
234
+ std::string IOSFileWriter::getFilePath() const
235
+ {
236
+ return [[fileURL_ path] UTF8String];
237
+ }
238
+
239
+ } // namespace audioapi