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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +219 -84
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +23 -23
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +47 -47
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +379 -298
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -91
  19. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +48 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +132 -104
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -16
  24. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
  25. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
  26. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  27. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  28. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  29. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  30. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  31. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  32. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  33. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  34. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  35. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  36. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  37. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  38. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  39. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  40. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  41. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  42. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  43. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  44. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  45. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  46. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  47. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  48. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  49. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  50. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  51. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  52. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  53. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  54. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  55. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  56. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  57. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  58. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  59. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  60. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  61. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  62. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  63. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  64. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  65. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  66. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  68. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  69. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  70. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  71. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +98 -50
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -2
  73. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  74. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  75. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  76. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  77. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  78. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  79. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  80. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  81. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  82. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  83. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  84. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  85. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  86. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  87. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  88. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  89. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  90. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  91. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  92. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  93. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  94. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  95. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  96. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  97. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  98. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  99. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  100. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  101. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  102. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  103. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  104. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  105. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  106. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +84 -66
  107. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
  108. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  109. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  110. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  111. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  112. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  113. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  114. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  115. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  116. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  117. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  118. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  119. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  120. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  121. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  122. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  123. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  124. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +58 -36
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +42 -44
  126. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  127. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  128. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  129. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  130. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  131. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  132. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  133. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  134. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  135. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  136. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  137. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  138. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  139. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  140. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  141. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  142. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +104 -87
  143. package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -33
  144. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  145. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  146. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  147. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  148. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  149. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +43 -0
  150. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  151. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  152. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  153. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  154. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  155. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  156. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  157. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +51 -0
  158. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  159. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  160. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  161. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  162. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  163. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  164. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  165. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  166. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  167. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  168. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  169. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  170. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  171. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  172. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  173. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  174. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  175. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  176. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  177. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  178. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  179. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  180. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  181. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  182. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  183. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  184. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  185. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  186. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  187. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  188. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  189. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  190. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  217. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  218. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  219. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  220. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  221. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  222. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  223. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  224. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  225. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  226. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  227. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  228. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  229. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  230. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  231. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  232. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  233. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  234. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  235. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  236. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  237. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  238. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  239. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  240. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  241. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  242. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  243. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  244. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  245. package/common/cpp/audioapi/utils/Result.hpp +286 -0
  246. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  247. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  248. package/common/cpp/test/CMakeLists.txt +20 -14
  249. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  250. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  251. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  252. package/common/cpp/test/src/DelayTest.cpp +108 -0
  253. package/common/cpp/test/src/GainTest.cpp +4 -5
  254. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  255. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  256. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  257. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  258. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  259. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  260. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  261. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  262. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  263. package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
  264. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  265. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  266. package/ios/audioapi/ios/core/IOSAudioRecorder.h +26 -18
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +193 -53
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
  272. package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
  273. package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
  274. package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  277. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
  278. package/ios/audioapi/ios/system/AudioEngine.h +19 -16
  279. package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
  280. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  281. package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
  282. package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
  283. package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
  284. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  285. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  286. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  287. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  288. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  289. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  290. package/lib/commonjs/api.js +18 -12
  291. package/lib/commonjs/api.js.map +1 -1
  292. package/lib/commonjs/api.web.js +8 -0
  293. package/lib/commonjs/api.web.js.map +1 -1
  294. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  295. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  296. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  297. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  298. package/lib/commonjs/core/AudioContext.js +5 -8
  299. package/lib/commonjs/core/AudioContext.js.map +1 -1
  300. package/lib/commonjs/core/AudioNode.js +1 -1
  301. package/lib/commonjs/core/AudioNode.js.map +1 -1
  302. package/lib/commonjs/core/AudioParam.js +18 -11
  303. package/lib/commonjs/core/AudioParam.js.map +1 -1
  304. package/lib/commonjs/core/AudioRecorder.js +43 -55
  305. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  306. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  307. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  308. package/lib/commonjs/core/ConvolverNode.js +37 -0
  309. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  310. package/lib/commonjs/core/DelayNode.js +17 -0
  311. package/lib/commonjs/core/DelayNode.js.map +1 -0
  312. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  313. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  314. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  315. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  316. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  317. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  318. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  319. package/lib/commonjs/system/AudioManager.js +4 -7
  320. package/lib/commonjs/system/AudioManager.js.map +1 -1
  321. package/lib/commonjs/types.js +16 -23
  322. package/lib/commonjs/types.js.map +1 -1
  323. package/lib/commonjs/utils/filePresets.js +43 -0
  324. package/lib/commonjs/utils/filePresets.js.map +1 -0
  325. package/lib/commonjs/utils/index.js +12 -27
  326. package/lib/commonjs/utils/index.js.map +1 -1
  327. package/lib/commonjs/web-core/AudioContext.js +21 -1
  328. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  329. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  330. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  331. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  332. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  333. package/lib/commonjs/web-core/DelayNode.js +17 -0
  334. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  335. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  336. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  337. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  338. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  339. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  340. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  341. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  342. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  343. package/lib/module/AudioAPIModule/index.js +4 -0
  344. package/lib/module/AudioAPIModule/index.js.map +1 -0
  345. package/lib/module/api.js +3 -12
  346. package/lib/module/api.js.map +1 -1
  347. package/lib/module/api.web.js +1 -0
  348. package/lib/module/api.web.js.map +1 -1
  349. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  350. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  351. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  352. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  353. package/lib/module/core/AudioContext.js +5 -8
  354. package/lib/module/core/AudioContext.js.map +1 -1
  355. package/lib/module/core/AudioNode.js +1 -1
  356. package/lib/module/core/AudioNode.js.map +1 -1
  357. package/lib/module/core/AudioParam.js +18 -11
  358. package/lib/module/core/AudioParam.js.map +1 -1
  359. package/lib/module/core/AudioRecorder.js +44 -56
  360. package/lib/module/core/AudioRecorder.js.map +1 -1
  361. package/lib/module/core/BaseAudioContext.js +63 -32
  362. package/lib/module/core/BaseAudioContext.js.map +1 -1
  363. package/lib/module/core/ConvolverNode.js +31 -0
  364. package/lib/module/core/ConvolverNode.js.map +1 -0
  365. package/lib/module/core/DelayNode.js +11 -0
  366. package/lib/module/core/DelayNode.js.map +1 -0
  367. package/lib/module/core/IIRFilterNode.js +13 -0
  368. package/lib/module/core/IIRFilterNode.js.map +1 -0
  369. package/lib/module/core/OfflineAudioContext.js +3 -6
  370. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  371. package/lib/module/plugin/withAudioAPI.js +47 -1
  372. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  373. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  374. package/lib/module/system/AudioManager.js +4 -7
  375. package/lib/module/system/AudioManager.js.map +1 -1
  376. package/lib/module/types.js +15 -22
  377. package/lib/module/types.js.map +1 -1
  378. package/lib/module/utils/filePresets.js +39 -0
  379. package/lib/module/utils/filePresets.js.map +1 -0
  380. package/lib/module/utils/index.js +10 -10
  381. package/lib/module/utils/index.js.map +1 -1
  382. package/lib/module/web-core/AudioContext.js +21 -1
  383. package/lib/module/web-core/AudioContext.js.map +1 -1
  384. package/lib/module/web-core/ConvolverNode.js +34 -0
  385. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  386. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  387. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  388. package/lib/module/web-core/DelayNode.js +11 -0
  389. package/lib/module/web-core/DelayNode.js.map +1 -0
  390. package/lib/module/web-core/IIRFilterNode.js +13 -0
  391. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  392. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  393. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  394. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  395. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  396. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  397. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  398. package/lib/typescript/api.d.ts +3 -9
  399. package/lib/typescript/api.d.ts.map +1 -1
  400. package/lib/typescript/api.web.d.ts +1 -0
  401. package/lib/typescript/api.web.d.ts.map +1 -1
  402. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  403. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  404. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  405. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  406. package/lib/typescript/core/AudioContext.d.ts +1 -1
  407. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  408. package/lib/typescript/core/AudioNode.d.ts +2 -1
  409. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  410. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  411. package/lib/typescript/core/AudioRecorder.d.ts +13 -6
  412. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  413. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  414. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  415. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  416. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  417. package/lib/typescript/core/DelayNode.d.ts +9 -0
  418. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  419. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  420. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  421. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  422. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  423. package/lib/typescript/events/types.d.ts +4 -0
  424. package/lib/typescript/events/types.d.ts.map +1 -1
  425. package/lib/typescript/interfaces.d.ts +34 -34
  426. package/lib/typescript/interfaces.d.ts.map +1 -1
  427. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  428. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  429. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
  430. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  431. package/lib/typescript/system/AudioManager.d.ts +3 -2
  432. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  433. package/lib/typescript/types.d.ts +42 -34
  434. package/lib/typescript/types.d.ts.map +1 -1
  435. package/lib/typescript/utils/filePresets.d.ts +9 -0
  436. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  437. package/lib/typescript/utils/index.d.ts +1 -8
  438. package/lib/typescript/utils/index.d.ts.map +1 -1
  439. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  440. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  441. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  442. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  443. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  444. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  445. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  446. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  447. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  448. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  449. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  450. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  451. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  452. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  453. package/package.json +11 -4
  454. package/scripts/download-prebuilt-binaries.sh +61 -0
  455. package/scripts/rnaa_utils.rb +8 -0
  456. package/scripts/validate-worklets-version.js +27 -0
  457. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  458. package/src/AudioAPIModule/globals.d.ts +33 -0
  459. package/src/AudioAPIModule/index.ts +1 -0
  460. package/src/api.ts +4 -52
  461. package/src/api.web.ts +1 -0
  462. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  463. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  464. package/src/core/AudioContext.ts +5 -8
  465. package/src/core/AudioNode.ts +4 -3
  466. package/src/core/AudioParam.ts +18 -11
  467. package/src/core/AudioRecorder.ts +63 -78
  468. package/src/core/BaseAudioContext.ts +120 -54
  469. package/src/core/ConvolverNode.ts +35 -0
  470. package/src/core/DelayNode.ts +13 -0
  471. package/src/core/IIRFilterNode.ts +25 -0
  472. package/src/core/OfflineAudioContext.ts +4 -7
  473. package/src/events/types.ts +5 -0
  474. package/src/interfaces.ts +51 -34
  475. package/src/plugin/withAudioAPI.ts +61 -0
  476. package/src/specs/NativeAudioAPIModule.ts +3 -2
  477. package/src/system/AudioManager.ts +13 -19
  478. package/src/types.ts +45 -36
  479. package/src/utils/filePresets.ts +47 -0
  480. package/src/utils/index.ts +13 -19
  481. package/src/web-core/AudioContext.tsx +40 -1
  482. package/src/web-core/BaseAudioContext.tsx +11 -1
  483. package/src/web-core/ConvolverNode.tsx +43 -0
  484. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  485. package/src/web-core/DelayNode.tsx +12 -0
  486. package/src/web-core/IIRFilterNode.tsx +25 -0
  487. package/src/web-core/OfflineAudioContext.tsx +39 -0
  488. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  489. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  490. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  491. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  492. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  493. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  494. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  495. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  496. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  497. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  500. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  501. package/lib/commonjs/utils/bitEnums.js +0 -33
  502. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  503. package/lib/module/utils/bitEnums.js +0 -27
  504. package/lib/module/utils/bitEnums.js.map +0 -1
  505. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  506. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  507. package/metro-config/index.d.ts +0 -5
  508. package/metro-config/index.js +0 -41
  509. package/metro-config/tsconfig.json +0 -3
  510. package/src/utils/bitEnums.ts +0 -51
  511. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  512. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  513. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  514. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  515. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  516. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  517. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  518. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  519. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  520. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  521. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  522. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -1,151 +1,133 @@
