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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (623) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +353 -74
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +32 -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 +46 -58
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +366 -304
  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 +56 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +114 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +154 -95
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +10 -16
  24. package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +2 -1
  25. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +189 -14
  26. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioPlayer.kt +10 -8
  27. package/android/src/main/java/com/swmansion/audioapi/core/NativeAudioRecorder.kt +10 -8
  28. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +5 -2
  29. package/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt +128 -0
  30. package/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt +116 -0
  31. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt +115 -107
  32. package/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt +2 -1
  33. package/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt +47 -0
  34. package/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt +191 -0
  35. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt +669 -0
  36. package/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt +33 -0
  37. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt +303 -0
  38. package/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt +45 -0
  39. package/android/src/main/java/com/swmansion/audioapi/system/notification/SimpleNotification.kt +119 -0
  40. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  42. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  43. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  44. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  45. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  46. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  47. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  48. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  49. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  50. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  51. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  52. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  53. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  54. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  55. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  56. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +100 -76
  57. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  58. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  59. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  60. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  61. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  62. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  63. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  64. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  65. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  66. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  68. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  69. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  70. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  71. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  72. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  73. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  74. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  75. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  76. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  77. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  78. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  79. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  80. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  81. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  82. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  83. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  84. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +109 -44
  85. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +8 -2
  86. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  87. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  88. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  89. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  90. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  91. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  92. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  93. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  94. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  95. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  96. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  97. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  98. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  99. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  100. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  101. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  102. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  103. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  104. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  105. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  106. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  107. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  108. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  109. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  110. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  111. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  112. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  113. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  114. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  115. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  116. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  117. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  118. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  119. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +96 -74
  120. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +44 -15
  121. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  122. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  123. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  124. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  125. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  126. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  127. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  128. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  129. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  130. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  131. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  132. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  133. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  134. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  135. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  136. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  137. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +39 -108
  138. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +47 -46
  139. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  140. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  141. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  142. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  143. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  144. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  145. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  146. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  147. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  148. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  149. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  150. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  151. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  152. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  153. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  154. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  155. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +105 -87
  156. package/common/cpp/audioapi/core/sources/StreamerNode.h +67 -33
  157. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  158. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  159. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  160. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  161. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  162. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +44 -0
  163. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  164. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  165. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  166. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  167. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  168. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  169. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  170. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +52 -0
  171. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  172. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  173. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  174. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  175. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  176. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  177. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  178. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  179. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  180. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  181. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  182. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  183. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  184. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  185. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  186. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  187. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  188. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  189. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  190. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  217. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  218. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  219. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  220. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  221. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  222. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  223. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  224. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  225. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  226. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  227. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  228. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  229. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  230. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  231. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  232. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  233. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  234. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  235. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  236. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  237. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  238. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  239. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  240. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  241. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  242. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  243. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  244. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  245. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  246. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  247. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  248. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +53 -0
  249. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  250. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  251. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  252. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  253. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  254. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  255. package/common/cpp/audioapi/utils/Benchmark.hpp +50 -47
  256. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  257. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  258. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  259. package/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp +12 -9
  260. package/common/cpp/audioapi/utils/MoveOnlyFunction.hpp +17 -15
  261. package/common/cpp/audioapi/utils/Result.hpp +323 -0
  262. package/common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp +22 -28
  263. package/common/cpp/audioapi/utils/SpscChannel.hpp +329 -305
  264. package/common/cpp/audioapi/utils/ThreadPool.hpp +104 -20
  265. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  266. package/common/cpp/test/CMakeLists.txt +15 -15
  267. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  268. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  269. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  270. package/common/cpp/test/src/DelayTest.cpp +108 -0
  271. package/common/cpp/test/src/GainTest.cpp +4 -5
  272. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  273. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  274. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  275. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  276. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  277. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  278. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  279. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  280. package/ios/audioapi/ios/AudioAPIModule.h +4 -3
  281. package/ios/audioapi/ios/AudioAPIModule.mm +148 -34
  282. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  283. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  284. package/ios/audioapi/ios/core/IOSAudioRecorder.h +28 -11
  285. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +280 -45
  286. package/ios/audioapi/ios/core/NativeAudioPlayer.m +17 -14
  287. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -3
  288. package/ios/audioapi/ios/core/NativeAudioRecorder.m +74 -6
  289. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +22 -4
  290. package/ios/audioapi/ios/core/utils/FileOptions.h +33 -0
  291. package/ios/audioapi/ios/core/utils/FileOptions.mm +195 -0
  292. package/ios/audioapi/ios/core/utils/IOSFileWriter.h +53 -0
  293. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +239 -0
  294. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.h +47 -0
  295. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +185 -0
  296. package/ios/audioapi/ios/system/AudioEngine.h +21 -16
  297. package/ios/audioapi/ios/system/AudioEngine.mm +153 -132
  298. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  299. package/ios/audioapi/ios/system/AudioSessionManager.mm +277 -203
  300. package/ios/audioapi/ios/system/NotificationManager.mm +47 -53
  301. package/ios/audioapi/ios/system/notification/BaseNotification.h +58 -0
  302. package/ios/audioapi/ios/system/notification/NotificationRegistry.h +70 -0
  303. package/ios/audioapi/ios/system/notification/NotificationRegistry.mm +172 -0
  304. package/ios/audioapi/ios/system/notification/PlaybackNotification.h +27 -0
  305. package/ios/audioapi/ios/system/notification/PlaybackNotification.mm +427 -0
  306. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  307. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  308. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  309. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  310. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  311. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  312. package/lib/commonjs/api.js +89 -12
  313. package/lib/commonjs/api.js.map +1 -1
  314. package/lib/commonjs/api.web.js +35 -14
  315. package/lib/commonjs/api.web.js.map +1 -1
  316. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  317. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  318. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  319. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  320. package/lib/commonjs/core/AudioContext.js +5 -8
  321. package/lib/commonjs/core/AudioContext.js.map +1 -1
  322. package/lib/commonjs/core/AudioNode.js +1 -1
  323. package/lib/commonjs/core/AudioNode.js.map +1 -1
  324. package/lib/commonjs/core/AudioParam.js +18 -11
  325. package/lib/commonjs/core/AudioParam.js.map +1 -1
  326. package/lib/commonjs/core/AudioRecorder.js +56 -55
  327. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  328. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  329. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  330. package/lib/commonjs/core/ConvolverNode.js +37 -0
  331. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  332. package/lib/commonjs/core/DelayNode.js +17 -0
  333. package/lib/commonjs/core/DelayNode.js.map +1 -0
  334. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  335. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  336. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  337. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  338. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  339. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  340. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  341. package/lib/commonjs/system/AudioManager.js +9 -15
  342. package/lib/commonjs/system/AudioManager.js.map +1 -1
  343. package/lib/commonjs/system/index.js +13 -0
  344. package/lib/commonjs/system/index.js.map +1 -1
  345. package/lib/commonjs/system/notification/PlaybackNotificationManager.js +138 -0
  346. package/lib/commonjs/system/notification/PlaybackNotificationManager.js.map +1 -0
  347. package/lib/commonjs/system/notification/RecordingNotificationManager.js +185 -0
  348. package/lib/commonjs/system/notification/RecordingNotificationManager.js.map +1 -0
  349. package/lib/commonjs/system/notification/SimpleNotificationManager.js +125 -0
  350. package/lib/commonjs/system/notification/SimpleNotificationManager.js.map +1 -0
  351. package/lib/commonjs/system/notification/index.js +45 -0
  352. package/lib/commonjs/system/notification/index.js.map +1 -0
  353. package/lib/commonjs/system/notification/types.js +6 -0
  354. package/lib/commonjs/system/notification/types.js.map +1 -0
  355. package/lib/commonjs/types.js +28 -35
  356. package/lib/commonjs/types.js.map +1 -1
  357. package/lib/commonjs/utils/filePresets.js +43 -0
  358. package/lib/commonjs/utils/filePresets.js.map +1 -0
  359. package/lib/commonjs/utils/index.js +12 -27
  360. package/lib/commonjs/utils/index.js.map +1 -1
  361. package/lib/commonjs/web-core/AudioContext.js +21 -1
  362. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  363. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  364. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  365. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  366. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  367. package/lib/commonjs/web-core/DelayNode.js +17 -0
  368. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  369. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  370. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  371. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  372. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  373. package/lib/commonjs/web-system/index.js +17 -0
  374. package/lib/commonjs/web-system/index.js.map +1 -0
  375. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js +37 -0
  376. package/lib/commonjs/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  377. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js +37 -0
  378. package/lib/commonjs/web-system/notification/RecordingNotificationManager.js.map +1 -0
  379. package/lib/commonjs/web-system/notification/index.js +21 -0
  380. package/lib/commonjs/web-system/notification/index.js.map +1 -0
  381. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  382. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  383. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  384. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  385. package/lib/module/AudioAPIModule/index.js +4 -0
  386. package/lib/module/AudioAPIModule/index.js.map +1 -0
  387. package/lib/module/api.js +7 -12
  388. package/lib/module/api.js.map +1 -1
  389. package/lib/module/api.web.js +4 -1
  390. package/lib/module/api.web.js.map +1 -1
  391. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  392. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  393. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  394. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  395. package/lib/module/core/AudioContext.js +5 -8
  396. package/lib/module/core/AudioContext.js.map +1 -1
  397. package/lib/module/core/AudioNode.js +1 -1
  398. package/lib/module/core/AudioNode.js.map +1 -1
  399. package/lib/module/core/AudioParam.js +18 -11
  400. package/lib/module/core/AudioParam.js.map +1 -1
  401. package/lib/module/core/AudioRecorder.js +57 -56
  402. package/lib/module/core/AudioRecorder.js.map +1 -1
  403. package/lib/module/core/BaseAudioContext.js +63 -32
  404. package/lib/module/core/BaseAudioContext.js.map +1 -1
  405. package/lib/module/core/ConvolverNode.js +31 -0
  406. package/lib/module/core/ConvolverNode.js.map +1 -0
  407. package/lib/module/core/DelayNode.js +11 -0
  408. package/lib/module/core/DelayNode.js.map +1 -0
  409. package/lib/module/core/IIRFilterNode.js +13 -0
  410. package/lib/module/core/IIRFilterNode.js.map +1 -0
  411. package/lib/module/core/OfflineAudioContext.js +3 -6
  412. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  413. package/lib/module/plugin/withAudioAPI.js +47 -1
  414. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  415. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  416. package/lib/module/system/AudioManager.js +9 -15
  417. package/lib/module/system/AudioManager.js.map +1 -1
  418. package/lib/module/system/index.js +1 -0
  419. package/lib/module/system/index.js.map +1 -1
  420. package/lib/module/system/notification/PlaybackNotificationManager.js +134 -0
  421. package/lib/module/system/notification/PlaybackNotificationManager.js.map +1 -0
  422. package/lib/module/system/notification/RecordingNotificationManager.js +181 -0
  423. package/lib/module/system/notification/RecordingNotificationManager.js.map +1 -0
  424. package/lib/module/system/notification/SimpleNotificationManager.js +121 -0
  425. package/lib/module/system/notification/SimpleNotificationManager.js.map +1 -0
  426. package/lib/module/system/notification/index.js +7 -0
  427. package/lib/module/system/notification/index.js.map +1 -0
  428. package/lib/module/system/notification/types.js +4 -0
  429. package/lib/module/system/notification/types.js.map +1 -0
  430. package/lib/module/types.js +27 -34
  431. package/lib/module/types.js.map +1 -1
  432. package/lib/module/utils/filePresets.js +39 -0
  433. package/lib/module/utils/filePresets.js.map +1 -0
  434. package/lib/module/utils/index.js +10 -10
  435. package/lib/module/utils/index.js.map +1 -1
  436. package/lib/module/web-core/AudioContext.js +21 -1
  437. package/lib/module/web-core/AudioContext.js.map +1 -1
  438. package/lib/module/web-core/ConvolverNode.js +34 -0
  439. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  440. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  441. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  442. package/lib/module/web-core/DelayNode.js +11 -0
  443. package/lib/module/web-core/DelayNode.js.map +1 -0
  444. package/lib/module/web-core/IIRFilterNode.js +13 -0
  445. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  446. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  447. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  448. package/lib/module/web-system/index.js +4 -0
  449. package/lib/module/web-system/index.js.map +1 -0
  450. package/lib/module/web-system/notification/PlaybackNotificationManager.js +33 -0
  451. package/lib/module/web-system/notification/PlaybackNotificationManager.js.map +1 -0
  452. package/lib/module/web-system/notification/RecordingNotificationManager.js +33 -0
  453. package/lib/module/web-system/notification/RecordingNotificationManager.js.map +1 -0
  454. package/lib/module/web-system/notification/index.js +5 -0
  455. package/lib/module/web-system/notification/index.js.map +1 -0
  456. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  457. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  458. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  459. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  460. package/lib/typescript/api.d.ts +5 -9
  461. package/lib/typescript/api.d.ts.map +1 -1
  462. package/lib/typescript/api.web.d.ts +4 -1
  463. package/lib/typescript/api.web.d.ts.map +1 -1
  464. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  465. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  466. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  467. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  468. package/lib/typescript/core/AudioContext.d.ts +1 -1
  469. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  470. package/lib/typescript/core/AudioNode.d.ts +2 -1
  471. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  472. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  473. package/lib/typescript/core/AudioRecorder.d.ts +16 -6
  474. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  475. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  476. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  477. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  478. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  479. package/lib/typescript/core/DelayNode.d.ts +9 -0
  480. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  481. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  482. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  483. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  484. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  485. package/lib/typescript/events/types.d.ts +6 -2
  486. package/lib/typescript/events/types.d.ts.map +1 -1
  487. package/lib/typescript/interfaces.d.ts +36 -34
  488. package/lib/typescript/interfaces.d.ts.map +1 -1
  489. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  490. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  491. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +18 -6
  492. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  493. package/lib/typescript/system/AudioManager.d.ts +5 -5
  494. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  495. package/lib/typescript/system/index.d.ts +1 -0
  496. package/lib/typescript/system/index.d.ts.map +1 -1
  497. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts +23 -0
  498. package/lib/typescript/system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  499. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts +24 -0
  500. package/lib/typescript/system/notification/RecordingNotificationManager.d.ts.map +1 -0
  501. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts +21 -0
  502. package/lib/typescript/system/notification/SimpleNotificationManager.d.ts.map +1 -0
  503. package/lib/typescript/system/notification/index.d.ts +5 -0
  504. package/lib/typescript/system/notification/index.d.ts.map +1 -0
  505. package/lib/typescript/system/notification/types.d.ts +65 -0
  506. package/lib/typescript/system/notification/types.d.ts.map +1 -0
  507. package/lib/typescript/system/types.d.ts +0 -16
  508. package/lib/typescript/system/types.d.ts.map +1 -1
  509. package/lib/typescript/types.d.ts +58 -45
  510. package/lib/typescript/types.d.ts.map +1 -1
  511. package/lib/typescript/utils/filePresets.d.ts +9 -0
  512. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  513. package/lib/typescript/utils/index.d.ts +1 -8
  514. package/lib/typescript/utils/index.d.ts.map +1 -1
  515. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  516. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  517. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  518. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  519. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  520. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  521. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  522. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  523. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  524. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  525. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  526. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  527. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  528. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  529. package/lib/typescript/web-system/index.d.ts +2 -0
  530. package/lib/typescript/web-system/index.d.ts.map +1 -0
  531. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts +20 -0
  532. package/lib/typescript/web-system/notification/PlaybackNotificationManager.d.ts.map +1 -0
  533. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts +20 -0
  534. package/lib/typescript/web-system/notification/RecordingNotificationManager.d.ts.map +1 -0
  535. package/lib/typescript/web-system/notification/index.d.ts +3 -0
  536. package/lib/typescript/web-system/notification/index.d.ts.map +1 -0
  537. package/package.json +11 -5
  538. package/scripts/download-prebuilt-binaries.sh +61 -0
  539. package/scripts/rnaa_utils.rb +8 -0
  540. package/scripts/validate-worklets-version.js +27 -0
  541. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  542. package/src/AudioAPIModule/globals.d.ts +33 -0
  543. package/src/AudioAPIModule/index.ts +1 -0
  544. package/src/api.ts +21 -52
  545. package/src/api.web.ts +8 -2
  546. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  547. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  548. package/src/core/AudioContext.ts +5 -8
  549. package/src/core/AudioNode.ts +4 -3
  550. package/src/core/AudioParam.ts +18 -11
  551. package/src/core/AudioRecorder.ts +86 -84
  552. package/src/core/BaseAudioContext.ts +120 -54
  553. package/src/core/ConvolverNode.ts +35 -0
  554. package/src/core/DelayNode.ts +13 -0
  555. package/src/core/IIRFilterNode.ts +25 -0
  556. package/src/core/OfflineAudioContext.ts +4 -7
  557. package/src/events/types.ts +7 -3
  558. package/src/interfaces.ts +55 -34
  559. package/src/plugin/withAudioAPI.ts +61 -0
  560. package/src/specs/NativeAudioAPIModule.ts +26 -9
  561. package/src/system/AudioManager.ts +13 -32
  562. package/src/system/index.ts +1 -0
  563. package/src/system/notification/PlaybackNotificationManager.ts +197 -0
  564. package/src/system/notification/RecordingNotificationManager.ts +247 -0
  565. package/src/system/notification/SimpleNotificationManager.ts +175 -0
  566. package/src/system/notification/index.ts +4 -0
  567. package/src/system/notification/types.ts +111 -0
  568. package/src/system/types.ts +0 -18
  569. package/src/types.ts +61 -46
  570. package/src/utils/filePresets.ts +47 -0
  571. package/src/utils/index.ts +13 -19
  572. package/src/web-core/AudioContext.tsx +40 -1
  573. package/src/web-core/BaseAudioContext.tsx +11 -1
  574. package/src/web-core/ConvolverNode.tsx +43 -0
  575. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  576. package/src/web-core/DelayNode.tsx +12 -0
  577. package/src/web-core/IIRFilterNode.tsx +25 -0
  578. package/src/web-core/OfflineAudioContext.tsx +39 -0
  579. package/src/web-system/index.ts +1 -0
  580. package/src/web-system/notification/PlaybackNotificationManager.ts +64 -0
  581. package/src/web-system/notification/RecordingNotificationManager.ts +64 -0
  582. package/src/web-system/notification/index.ts +2 -0
  583. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  584. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  585. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  586. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  587. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  588. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  589. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +0 -325
  590. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +0 -262
  591. package/android/src/main/java/com/swmansion/audioapi/system/MediaReceiver.kt +0 -57
  592. package/android/src/main/java/com/swmansion/audioapi/system/MediaSessionCallback.kt +0 -61
  593. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  594. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  595. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  596. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
  597. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  598. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  599. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  600. package/ios/audioapi/ios/system/LockScreenManager.h +0 -24
  601. package/ios/audioapi/ios/system/LockScreenManager.mm +0 -310
  602. package/lib/commonjs/utils/bitEnums.js +0 -33
  603. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  604. package/lib/module/utils/bitEnums.js +0 -27
  605. package/lib/module/utils/bitEnums.js.map +0 -1
  606. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  607. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  608. package/metro-config/index.d.ts +0 -5
  609. package/metro-config/index.js +0 -41
  610. package/metro-config/tsconfig.json +0 -3
  611. package/src/utils/bitEnums.ts +0 -51
  612. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  613. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  614. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  615. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  616. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  617. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  618. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  619. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  620. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  621. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  622. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  623. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -1,24 +1,26 @@
