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
@@ -15,7 +15,10 @@
15
15
 
16
16
  __weak typeof(self) weakSelf = self;
17
17
  self.renderBlock = ^OSStatus(
18
- BOOL *isSilence, const AudioTimeStamp *timestamp, AVAudioFrameCount frameCount, AudioBufferList *outputData) {
18
+ BOOL *isSilence,
19
+ const AudioTimeStamp *timestamp,
20
+ AVAudioFrameCount frameCount,
21
+ AudioBufferList *outputData) {
19
22
  if (outputData->mNumberBuffers != weakSelf.channelCount) {
20
23
  return kAudioServicesBadPropertySizeError;
21
24
  }
@@ -25,8 +28,10 @@
25
28
  return kAudioServicesNoError;
26
29
  };
27
30
 
28
- _format = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:self.sampleRate channels:self.channelCount];
29
- _sourceNode = [[AVAudioSourceNode alloc] initWithFormat:self.format renderBlock:self.renderBlock];
31
+ _format = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:self.sampleRate
32
+ channels:self.channelCount];
33
+ _sourceNode = [[AVAudioSourceNode alloc] initWithFormat:self.format
34
+ renderBlock:self.renderBlock];
30
35
  }
31
36
 
32
37
  return self;
@@ -34,29 +39,27 @@
34
39
 
35
40
  - (bool)start
36
41
  {
37
- NSLog(@"[AudioPlayer] start");
38
-
39
42
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
40
43
  assert(audioEngine != nil);
41
44
 
42
- // AudioEngine allows us to attach and connect nodes at runtime but with few limitations
43
- // in this case if it is the first player and recorder started the engine we need to restart.
44
- // It can be optimized by tracking if we haven't break rules of at runtime modifications from docs
45
+ // AudioEngine allows us to attach and connect nodes at runtime but with few
46
+ // limitations in this case if it is the first player and recorder started the
47
+ // engine we need to restart. It can be optimized by tracking if we haven't
48
+ // break rules of at runtime modifications from docs
45
49
  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc
46
50
  //
47
51
  // Currently we are restarting because we do not see any significant performance issue and case when
48
52
  // you will need to start and stop player very frequently
49
- [audioEngine stopEngine];
53
+ [audioEngine stopIfNecessary];
50
54
  self.sourceNodeId = [audioEngine attachSourceNode:self.sourceNode format:self.format];
51
55
  return [audioEngine startIfNecessary];
52
56
  }
53
57
 
54
58
  - (void)stop