1
+ #import <AVFAudio/AVFAudio.h>
1
2
  #import <audioapi/ios/system/AudioSessionManager.h>
2
3
 
3
4
  @implementation AudioSessionManager
4
5
 
6
+ static AudioSessionManager *_sharedInstance = nil;
7
+
5
8
  - (instancetype)init
6
9
  {
7
10
  if (self = [super init]) {
8
11
  self.audioSession = [AVAudioSession sharedInstance];
9
12
 
10
- self.sessionCategory = AVAudioSessionCategoryPlayback;
11
- self.sessionMode = AVAudioSessionModeDefault;
12
- self.sessionOptions = 0;
13
- self.allowHapticsAndSystemSoundsDuringRecording = false;
14
- self.hasDirtySettings = true;
15
13
  self.isActive = false;
14
+ self.shouldManageSession = true;
15
+
16
+ self.desiredCategory = AVAudioSessionCategoryPlayback;
17
+ self.desiredMode = AVAudioSessionModeDefault;
18
+ self.desiredOptions = 0;
19
+ self.allowHapticsAndSounds = false;
16
20
  }
17
21
 
22
+ _sharedInstance = self;
18
23
  return self;
19
24
  }
20
25
 
21
- - (void)cleanup
26
+ + (instancetype)sharedInstance
22
27
  {
23
- NSLog(@"[AudioSessionManager] cleanup");
28
+ return _sharedInstance;
29
+ }
24
30
 