1
1
  package com.swmansion.audioapi.core
2
2
 
3
3
  import com.facebook.common.internal.DoNotStrip
4
- import com.swmansion.audioapi.system.MediaSessionManager
4
+ import com.swmansion.audioapi.system.ForegroundServiceManager
5
+ import java.util.UUID
5
6
 
6
7
  @DoNotStrip
7
8
  class NativeAudioPlayer {
8
- private var sourceNodeId: String? = null
9
+ private var playerId: String? = null
9
10
 
10
11
  @DoNotStrip
11
12
  fun start() {
12
- this.sourceNodeId = MediaSessionManager.attachAudioPlayer(this)
13
- MediaSessionManager.startForegroundServiceIfNecessary()
13
+ if (playerId == null) {
14
+ playerId = UUID.randomUUID().toString()
15
+ ForegroundServiceManager.subscribe("player_$playerId")
16
+ }
14
17
  }
15
18
 
16
19
  @DoNotStrip
17
20
  fun stop() {
18
- this.sourceNodeId?.let {
19
- MediaSessionManager.detachAudioPlayer(it)
20
- this.sourceNodeId = null
21
+ playerId?.let {
22
+ ForegroundServiceManager.unsubscribe("player_$it")
23
+ playerId = null
21
24
  }
22
- MediaSessionManager.stopForegroundServiceIfNecessary()
23
25
  }
24
26
  }
@@ -1,24 +1,26 @@
1
1
  package com.swmansion.audioapi.core
2
2
 
3
3
  import com.facebook.common.internal.DoNotStrip
4
- import com.swmansion.audioapi.system.MediaSessionManager
4
+ import com.swmansion.audioapi.system.ForegroundServiceManager
5
+ import java.util.UUID
5
6
 
6
7
  @DoNotStrip
7
8
  class NativeAudioRecorder {
8
- private var inputNodeId: String? = null
9
+ private var recorderId: String? = null
9
10
 
10
11
  @DoNotStrip
11
12
  fun start() {
12
- this.inputNodeId = MediaSessionManager.attachAudioRecorder(this)
13
- MediaSessionManager.startForegroundServiceIfNecessary()
13
+ if (recorderId == null) {
14
+ recorderId = UUID.randomUUID().toString()
15
+ ForegroundServiceManager.subscribe("recorder_$recorderId")
16
+ }
14
17
  }
15
18
 
16
19
  @DoNotStrip
17
20
  fun stop() {
18
- this.inputNodeId?.let {
19
- MediaSessionManager.detachAudioRecorder(it)
20
- this.inputNodeId = null
21
+ recorderId?.let {
22
+ ForegroundServiceManager.unsubscribe("recorder_$it")
23
+ recorderId = null
21
24
  }
22
- MediaSessionManager.stopForegroundServiceIfNecessary()
23
25
  }
24
26
  }
@@ -11,9 +11,9 @@ import java.util.HashMap
11
11
  class AudioFocusListener(
12
12
  private val audioManager: WeakReference<AudioManager>,
13
13
  private val audioAPIModule: WeakReference<AudioAPIModule>,
14
- private val lockScreenManager: WeakReference<LockScreenManager>,
15
14
  ) : AudioManager.OnAudioFocusChangeListener {
16
15
  private var focusRequest: AudioFocusRequest? = null
16
+ private var isTransientLoss: Boolean = false
17
17
 
18
18
  override fun onAudioFocusChange(focusChange: Int) {
19
19
  Log.d("AudioFocusListener", "onAudioFocusChange: $focusChange")
@@ -23,6 +23,7 @@ class AudioFocusListener(
23
23
  HashMap<String, Any>().apply {
24
24
  put("type", "began")
25
25
  put("shouldResume", false)
26
+ isTransientLoss = false
26
27
  }
27
28
  audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
28
29
  }
@@ -32,6 +33,7 @@ class AudioFocusListener(
32
33
  HashMap<String, Any>().apply {
33
34
  put("type", "began")
34
35
  put("shouldResume", false)
36
+ isTransientLoss = true
35
37
  }
36
38
  audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
37
39
  }
@@ -40,7 +42,8 @@ class AudioFocusListener(
40
42
  val body =
41
43
  HashMap<String, Any>().apply {
42
44
  put("type", "ended")
43
- put("shouldResume", true)
45
+ put("shouldResume", isTransientLoss)
46
+ isTransientLoss = false
44
47
  }
45
48
  audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody("interruption", body)
46
49
  }
@@ -0,0 +1,128 @@
1
+ package com.swmansion.audioapi.system
2
+
3
+ import android.app.Notification
4
+ import android.app.NotificationChannel
5
+ import android.app.NotificationManager
6
+ import android.app.Service
7
+ import android.content.Context
8
+ import android.content.Intent
9
+ import android.content.pm.ServiceInfo
10
+ import android.os.Build
11
+ import android.os.IBinder
12
+ import android.util.Log
13
+ import androidx.core.app.NotificationCompat
14
+ import com.swmansion.audioapi.system.MediaSessionManager.CHANNEL_ID
15
+ import com.swmansion.audioapi.system.notification.NotificationRegistry
16
+
17
+ /**
18
+ * Centralized foreground service that can be used by any component that needs foreground capabilities.
19
+ */
20
+ class CentralizedForegroundService : Service() {
21
+ companion object {
22
+ private const val TAG = "CentralizedForegroundService"
23
+ private const val NOTIFICATION_ID = 100
24
+ const val ACTION_START = "START_FOREGROUND"
25
+ const val ACTION_STOP = "STOP_FOREGROUND"
26
+ }
27
+
28
+ override fun onBind(intent: Intent?): IBinder? = null
29
+
30
+ override fun onStartCommand(
31
+ intent: Intent?,
32
+ flags: Int,
33
+ startId: Int,
34
+ ): Int {
35
+ when (intent?.action) {
36
+ ACTION_START -> {
37
+ startForegroundWithNotification()
38
+ }
39
+
40
+ ACTION_STOP -> {
41
+ stopForeground(STOP_FOREGROUND_REMOVE)
42
+ stopSelf()
43
+ }
44
+ }
45
+ return START_NOT_STICKY
46
+ }
47
+
48
+ private fun startForegroundWithNotification() {
49
+ try {
50
+ createNotificationChannelIfNeeded()
51
+
52
+ // Try to use an existing notification first
53
+ val existingNotification = findExistingNotification()
54
+ val (notificationId, notification) =
55
+ if (existingNotification != null) {
56
+ existingNotification
57
+ } else {
58
+ // Fallback to default service notification
59
+ NOTIFICATION_ID to createServiceNotification()
60
+ }
61
+
62
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
63
+ startForeground(
64
+ notificationId,
65
+ notification,
66
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK,
67
+ )
68
+ } else {
69
+ startForeground(notificationId, notification)
70
+ }
71
+
72
+ Log.d(TAG, "Centralized foreground service started with notification ID: $notificationId")
73
+ } catch (e: Exception) {
74
+ Log.e(TAG, "Error starting foreground service: ${e.message}", e)
75
+ }
76
+ }
77
+
78
+ private fun findExistingNotification(): Pair<Int, Notification>? {
79
+ // Check for recording notification first (priority)
80
+ NotificationRegistry.getBuiltNotification(101)?.let {
81
+ return 101 to it
82
+ }
83
+
84
+ // Check for playback notification
85
+ NotificationRegistry.getBuiltNotification(100)?.let {
86
+ return 100 to it
87
+ }
88
+
89
+ return null
90
+ }
91
+
92
+ private fun createServiceNotification(): Notification =
93
+ NotificationCompat
94
+ .Builder(this, CHANNEL_ID)
95
+ .setContentTitle("Audio Service")
96
+ .setContentText("Audio processing in progress")
97
+ .setSmallIcon(android.R.drawable.ic_btn_speak_now)
98
+ .setPriority(NotificationCompat.PRIORITY_LOW)
99
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
100
+ .setOngoing(true)
101
+ .setAutoCancel(false)
102
+ .build()
103
+
104
+ private fun createNotificationChannelIfNeeded() {
105
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
106
+ val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
107
+
108
+ if (notificationManager.getNotificationChannel(CHANNEL_ID) == null) {
109
+ val channel =
110
+ NotificationChannel(
111
+ CHANNEL_ID,
112
+ "Audio Service",
113
+ NotificationManager.IMPORTANCE_LOW,
114
+ ).apply {
115
+ description = "Background audio processing"
116
+ setShowBadge(false)
117
+ lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
118
+ }
119
+ notificationManager.createNotificationChannel(channel)
120
+ }
121
+ }
122
+ }
123
+
124
+ override fun onDestroy() {
125
+ Log.d(TAG, "Centralized foreground service destroyed")
126
+ super.onDestroy()
127
+ }
128
+ }
@@ -0,0 +1,116 @@
1
+ package com.swmansion.audioapi.system
2
+
3
+ import android.content.Intent
4
+ import android.os.Build
5
+ import android.util.Log
6
+ import com.facebook.react.bridge.ReactApplicationContext
7
+ import java.lang.ref.WeakReference
8
+
9
+ /**
10
+ * Centralized manager for foreground service lifecycle.
11
+ * Handles starting/stopping foreground service based on active subscribers.
12
+ */
13
+ object ForegroundServiceManager {
14
+ private const val TAG = "ForegroundServiceManager"
15
+
16
+ private lateinit var reactContext: WeakReference<ReactApplicationContext>
17
+ private val subscribers = mutableSetOf<String>()
18
+ private var isServiceRunning = false
19
+
20
+ fun initialize(reactContext: WeakReference<ReactApplicationContext>) {
21
+ this.reactContext = reactContext
22
+ }
23
+
24
+ /**
25
+ * Subscribe to foreground service. Service will start if not already running.
26
+ * @param subscriberId Unique identifier for the subscriber
27
+ */
28
+ @Synchronized
29
+ fun subscribe(subscriberId: String) {
30
+ if (subscribers.add(subscriberId)) {
31
+ Log.d(TAG, "Subscriber added: $subscriberId (total: ${subscribers.size})")
32
+ startServiceIfNeeded()
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Unsubscribe from foreground service. Service will stop if no more subscribers.
38
+ * @param subscriberId Unique identifier for the subscriber
39
+ */
40
+ @Synchronized
41
+ fun unsubscribe(subscriberId: String) {
42
+ if (subscribers.remove(subscriberId)) {
43
+ Log.d(TAG, "Subscriber removed: $subscriberId (total: ${subscribers.size})")
44
+ stopServiceIfNotNeeded()
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Get count of active subscribers
50
+ */
51
+ fun getSubscriberCount(): Int = subscribers.size
52
+
53
+ /**
54
+ * Check if service is currently running
55
+ */
56
+ fun isServiceRunning(): Boolean = isServiceRunning
57
+
58
+ private fun startServiceIfNeeded() {
59
+ if (!isServiceRunning && subscribers.isNotEmpty()) {
60
+ startForegroundService()
61
+ }
62
+ }
63
+
64
+ private fun stopServiceIfNotNeeded() {
65
+ if (isServiceRunning && subscribers.isEmpty()) {
66
+ stopForegroundService()
67
+ }
68
+ }
69
+
70
+ private fun startForegroundService() {
71
+ val context = reactContext.get() ?: return
72
+
73
+ try {
74
+ val intent = Intent(context, CentralizedForegroundService::class.java)
75
+ intent.action = CentralizedForegroundService.ACTION_START
76
+
77
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
78
+ context.startForegroundService(intent)
79
+ } else {
80
+ context.startService(intent)
81
+ }
82
+
83
+ isServiceRunning = true
84
+ Log.d(TAG, "Centralized foreground service started")
85
+ } catch (e: Exception) {
86
+ Log.e(TAG, "Error starting foreground service: ${e.message}", e)
87
+ }
88
+ }
89
+
90
+ private fun stopForegroundService() {
91
+ val context = reactContext.get() ?: return
92
+
93
+ try {
94
+ val intent = Intent(context, CentralizedForegroundService::class.java)
95
+ intent.action = CentralizedForegroundService.ACTION_STOP
96
+
97
+ context.startService(intent)
98
+ isServiceRunning = false
99
+ Log.d(TAG, "Centralized foreground service stopped")
100
+ } catch (e: Exception) {
101
+ Log.e(TAG, "Error stopping foreground service: ${e.message}", e)
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Cleanup all subscribers and stop service
107
+ */
108
+ fun cleanup() {
109
+ synchronized(this) {
110
+ subscribers.clear()
111
+ if (isServiceRunning) {
112
+ stopForegroundService()
113
+ }
114
+ }
115
+ }
116
+ }
@@ -4,13 +4,11 @@ import android.Manifest
4
4
  import android.app.NotificationChannel
5
5
  import android.app.NotificationManager
6
6
  import android.content.Context
7
- import android.content.Intent
8
7
  import android.content.IntentFilter
9
8
  import android.content.pm.PackageManager
10
9
  import android.media.AudioDeviceInfo
11
10
  import android.media.AudioManager
12
11
  import android.os.Build
13
- import android.support.v4.media.session.MediaSessionCompat
14
12
  import androidx.annotation.RequiresApi
15
13
  import androidx.core.app.NotificationCompat
16
14
  import androidx.core.content.ContextCompat
@@ -20,11 +18,14 @@ import com.facebook.react.bridge.ReadableMap
20
18
  import com.facebook.react.modules.core.PermissionAwareActivity
21
19
  import com.facebook.react.modules.core.PermissionListener
22
20
  import com.swmansion.audioapi.AudioAPIModule
23
- import com.swmansion.audioapi.core.NativeAudioPlayer
24
- import com.swmansion.audioapi.core.NativeAudioRecorder
25
21
  import com.swmansion.audioapi.system.PermissionRequestListener.Companion.RECORDING_REQUEST_CODE
22
+ import com.swmansion.audioapi.system.notification.NotificationRegistry
23
+ import com.swmansion.audioapi.system.notification.PlaybackNotification
24
+ import com.swmansion.audioapi.system.notification.PlaybackNotificationReceiver
25
+ import com.swmansion.audioapi.system.notification.RecordingNotification
26
+ import com.swmansion.audioapi.system.notification.RecordingNotificationReceiver
27
+ import com.swmansion.audioapi.system.notification.SimpleNotification
26
28
  import java.lang.ref.WeakReference
27
- import java.util.UUID
28
29
 
29
30
  object MediaSessionManager {
30
31
  private lateinit var audioAPIModule: WeakReference<AudioAPIModule>
@@ -33,17 +34,13 @@ object MediaSessionManager {
33
34
  const val CHANNEL_ID = "react-native-audio-api"
34
35
 
35
36
  private lateinit var audioManager: AudioManager
36
- private lateinit var mediaSession: MediaSessionCompat
37
- lateinit var mediaNotificationManager: MediaNotificationManager
38
- private lateinit var lockScreenManager: LockScreenManager
39
37
  private lateinit var audioFocusListener: AudioFocusListener
40
38
  private lateinit var volumeChangeListener: VolumeChangeListener
41
- private lateinit var mediaReceiver: MediaReceiver
39
+ private lateinit var playbackNotificationReceiver: PlaybackNotificationReceiver
40
+ private lateinit var recordingNotificationReceiver: RecordingNotificationReceiver
42
41
 
43
- private var isServiceRunning = false
44
- private val serviceStateLock = Any()
45
- private val nativeAudioPlayers = mutableMapOf<String, NativeAudioPlayer>()
46
- private val nativeAudioRecorders = mutableMapOf<String, NativeAudioRecorder>()
42
+ // New notification system
43
+ private lateinit var notificationRegistry: NotificationRegistry
47
44
 
48
45
  fun initialize(
49
46
  audioAPIModule: WeakReference<AudioAPIModule>,
@@ -52,118 +49,54 @@ object MediaSessionManager {
52
49
  this.audioAPIModule = audioAPIModule
53
50
  this.reactContext = reactContext
54
51
  this.audioManager = reactContext.get()?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
55
- this.mediaSession = MediaSessionCompat(reactContext.get()!!, "MediaSessionManager")
52
+
53
+ // Initialize ForegroundServiceManager
54
+ ForegroundServiceManager.initialize(reactContext)
56
55
 
57
56
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
58
57
  createChannel()
59
58
  }
60
59
 
61
- this.mediaNotificationManager = MediaNotificationManager(this.reactContext)
62
- this.lockScreenManager = LockScreenManager(this.reactContext, WeakReference(this.mediaSession), WeakReference(mediaNotificationManager))
63
- this.mediaReceiver =
64
- MediaReceiver(this.reactContext, WeakReference(this.mediaSession), WeakReference(this.mediaNotificationManager), this.audioAPIModule)
65
- this.mediaSession.setCallback(MediaSessionCallback(this.audioAPIModule, WeakReference(this.mediaNotificationManager)))
66
-
67
- val filter = IntentFilter()
68
- filter.addAction(MediaNotificationManager.REMOVE_NOTIFICATION)
69
- filter.addAction(MediaNotificationManager.MEDIA_BUTTON)
70
- filter.addAction(Intent.ACTION_MEDIA_BUTTON)
71
- filter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
60
+ // Set up PlaybackNotificationReceiver
61
+ PlaybackNotificationReceiver.setAudioAPIModule(audioAPIModule.get())
62
+ this.playbackNotificationReceiver = PlaybackNotificationReceiver()
72
63
 
64
+ // Register PlaybackNotificationReceiver
65
+ val playbackFilter = IntentFilter(PlaybackNotificationReceiver.ACTION_NOTIFICATION_DISMISSED)
73
66
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
74
- this.reactContext.get()!!.registerReceiver(mediaReceiver, filter, Context.RECEIVER_EXPORTED)
67
+ this.reactContext.get()!!.registerReceiver(playbackNotificationReceiver, playbackFilter, Context.RECEIVER_NOT_EXPORTED)
75
68
  } else {
76
69
  ContextCompat.registerReceiver(
77
70
  this.reactContext.get()!!,
78
- mediaReceiver,
79
- filter,
71
+ playbackNotificationReceiver,
72
+ playbackFilter,
80
73
  ContextCompat.RECEIVER_NOT_EXPORTED,
81
74
  )
82
75
  }
83
76
 
84
- this.audioFocusListener =
85
- AudioFocusListener(WeakReference(this.audioManager), this.audioAPIModule, WeakReference(this.lockScreenManager))
86
- this.volumeChangeListener = VolumeChangeListener(WeakReference(this.audioManager), this.audioAPIModule)
87
- }
88
-
89
- fun attachAudioPlayer(player: NativeAudioPlayer): String {
90
- val uuid = UUID.randomUUID().toString()
91
- nativeAudioPlayers[uuid] = player
92
-
93
- return uuid
94
- }
95
-
96
- fun detachAudioPlayer(uuid: String) {
97
- nativeAudioPlayers.remove(uuid)
98
- }
77
+ // Set up RecordingNotificationReceiver
78
+ RecordingNotificationReceiver.setAudioAPIModule(audioAPIModule.get())
79
+ this.recordingNotificationReceiver = RecordingNotificationReceiver()
99
80
 
100
- fun attachAudioRecorder(recorder: NativeAudioRecorder): String {
101
- val uuid = UUID.randomUUID().toString()
102
- nativeAudioRecorders[uuid] = recorder
103
-
104
- return uuid
105
- }
106
-
107
- fun detachAudioRecorder(uuid: String) {
108
- nativeAudioRecorders.remove(uuid)
109
- }
110
-
111
- fun startForegroundServiceIfNecessary() {
112
- if (nativeAudioPlayers.isNotEmpty() || nativeAudioRecorders.isNotEmpty()) {
113
- startForegroundService()
114
- }
115
- }
116
-
117
- fun stopForegroundServiceIfNecessary() {
118
- if (nativeAudioPlayers.isEmpty() && nativeAudioRecorders.isEmpty()) {
119
- stopForegroundService()
120
- }
121
- }
122
-
123
- private fun startForegroundService() {
124
- synchronized(serviceStateLock) {
125
- if (isServiceRunning || reactContext.get() == null) {
126
- return
127
- }
128
-
129
- val intent = Intent(reactContext.get(), MediaNotificationManager.AudioForegroundService::class.java)
130
- intent.action = MediaNotificationManager.ForegroundAction.START_FOREGROUND.name
131
-
132
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
133
- ContextCompat.startForegroundService(reactContext.get()!!, intent)
134
- } else {
135
- reactContext.get()!!.startService(intent)
136
- }
137
- isServiceRunning = true
81
+ // Register RecordingNotificationReceiver
82
+ val recordingFilter = IntentFilter(RecordingNotificationReceiver.ACTION_NOTIFICATION_DISMISSED)
83
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
84
+ this.reactContext.get()!!.registerReceiver(recordingNotificationReceiver, recordingFilter, Context.RECEIVER_NOT_EXPORTED)
85
+ } else {
86
+ ContextCompat.registerReceiver(
87
+ this.reactContext.get()!!,
88
+ recordingNotificationReceiver,
89
+ recordingFilter,
90
+ ContextCompat.RECEIVER_NOT_EXPORTED,
91
+ )
138
92
  }
139
- }
140
93
 
141
- private fun stopForegroundService() {
142
- synchronized(serviceStateLock) {
143
- if (!isServiceRunning || reactContext.get() == null) {
144
- return
145
- }
146
-
147
- val intent = Intent(reactContext.get(), MediaNotificationManager.AudioForegroundService::class.java)
148
- intent.action = MediaNotificationManager.ForegroundAction.STOP_FOREGROUND.name
149
- reactContext.get()!!.startService(intent)
150
- isServiceRunning = false
151
- }
152
- }
153
-
154
- fun setLockScreenInfo(info: ReadableMap?) {
155
- lockScreenManager.setLockScreenInfo(info)
156
- }
157
-
158
- fun resetLockScreenInfo() {
159
- lockScreenManager.resetLockScreenInfo()
160
- }
94
+ this.audioFocusListener =
95
+ AudioFocusListener(WeakReference(this.audioManager), this.audioAPIModule)
96
+ this.volumeChangeListener = VolumeChangeListener(WeakReference(this.audioManager), this.audioAPIModule)
161
97
 
162
- fun enableRemoteCommand(
163
- name: String,
164
- enabled: Boolean,
165
- ) {
166
- lockScreenManager.enableRemoteCommand(name, enabled)
98
+ // Initialize new notification system
99
+ this.notificationRegistry = NotificationRegistry(this.reactContext)
167
100
  }
168
101
 
169
102
  fun getDevicePreferredSampleRate(): Double {
@@ -211,6 +144,41 @@ object MediaSessionManager {
211
144
  "Denied"
212
145
  }
213
146
 
147
+ fun requestNotificationPermissions(permissionListener: PermissionListener) {
148
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
149
+ val permissionAwareActivity = reactContext.get()!!.currentActivity as PermissionAwareActivity
150
+ permissionAwareActivity.requestPermissions(
151
+ arrayOf(Manifest.permission.POST_NOTIFICATIONS),
152
+ PermissionRequestListener.NOTIFICATION_REQUEST_CODE,
153
+ permissionListener,
154
+ )
155
+ } else {
156
+ // For Android < 13, permission is granted by default
157
+ val result = Arguments.createMap()
158
+ result.putString("status", "Granted")
159
+ permissionListener.onRequestPermissionsResult(
160
+ PermissionRequestListener.NOTIFICATION_REQUEST_CODE,
161
+ arrayOf(Manifest.permission.POST_NOTIFICATIONS),
162
+ intArrayOf(PackageManager.PERMISSION_GRANTED),
163
+ )
164
+ }
165
+ }
166
+
167
+ fun checkNotificationPermissions(): String {
168
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
169
+ return if (reactContext.get()!!.checkSelfPermission(
170
+ Manifest.permission.POST_NOTIFICATIONS,
171
+ ) == PackageManager.PERMISSION_GRANTED
172
+ ) {
173
+ "Granted"
174
+ } else {
175
+ "Denied"
176
+ }
177
+ }
178
+ // For Android < 13, permission is granted by default
179
+ return "Granted"
180
+ }
181
+
214
182
  @RequiresApi(Build.VERSION_CODES.O)
215
183
  private fun createChannel() {
216
184
  val notificationManager =
@@ -267,4 +235,44 @@ object MediaSessionManager {
267
235
  AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> "Bluetooth SCO"
268
236
  else -> "Other (${device.type})"
269
237
  }
238
+
239
+ // New notification system methods
240
+ fun registerNotification(
241
+ type: String,
242
+ key: String,
243
+ ) {
244
+ val notification =
245
+ when (type) {
246
+ "simple" -> SimpleNotification(reactContext)
247
+ "playback" -> PlaybackNotification(reactContext, audioAPIModule, 100, "audio_playback")
248
+ "recording" -> RecordingNotification(reactContext, audioAPIModule, 101, "audio_recording23")
249
+ else -> throw IllegalArgumentException("Unknown notification type: $type")
250
+ }
251
+
252
+ notificationRegistry.registerNotification(key, notification)
253
+ }
254
+
255
+ fun showNotification(
256
+ key: String,
257
+ options: ReadableMap?,
258
+ ) {
259
+ notificationRegistry.showNotification(key, options)
260
+ }
261
+
262
+ fun updateNotification(
263
+ key: String,
264
+ options: ReadableMap?,
265
+ ) {
266
+ notificationRegistry.updateNotification(key, options)
267
+ }
268
+
269
+ fun hideNotification(key: String) {
270
+ notificationRegistry.hideNotification(key)
271
+ }
272
+
273
+ fun unregisterNotification(key: String) {
274
+ notificationRegistry.unregisterNotification(key)
275
+ }
276
+
277
+ fun isNotificationActive(key: String): Boolean = notificationRegistry.isNotificationActive(key)
270
278
  }
@@ -9,6 +9,7 @@ class PermissionRequestListener(
9
9
  ) : PermissionListener {
10
10
  companion object {
11
11
  const val RECORDING_REQUEST_CODE = 1234
12
+ const val NOTIFICATION_REQUEST_CODE = 1235
12
13
  }
13
14
 
14
15
  override fun onRequestPermissionsResult(
@@ -16,7 +17,7 @@ class PermissionRequestListener(
16
17
  permissions: Array<String>,
17
18
  grantResults: IntArray,
18
19
  ): Boolean {
19
- if (requestCode == RECORDING_REQUEST_CODE) {
20
+ if (requestCode == RECORDING_REQUEST_CODE || requestCode == NOTIFICATION_REQUEST_CODE) {
20
21
  if (grantResults.isEmpty()) {
21
22
  this.promise.resolve("Undetermined")
22
23
  } else {