55
59
  {
56
- NSLog(@"[AudioPlayer] stop");
57
-
58
60
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
59
61
  assert(audioEngine != nil);
62
+
60
63
  [audioEngine detachSourceNodeWithId:self.sourceNodeId];
61
64
  [audioEngine stopIfNecessary];
62
65
  self.sourceNodeId = nil;
@@ -64,7 +67,6 @@
64
67
 
65
68
  - (bool)resume
66
69
  {
67
- NSLog(@"[AudioPlayer] resume");
68
70
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
69
71
  assert(audioEngine != nil);
70
72
 
@@ -75,7 +77,8 @@
75
77
  {
76
78
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
77
79
  assert(audioEngine != nil);
78
- [audioEngine pauseEngine:self.sourceNodeId];
80
+
81
+ [audioEngine pauseIfNecessary];
79
82
  }
80
83
 
81
84
  - (void)cleanup
@@ -7,9 +7,6 @@ typedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFr
7
7
 
8
8
  @interface NativeAudioRecorder : NSObject
9
9
 
10
- @property (nonatomic, assign) int bufferLength;
11
- @property (nonatomic, assign) float sampleRate;
12
-
13
10
  @property (nonatomic, strong) AVAudioSinkNode *sinkNode;
14
11
  @property (nonatomic, copy) AVAudioSinkNodeReceiverBlock receiverSinkBlock;
15
12
  @property (nonatomic, copy) AudioReceiverBlock receiverBlock;
@@ -18,10 +15,16 @@ typedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFr
18
15
 
19
16
  - (AVAudioFormat *)getInputFormat;
20
17
 
18
+ - (int)getBufferSize;
19
+
21
20
  - (void)start;
22
21
 
23
22
  - (void)stop;
24
23
 
24
+ - (void)pause;
25
+
26
+ - (void)resume;
27
+
25
28
  - (void)cleanup;
26
29
 
27
30
  @end
@@ -4,6 +4,23 @@
4
4
 
5
5
  @implementation NativeAudioRecorder
6
6
 
7
+ static inline uint32_t nextPowerOfTwo(uint32_t x)
8
+ {
9
+ if (x == 0) {
10
+ return 1;
11
+ }
12
+
13
+ x--;
14
+ x |= x >> 1;
15
+ x |= x >> 2;
16
+ x |= x >> 4;
17
+ x |= x >> 8;
18
+ x |= x >> 16;
19
+ x++;
20
+
21
+ return x;
22
+ }
23
+
7
24
  - (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
8
25
  {
9
26
  if (self = [super init]) {
@@ -27,7 +44,33 @@
27
44
 
28
45
  - (AVAudioFormat *)getInputFormat
29
46
  {
30
- return [AudioEngine.sharedInstance.audioEngine.inputNode inputFormatForBus:0];
47
+ AVAudioFormat *format = [AudioEngine.sharedInstance.audioEngine.inputNode inputFormatForBus:0];
48
+
49
+ if (format.sampleRate == 0 || format.channelCount == 0) {
50
+ AudioSessionManager *sessionManager = [AudioSessionManager sharedInstance];
51
+
52
+ format = [[AVAudioFormat alloc]
53
+ initStandardFormatWithSampleRate:[[sessionManager getDevicePreferredSampleRate] doubleValue]
54
+ channels:[[sessionManager getDevicePreferredInputChannelCount]
55
+ intValue]];
56
+ }
57
+
58
+ return format;
59
+ }
60
+
61
+ - (int)getBufferSize
62
+ {
63
+ // NOTE: this method should be called only after the session is activated
64
+ AVAudioSession *audioSession = [AVAudioSession sharedInstance];
65
+
66
+ // TMPfix: it seems that buffer duration in some cases (background/device change) can switch
67
+ // to longer values, exceeding buffer size predicted after session start
68
+ // since it is just a couple of buffers we can set min value of 200ms
69
+ // to enforce we always have enough frames allocated to pass further down the pipeline
70
+ float bufferDuration = MAX(audioSession.IOBufferDuration, 0.2);
71
+
72
+ // IOS returns buffer duration rounded, but expects the buffer size to be power of two in runtime
73
+ return nextPowerOfTwo(ceil(bufferDuration * audioSession.sampleRate));
31
74
  }
32
75
 
33
76
  - (void)start
@@ -35,14 +78,15 @@
35
78
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
36
79
  assert(audioEngine != nil);
37
80
 
38
- // AudioEngine allows us to attach and connect nodes at runtime but with few limitations
39
- // in this case if it is the first recorder node and player started the engine we need to restart.
40
- // It can be optimized by tracking if we haven't break rules of at runtime modifications from docs
81
+ // AudioEngine allows us to attach and connect nodes at runtime but with few
82
+ // limitations in this case if it is the first recorder node and player
83
+ // started the engine we need to restart. It can be optimized by tracking if
84
+ // we haven't break rules of at runtime modifications from docs
41
85
  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc
42
86
  //
43
87
  // Currently we are restarting because we do not see any significant performance issue and case when
44
88
  // you will need to start and stop recorder very frequently
45
- [audioEngine stopEngine];
89
+ [audioEngine stopIfNecessary];
46
90
  [audioEngine attachInputNode:self.sinkNode];
47
91
  [audioEngine startIfNecessary];
48
92
  }
@@ -51,8 +95,25 @@
51
95
  {
52
96
  AudioEngine *audioEngine = [AudioEngine sharedInstance];
53
97
  assert(audioEngine != nil);
54
- [audioEngine detachInputNode];
55
98
  [audioEngine stopIfNecessary];
99
+ [audioEngine detachInputNode];
100
+ [audioEngine restartAudioEngine];
101
+ }
102
+
103
+ - (void)pause
104
+ {
105
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
106
+ assert(audioEngine != nil);
107
+
108
+ [audioEngine pauseIfNecessary];
109
+ }
110
+
111
+ - (void)resume
112
+ {
113
+ AudioEngine *audioEngine = [AudioEngine sharedInstance];
114
+ assert(audioEngine != nil);
115
+
116
+ [audioEngine startIfNecessary];
56
117
  }
57
118
 
58
119
  - (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
 
@@ -59,22 +61,31 @@ std::shared_ptr<AudioBuffer> AudioDecoder::makeAudioBufferFromFloatBuffer(
59
61
  channelData[i] = buffer[i * outputChannels + ch];
60
62
  }
61
63
  }
64
+
62
65
  return std::make_shared<AudioBuffer>(audioBus);
63
66
  }
64
67
 
65
- 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)
66
71
  {
67
72
  if (AudioDecoder::pathHasExtension(path, {".mp4", ".m4a", ".aac"})) {
73
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
68
74
  auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));
69
75
  if (buffer == nullptr) {
70
76
  NSLog(@"Failed to decode with FFmpeg: %s", path.c_str());
71
77
  return nullptr;
72
78
  }
73
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
74
84
  }
75
85
  ma_decoder decoder;
76
86
  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
77
- 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};
78
89
 