31
+ - (void)cleanup
32
+ {
25
33
  self.audioSession = nil;
26
34
  }
27
35
 
28
- - (NSNumber *)getDevicePreferredSampleRate
36
+ - (bool)areDesiredOptionsSet
29
37
  {
30
- return [NSNumber numberWithFloat:[self.audioSession sampleRate]];
38
+ return (
39
+ self.audioSession.category == self.desiredCategory &&
40
+ self.audioSession.mode == self.desiredMode &&
41
+ self.audioSession.categoryOptions == self.desiredOptions &&
42
+ self.audioSession.allowHapticsAndSystemSoundsDuringRecording == self.allowHapticsAndSounds);
31
43
  }
32
44
 
33
- - (void)setAudioSessionOptions:(NSString *)category
34
- mode:(NSString *)mode
35
- options:(NSArray *)options
36
- allowHaptics:(BOOL)allowHaptics
45
+ - (bool)configureAudioSession
37
46
  {
38
- AVAudioSessionCategory sessionCategory = self.sessionCategory;
39
- AVAudioSessionMode sessionMode = self.sessionMode;
40
- AVAudioSessionCategoryOptions sessionOptions = 0;
41
- bool allowHapticsAndSystemSoundsDuringRecording = allowHaptics;
42
-
43
- if ([category isEqualToString:@"record"]) {
44
- sessionCategory = AVAudioSessionCategoryRecord;
45
- } else if ([category isEqualToString:@"ambient"]) {
46
- sessionCategory = AVAudioSessionCategoryAmbient;
47
- } else if ([category isEqualToString:@"playback"]) {
48
- sessionCategory = AVAudioSessionCategoryPlayback;
49
- } else if ([category isEqualToString:@"multiRoute"]) {
50
- sessionCategory = AVAudioSessionCategoryMultiRoute;
51
- } else if ([category isEqualToString:@"soloAmbient"]) {
52
- sessionCategory = AVAudioSessionCategorySoloAmbient;
53
- } else if ([category isEqualToString:@"playAndRecord"]) {
54
- sessionCategory = AVAudioSessionCategoryPlayAndRecord;
55
- }
47
+ NSError *error = nil;
56
48
 
57
- if ([mode isEqualToString:@"default"]) {
58
- sessionMode = AVAudioSessionModeDefault;
59
- } else if ([mode isEqualToString:@"gameChat"]) {
60
- sessionMode = AVAudioSessionModeGameChat;
61
- } else if ([mode isEqualToString:@"videoChat"]) {
62
- sessionMode = AVAudioSessionModeVideoChat;
63
- } else if ([mode isEqualToString:@"voiceChat"]) {
64
- sessionMode = AVAudioSessionModeVoiceChat;
65
- } else if ([mode isEqualToString:@"measurement"]) {
66
- sessionMode = AVAudioSessionModeMeasurement;
67
- } else if ([mode isEqualToString:@"voicePrompt"]) {
68
- sessionMode = AVAudioSessionModeVoicePrompt;
69
- } else if ([mode isEqualToString:@"spokenAudio"]) {
70
- sessionMode = AVAudioSessionModeSpokenAudio;
71
- } else if ([mode isEqualToString:@"moviePlayback"]) {
72
- sessionMode = AVAudioSessionModeMoviePlayback;
73
- } else if ([mode isEqualToString:@"videoRecording"]) {
74
- sessionMode = AVAudioSessionModeVideoRecording;
49
+ if (!self.shouldManageSession || [self areDesiredOptionsSet]) {
50
+ return true;
75
51
  }
76
52
 
77
- for (NSString *option in options) {
78
- if ([option isEqualToString:@"duckOthers"]) {
79
- sessionOptions |= AVAudioSessionCategoryOptionDuckOthers;
80
- }
81
-
82
- if ([option isEqualToString:@"allowAirPlay"]) {
83
- sessionOptions |= AVAudioSessionCategoryOptionAllowAirPlay;
84
- }
85
-
86
- if ([option isEqualToString:@"mixWithOthers"]) {
87
- sessionOptions |= AVAudioSessionCategoryOptionMixWithOthers;
88
- }
89
-
90
- if ([option isEqualToString:@"allowBluetooth"]) {
91
- sessionOptions |= AVAudioSessionCategoryOptionAllowBluetooth;
92
- }
93
-
94
- if ([option isEqualToString:@"defaultToSpeaker"]) {
95
- sessionOptions |= AVAudioSessionCategoryOptionDefaultToSpeaker;
96
- }
53
+ [self.audioSession setCategory:self.desiredCategory
54
+ mode:self.desiredMode
55
+ options:self.desiredOptions
56
+ error:&error];
97
57
 
98
- if ([option isEqualToString:@"allowBluetoothA2DP"]) {
99
- sessionOptions |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;
100
- }
58
+ if (error != nil) {
59
+ NSLog(@"Error while configuring audio session: %@", [error debugDescription]);
60
+ return false;
61
+ } else {
62
+ NSLog(
63
+ @"[AudioSessionManager] Configured audio session: category=%@, mode=%@, options=%lu",
64
+ self.audioSession.category,
65
+ self.audioSession.mode,
66
+ (unsigned long)self.audioSession.categoryOptions);
67
+ }
101
68
 
102
- if ([option isEqualToString:@"overrideMutedMicrophoneInterruption"]) {
103
- sessionOptions |= AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption;
104
- }
69
+ if (self.audioSession.allowHapticsAndSystemSoundsDuringRecording != self.allowHapticsAndSounds) {
70
+ [self.audioSession setAllowHapticsAndSystemSoundsDuringRecording:self.allowHapticsAndSounds
71
+ error:&error];
105
72
 
106
- if ([option isEqualToString:@"interruptSpokenAudioAndMixWithOthers"]) {
107
- sessionOptions |= AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers;
73
+ if (error != nil) {
74
+ NSLog(
75
+ @"Error while setting allowHapticsAndSystemSoundsDuringRecording: %@",
76
+ [error debugDescription]);
77
+ return false;
108
78
  }
109
79
  }
110
80
 
111
- if (self.sessionCategory != sessionCategory) {
112
- self.hasDirtySettings = true;
113
- self.sessionCategory = sessionCategory;
114
- }
115
-
116
- if (self.sessionMode != sessionMode) {
117
- self.hasDirtySettings = true;
118
- self.sessionMode = sessionMode;
119
- }
81
+ return true;
82
+ }
120
83
 
121
- if (self.sessionOptions != sessionOptions) {
122
- self.hasDirtySettings = true;
123
- self.sessionOptions = sessionOptions;
84
+ - (void)setAudioSessionOptions:(NSString *)categoryStr
85
+ mode:(NSString *)modeStr
86
+ options:(NSArray *)optionsArray
87
+ allowHaptics:(BOOL)allowHaptics
88
+ {
89
+ AVAudioSessionCategory category = [self categoryFromString:categoryStr];
90
+ AVAudioSessionMode mode = [self modeFromString:modeStr];
91
+ AVAudioSessionCategoryOptions options = [self optionsFromArray:optionsArray];
92
+ bool configChanged = false;
93
+
94
+ if (category != self.desiredCategory || mode != self.desiredMode ||
95
+ options != self.desiredOptions || allowHaptics != self.allowHapticsAndSounds) {
96
+ configChanged = true;
124
97
  }
125
98
 
126
- if (self.allowHapticsAndSystemSoundsDuringRecording != allowHapticsAndSystemSoundsDuringRecording) {
127
- self.hasDirtySettings = true;
128
- self.allowHapticsAndSystemSoundsDuringRecording = allowHapticsAndSystemSoundsDuringRecording;
129
- }
99
+ self.desiredCategory = category;
100
+ self.desiredMode = mode;
101
+ self.desiredOptions = options;
102
+ self.allowHapticsAndSounds = allowHaptics;
130
103
 
131
- if (self.isActive) {
104
+ if (configChanged && self.isActive) {
132
105
  [self configureAudioSession];
133
106
  }
134
107
  }
135
108
 
136
109
  - (bool)setActive:(bool)active
137
110
  {
138
- if (active == self.isActive) {
111
+ if (!self.shouldManageSession) {
139
112
  return true;
140
113
  }
141
114
 
142
- if (active) {
143
- [self configureAudioSession];
115
+ NSError *error = nil;
116
+ bool success = false;
117
+
118
+ if (self.isActive == active) {
119
+ return true;
144
120
  }
145
121
 
146
- NSError *error = nil;
122
+ if (active) {
123
+ success = [self configureAudioSession];
124
+
125
+ if (!success) {
126
+ return false;
127
+ }
128
+ }
147
129
 
148
- bool success = [self.audioSession setActive:active error:&error];
130
+ success = [self.audioSession setActive:active error:&error];
149
131
 
150
132
  if (success) {
151
133
  self.isActive = active;
@@ -160,119 +142,108 @@
160
142
  return success;
161
143
  }
162
144
 
163
- - (bool)configureAudioSession
145
+ - (void)markInactive
164
146
  {
165
- if (![self hasDirtySettings]) {
166
- return true;
167
- }
168
-
169
- NSLog(
170
- @"[AudioSessionManager] configureAudioSession, category: %@, mode: %@, options: %lu, allowHaptics: %@",
171
- self.sessionCategory,
172
- self.sessionMode,
173
- (unsigned long)self.sessionOptions,
174
- self.allowHapticsAndSystemSoundsDuringRecording ? @"YES" : @"NO");
175
-
176
- NSError *error = nil;
177
-
178
- [self.audioSession setCategory:self.sessionCategory mode:self.sessionMode options:self.sessionOptions error:&error];
179
-
180
- if (error != nil) {
181
- NSLog(@"Error while configuring audio session: %@", [error debugDescription]);
182
- return false;
183
- }
184
-
185
- if (@available(iOS 13.0, *)) {
186
- [self.audioSession setAllowHapticsAndSystemSoundsDuringRecording:self.allowHapticsAndSystemSoundsDuringRecording
187
- error:&error];
147
+ // Mark as inactive no matter the state reported by AVAudioSession,
148
+ // this is used during interruptions to "force" going through configure&activate flow
149
+ // which is necessary after some of the interruptions (f.e. when the other app re-configures the hardware)
150
+ self.isActive = false;
151
+ }
188
152
 
189
- if (error != nil) {
190
- NSLog(@"Error while setting allowHapticsAndSystemSoundsDuringRecording: %@", [error debugDescription]);
191
- }
192
- }
153
+ - (void)disableSessionManagement
154
+ {
155
+ self.shouldManageSession = false;
156
+ }
193
157
 
194
- self.hasDirtySettings = false;
195
- return true;
158
+ - (NSNumber *)getDevicePreferredSampleRate
159
+ {
160
+ return [NSNumber numberWithFloat:[self.audioSession sampleRate]];
196
161
  }
197
162
 
198
- - (bool)reconfigureAudioSession
163
+ - (NSNumber *)getDevicePreferredInputChannelCount
199
164
  {
200
- self.hasDirtySettings = true;
201
- if (self.isActive) {
202
- self.isActive = false;
203
- return [self setActive:true];
204
- }
205
- return true;
165
+ return [NSNumber numberWithInteger:[self.audioSession inputNumberOfChannels]];
206
166
  }
207
167
 
208
- - (void)markSettingsAsDirty
168
+ - (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve
169
+ reject:(RCTPromiseRejectBlock)reject
209
170
  {
210
- self.hasDirtySettings = true;
211
- self.isActive = false;
171
+ id value = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
172
+ // if there is no entry NSMicrophoneUsageDescription calling
173
+ // requestRecordPermission will quit an app
174
+ if (value == nil) {
175
+ reject(
176
+ nil,
177
+ @"There is no NSMicrophoneUsageDescription entry in info.plist file. App cannot access microphone without it.",
178
+ nil);
179
+ return;
180
+ }
181
+
182
+ resolve([self requestRecordingPermissions]);
212
183
  }
213
184
 
214
- - (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
185
+ - (NSString *)requestRecordingPermissions
215
186
  {
216
- if (@available(iOS 17, *)) {
217
- [AVAudioSession.sharedInstance requestRecordPermission:^(BOOL granted) {
218
- if (granted) {
219
- resolve(@"Granted");
220
- } else {
221
- resolve(@"Denied");
222
- }
187
+ id value = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSMicrophoneUsageDescription"];
188
+
189
+ if (value == nil) {
190
+ return @"Denied";
191
+ }
192
+
193
+ __block NSString *result = @"Denied";
194
+ dispatch_semaphore_t sem = dispatch_semaphore_create(0);
195
+
196
+ #if TARGET_OS_SIMULATOR
197
+ [self.audioSession requestRecordPermission:^(BOOL granted) {
198
+ result = granted ? @"Granted" : @"Denied";
199
+ dispatch_semaphore_signal(sem);
200
+ }];
201
+
202
+ dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
203
+ return result;
204
+ #else
205
+ if (@available(iOS 17.0, *)) {
206
+ [AVAudioApplication requestRecordPermissionWithCompletionHandler:^(BOOL granted) {
207
+ result = granted ? @"Granted" : @"Denied";
208
+ dispatch_semaphore_signal(sem);
223
209
  }];
224
210
  } else {
225
211
  [self.audioSession requestRecordPermission:^(BOOL granted) {
226
- if (granted) {
227
- resolve(@"Granted");
228
- } else {
229
- resolve(@"Denied");
230
- }
212
+ result = granted ? @"Granted" : @"Denied";
213
+ dispatch_semaphore_signal(sem);
231
214
  }];
232
215
  }
216
+
217
+ dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
218
+ return result;
219
+ #endif
233
220
  }
234
221
 
235
- - (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
222
+ - (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve
223
+ reject:(RCTPromiseRejectBlock)reject
236
224
  {
237
- if (@available(iOS 17, *)) {
238
- NSInteger res = [[AVAudioApplication sharedInstance] recordPermission];
239
- switch (res) {
240
- case AVAudioApplicationRecordPermissionUndetermined:
241
- resolve(@"Undetermined");
242
- break;
243
- case AVAudioApplicationRecordPermissionGranted:
244
- resolve(@"Granted");
245
- break;
246
- case AVAudioApplicationRecordPermissionDenied:
247
- resolve(@"Denied");
248
- break;
249
- default:
250
- resolve(@"Undetermined");
251
- break;
252
- }
253
- } else {
254
- NSInteger res = [self.audioSession recordPermission];
255
- switch (res) {
256
- case AVAudioSessionRecordPermissionUndetermined:
257
- resolve(@"Undetermined");
258
- break;
259
- case AVAudioSessionRecordPermissionGranted:
260
- resolve(@"Granted");
261
- break;
262
- case AVAudioSessionRecordPermissionDenied:
263
- resolve(@"Denied");
264
- break;
265
- default:
266
- resolve(@"Undetermined");
267
- break;
268
- }
269
- }
225
+ resolve([self checkRecordingPermissions]);
270
226
  }
271
227
 
272
228
  - (NSString *)checkRecordingPermissions
273
229
  {
230
+ #if TARGET_OS_SIMULATOR
231
+ NSInteger res = [self.audioSession recordPermission];
232
+
233
+ switch (res) {
234
+ case AVAudioSessionRecordPermissionUndetermined:
235
+ return @"Undetermined";
236
+ case AVAudioSessionRecordPermissionGranted:
237
+ return @"Granted";
238
+ case AVAudioSessionRecordPermissionDenied:
239
+ return @"Denied";
240
+ default:
241
+ return @"Undetermined";
242
+ }
243
+ #else
274
244
  if (@available(iOS 17, *)) {
275
245
  NSInteger res = [[AVAudioApplication sharedInstance] recordPermission];
246
+
276
247
  switch (res) {
277
248
  case AVAudioApplicationRecordPermissionUndetermined:
278
249
  return @"Undetermined";
@@ -283,29 +254,35 @@
283
254
  default:
284
255
  return @"Undetermined";
285
256
  }
286
- } else {
287
- NSInteger res = [self.audioSession recordPermission];
288
- switch (res) {
289
- case AVAudioSessionRecordPermissionUndetermined:
290
- return @"Undetermined";
291
- case AVAudioSessionRecordPermissionGranted:
292
- return @"Granted";
293
- case AVAudioSessionRecordPermissionDenied:
294
- return @"Denied";
295
- default:
296
- return @"Undetermined";
297
- }
298
257
  }
258
+
259
+ NSInteger res = [self.audioSession recordPermission];
260
+
261
+ switch (res) {
262
+ case AVAudioSessionRecordPermissionUndetermined:
263
+ return @"Undetermined";
264
+ case AVAudioSessionRecordPermissionGranted:
265
+ return @"Granted";
266
+ case AVAudioSessionRecordPermissionDenied:
267
+ return @"Denied";
268
+ default:
269
+ return @"Undetermined";
270
+ }
271
+ #endif
299
272
  }
300
273
 
301
274
  - (void)getDevicesInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
302
275
  {
303
276
  NSMutableDictionary *devicesInfo = [[NSMutableDictionary alloc] init];
304
277
 
305
- [devicesInfo setValue:[self parseDeviceList:[self.audioSession availableInputs]] forKey:@"availableInputs"];
306
- [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] inputs]] forKey:@"currentInputs"];
307
- [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]] forKey:@"availableOutputs"];
308
- [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]] forKey:@"currentOutputs"];
278
+ [devicesInfo setValue:[self parseDeviceList:[self.audioSession availableInputs]]
279
+ forKey:@"availableInputs"];
280
+ [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] inputs]]
281
+ forKey:@"currentInputs"];
282
+ [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]]
283
+ forKey:@"availableOutputs"];
284
+ [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]]
285
+ forKey:@"currentOutputs"];
309
286
 
310
287
  resolve(devicesInfo);
311
288
  }
@@ -324,4 +301,98 @@
324
301
  return deviceList;
325
302
  }
326
303
 
304
+ - (AVAudioSessionCategory)categoryFromString:(NSString *)categorySTR
305
+ {
306
+ AVAudioSessionCategory category = 0;
307
+
308
+ if ([categorySTR isEqualToString:@"record"]) {
309
+ category = AVAudioSessionCategoryRecord;
310
+ } else if ([categorySTR isEqualToString:@"ambient"]) {
311
+ category = AVAudioSessionCategoryAmbient;
312
+ } else if ([categorySTR isEqualToString:@"playback"]) {
313
+ category = AVAudioSessionCategoryPlayback;
314
+ } else if ([categorySTR isEqualToString:@"multiRoute"]) {
315
+ category = AVAudioSessionCategoryMultiRoute;
316
+ } else if ([categorySTR isEqualToString:@"soloAmbient"]) {
317
+ category = AVAudioSessionCategorySoloAmbient;
318
+ } else if ([categorySTR isEqualToString:@"playAndRecord"]) {
319
+ category = AVAudioSessionCategoryPlayAndRecord;
320
+ }
321
+
322
+ return category;
323
+ }
324
+
325
+ - (AVAudioSessionMode)modeFromString:(NSString *)modeSTR
326
+ {
327
+ AVAudioSessionMode mode = 0;
328
+
329
+ if ([modeSTR isEqualToString:@"default"]) {
330
+ mode = AVAudioSessionModeDefault;
331
+ } else if ([modeSTR isEqualToString:@"gameChat"]) {
332
+ mode = AVAudioSessionModeGameChat;
333
+ } else if ([modeSTR isEqualToString:@"videoChat"]) {
334
+ mode = AVAudioSessionModeVideoChat;
335
+ } else if ([modeSTR isEqualToString:@"voiceChat"]) {
336
+ mode = AVAudioSessionModeVoiceChat;
337
+ } else if ([modeSTR isEqualToString:@"measurement"]) {
338
+ mode = AVAudioSessionModeMeasurement;
339
+ } else if ([modeSTR isEqualToString:@"voicePrompt"]) {
340
+ mode = AVAudioSessionModeVoicePrompt;
341
+ } else if ([modeSTR isEqualToString:@"spokenAudio"]) {
342
+ mode = AVAudioSessionModeSpokenAudio;
343
+ } else if ([modeSTR isEqualToString:@"moviePlayback"]) {
344
+ mode = AVAudioSessionModeMoviePlayback;
345
+ } else if ([modeSTR isEqualToString:@"videoRecording"]) {
346
+ mode = AVAudioSessionModeVideoRecording;
347
+ }
348
+
349
+ return mode;
350
+ }
351
+
352
+ - (AVAudioSessionCategoryOptions)optionsFromArray:(NSArray *)optionsArray
353
+ {
354
+ AVAudioSessionCategoryOptions options = 0;
355
+
356
+ for (NSString *option in optionsArray) {
357
+ if ([option isEqualToString:@"duckOthers"]) {
358
+ options |= AVAudioSessionCategoryOptionDuckOthers;
359
+ }
360
+
361
+ if ([option isEqualToString:@"allowAirPlay"]) {
362
+ options |= AVAudioSessionCategoryOptionAllowAirPlay;
363
+ }
364
+
365
+ if ([option isEqualToString:@"mixWithOthers"]) {
366
+ options |= AVAudioSessionCategoryOptionMixWithOthers;
367
+ }
368
+
369
+ if ([option isEqualToString:@"allowBluetooth"]) {
370
+ options |= AVAudioSessionCategoryOptionAllowBluetooth;
371
+ }
372
+
373
+ if ([option isEqualToString:@"defaultToSpeaker"]) {
374
+ options |= AVAudioSessionCategoryOptionDefaultToSpeaker;
375
+ }
376
+
377
+ if ([option isEqualToString:@"allowBluetoothA2DP"]) {
378
+ options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;
379
+ }
380
+
381
+ if ([option isEqualToString:@"overrideMutedMicrophoneInterruption"]) {
382
+ options |= AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption;
383
+ }
384
+
385
+ if ([option isEqualToString:@"interruptSpokenAudioAndMixWithOthers"]) {
386
+ options |= AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers;
387
+ }
388
+ }
389
+
390
+ return options;
391
+ }
392
+
393
+ - (bool)isSessionActive
394
+ {
395
+ return self.isActive;
396
+ }
397
+
327
398
  @end