79
90
  config.ppCustomBackendVTables = customBackends;
80
91
  config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
@@ -93,21 +104,28 @@ std::shared_ptr<AudioBuffer> AudioDecoder::decodeWithFilePath(const std::string
93
104
  return makeAudioBufferFromFloatBuffer(buffer, outputSampleRate, outputChannels);
94
105
  }
95
106
 
96
- 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)
97
109
  {
98
110
  const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);
99
111
  if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {
112
+ #if !RN_AUDIO_API_FFMPEG_DISABLED
100
113
  auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));
101
114
  if (buffer == nullptr) {
102
115
  NSLog(@"Failed to decode with FFmpeg");
103
116
  return nullptr;
104
117
  }
105
118
  return buffer;
119
+ #else
120
+ NSLog(@"FFmpeg is disabled, cannot decode memory block");
121
+ return nullptr;
122
+ #endif // RN_AUDIO_API_FFMPEG_DISABLED
106
123
  }
107
124
  ma_decoder decoder;
108
125
  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));
109
126
 
110
- 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};
111
129
 
112
130
  config.ppCustomBackendVTables = customBackends;
113
131
  config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);
@@ -0,0 +1,31 @@
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
+ namespace audioapi {
10
+
11
+ class AudioFileProperties;
12
+
13
+ namespace ios::fileoptions {
14
+
15
+ AudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties);
16
+ NSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties);
17
+ NSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties);
18
+ NSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties);
19
+ NSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties);
20
+ float getSampleRate(const std::shared_ptr<AudioFileProperties> &properties);
21
+
22
+ NSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties);
23
+ NSURL *getFileURL(const std::shared_ptr<AudioFileProperties> &properties);
24
+ NSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties);
25
+
26
+ NSString *getDateString();
27
+ NSString *getTimestampString();
28
+
29
+ } // namespace ios::fileoptions
30
+
31
+ } // namespace audioapi
@@ -0,0 +1,177 @@
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
+ AudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties)
10
+ {
11
+ switch (properties->format) {
12
+ case AudioFileProperties::Format::WAV:
13
+ return kAudioFormatLinearPCM;
14
+
15
+ case AudioFileProperties::Format::CAF:
16
+ return kAudioFormatLinearPCM;
17
+
18
+ case AudioFileProperties::Format::M4A:
19
+ return kAudioFormatMPEG4AAC;
20
+
21
+ case AudioFileProperties::Format::FLAC:
22
+ return kAudioFormatFLAC;
23
+
24
+ default:
25
+ return kAudioFormatLinearPCM;
26
+ }
27
+ }
28
+
29
+ NSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties)
30
+ {
31
+ switch (properties->iosAudioQuality) {
32
+ case AudioFileProperties::IOSAudioQuality::Min:
33
+ return AVAudioQualityMin;
34
+
35
+ case AudioFileProperties::IOSAudioQuality::Low:
36
+ return AVAudioQualityLow;
37
+
38
+ case AudioFileProperties::IOSAudioQuality::Medium:
39
+ return AVAudioQualityMedium;
40
+
41
+ case AudioFileProperties::IOSAudioQuality::High:
42
+ return AVAudioQualityHigh;
43
+
44
+ case AudioFileProperties::IOSAudioQuality::Max:
45
+ return AVAudioQualityMax;
46
+
47
+ default:
48
+ return AVAudioQualityMedium;
49
+ }
50
+ }
51
+
52
+ NSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties)
53
+ {
54
+ return properties->flacCompressionLevel;
55
+ }
56
+
57
+ NSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties)
58
+ {
59
+ switch (properties->format) {
60
+ case AudioFileProperties::Format::WAV:
61
+ return @"wav";
62
+
63
+ case AudioFileProperties::Format::CAF:
64
+ return @"caf";
65
+
66
+ case AudioFileProperties::Format::M4A:
67
+ return @"m4a";
68
+
69
+ case AudioFileProperties::Format::FLAC:
70
+ return @"flac";
71
+
72
+ default:
73
+ return @"wav";
74
+ }
75
+ }
76
+
77
+ NSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties)
78
+ {
79
+ switch (properties->bitDepth) {
80
+ case AudioFileProperties::BitDepth::Bit16:
81
+ return 16;
82
+
83
+ case AudioFileProperties::BitDepth::Bit24:
84
+ return 24;
85
+
86
+ case AudioFileProperties::BitDepth::Bit32:
87
+ return 32;
88
+
89
+ default:
90
+ return 32;
91
+ }
92
+ }
93
+
94
+ NSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties)
95
+ {
96
+ AudioFormatID format = getFormat(properties);
97
+ NSMutableDictionary *settings = [NSMutableDictionary dictionary];
98
+
99
+ settings[AVFormatIDKey] = @(format);
100
+ settings[AVSampleRateKey] = @(properties->sampleRate);
101
+ settings[AVNumberOfChannelsKey] = @(properties->channelCount);
102
+ settings[AVEncoderAudioQualityKey] = @(getQuality(properties));
103
+
104
+ if (format == kAudioFormatMPEG4AAC) {
105
+ settings[AVEncoderBitRateKey] = @(properties->bitRate);
106
+ }
107
+
108
+ if (format == kAudioFormatLinearPCM) {
109
+ NSInteger bitDepth = getBitDepth(properties);
110
+
111
+ settings[AVLinearPCMBitDepthKey] = @(bitDepth);
112
+ settings[AVLinearPCMIsFloatKey] = @(bitDepth == 32);
113
+ settings[AVLinearPCMIsBigEndianKey] = @(NO);
114
+ settings[AVLinearPCMIsNonInterleaved] = @(NO);
115
+ }
116
+
117
+ if (format == kAudioFormatFLAC) {
118
+ settings[@"FLACCompressionLevel"] = @(getFlacCompressionLevel(properties));
119
+ }
120
+
121
+ return settings;
122
+ }
123
+
124
+ NSURL *getFileURL(const std::shared_ptr<AudioFileProperties> &properties)
125
+ {
126
+ NSError *error = nil;
127
+
128
+ NSSearchPathDirectory directory = getDirectory(properties);
129
+ NSString *subDirectory = [NSString stringWithUTF8String:properties->subDirectory.c_str()];
130
+
131
+ NSURL *baseURL = [[[NSFileManager defaultManager] URLsForDirectory:directory
132
+ inDomains:NSUserDomainMask] firstObject];
133
+ NSURL *directoryURL = [baseURL URLByAppendingPathComponent:subDirectory isDirectory:YES];
134
+
135
+ [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL
136
+ withIntermediateDirectories:YES
137
+ attributes:nil
138
+ error:&error];
139
+
140
+ if (error != nil) {
141
+ NSLog(@"Error creating directory for audio recordings: %@", [error debugDescription]);
142
+ directoryURL = baseURL;
143
+ }
144
+
145
+ NSString *fileNamePrefix = [NSString stringWithUTF8String:properties->fileNamePrefix.c_str()];
146
+ NSString *timestamp = getTimestampString();
147
+ NSString *fileExtension = getFileExtension(properties);
148
+
149
+ NSString *fileName =
150
+ [NSString stringWithFormat:@"%@_%@.%@", fileNamePrefix, timestamp, fileExtension];
151
+ return [directoryURL URLByAppendingPathComponent:fileName];
152
+ }
153
+
154
+ NSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties)
155
+ {
156
+ switch (properties->directory) {
157
+ case AudioFileProperties::FileDirectory::Document:
158
+ return NSDocumentDirectory;
159
+
160
+ case AudioFileProperties::FileDirectory::Cache:
161
+ return NSCachesDirectory;
162
+
163
+ default:
164
+ return NSCachesDirectory;
165
+ }
166
+ }
167
+
168
+ NSString *getTimestampString()
169
+ {
170
+ NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
171
+ fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
172
+ fmt.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; // or local if you prefer
173
+ fmt.dateFormat = @"yyyyMMdd_HHmmss_SSS";
174
+ return [fmt stringFromDate:[NSDate date]];
175
+ }
176
+
177
+ } // namespace audioapi::ios::fileoptions
@@ -0,0 +1,53 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/core/utils/AudioFileWriter.h>
4
+ #include <audioapi/utils/Result.hpp>
5
+ #include <memory>
6
+ #include <string>
7
+ #include <tuple>
8
+
9
+ #ifndef __OBJC__ // when compiled as C++
10
+ typedef struct objc_object NSURL;
11
+ typedef struct objc_object NSString;
12
+ typedef struct objc_object AVAudioFile;
13
+ typedef struct objc_object AVAudioFormat;
14
+ typedef struct objc_object AudioBufferList;
15
+ typedef struct objc_object AVAudioConverter;
16
+ #endif // __OBJC__
17
+
18
+ namespace audioapi {
19
+
20
+ class AudioFileProperties;
21
+ class AudioEventHandlerRegistry;
22
+
23
+ class IOSFileWriter : public AudioFileWriter {
24
+ public:
25
+ IOSFileWriter(
26
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
27
+ const std::shared_ptr<AudioFileProperties> &fileProperties);
28
+ ~IOSFileWriter();
29
+
30
+ Result<std::string, std::string> openFile(
31
+ AVAudioFormat *bufferFormat,
32
+ size_t maxInputBufferLength);
33
+ Result<std::tuple<double, double>, std::string> closeFile() override;
34
+
35
+ bool writeAudioData(const AudioBufferList *audioBufferList, int numFrames);
36
+ double getCurrentDuration() const override;
37
+
38
+ std::string getFilePath() const override;
39
+
40
+ protected:
41
+ size_t converterInputBufferSize_;
42
+ size_t converterOutputBufferSize_;
43
+
44
+ AVAudioFile *audioFile_;
45
+ AVAudioFormat *bufferFormat_;
46
+ AVAudioConverter *converter_;
47
+ NSURL *fileURL_;
48
+
49
+ AVAudioPCMBuffer *converterInputBuffer_;
50
+ AVAudioPCMBuffer *converterOutputBuffer_;
51
+ };
52
+
53
+ } // namespace audioapi