react-native-audio-api 0.11.0-alpha.0 → 0.11.0-nightly-bfab178-20251107

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 (350) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +20 -15
  3. package/android/build.gradle +33 -3
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +5 -0
  6. package/android/src/main/cpp/audioapi/android/AudioAPIModule.h +1 -0
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +30 -94
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +14 -28
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +4 -2
  10. package/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp +9 -9
  11. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +6 -0
  12. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +31 -3
  13. package/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt +21 -9
  14. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +27 -6
  15. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  16. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  17. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +30 -2
  18. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +18 -0
  19. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +1 -0
  20. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +1 -1
  21. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +47 -0
  22. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  23. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +18 -80
  24. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +6 -15
  25. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +1 -1
  26. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +1 -1
  27. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +1 -1
  28. package/common/cpp/audioapi/core/AudioNode.h +3 -2
  29. package/common/cpp/audioapi/core/AudioParam.cpp +2 -2
  30. package/common/cpp/audioapi/core/BaseAudioContext.cpp +10 -0
  31. package/common/cpp/audioapi/core/BaseAudioContext.h +2 -0
  32. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +69 -32
  33. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +37 -1
  34. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +210 -0
  35. package/common/cpp/audioapi/core/effects/ConvolverNode.h +55 -0
  36. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +49 -102
  37. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +28 -46
  38. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +14 -17
  39. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +0 -1
  40. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +8 -14
  41. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +0 -1
  42. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +14 -18
  43. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +2 -2
  44. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +64 -64
  45. package/common/cpp/audioapi/core/sources/StreamerNode.h +38 -10
  46. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +5 -0
  47. package/common/cpp/audioapi/core/utils/Constants.h +2 -1
  48. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +12 -8
  49. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +3 -3
  50. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +1 -1
  51. package/common/cpp/audioapi/dsp/AudioUtils.cpp +1 -1
  52. package/common/cpp/audioapi/dsp/Convolver.cpp +213 -0
  53. package/common/cpp/audioapi/dsp/Convolver.h +45 -0
  54. package/common/cpp/audioapi/dsp/FFT.cpp +0 -26
  55. package/common/cpp/audioapi/dsp/FFT.h +26 -2
  56. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +1 -1
  57. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  58. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  59. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  60. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  61. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  62. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  63. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  64. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  65. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  66. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  67. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  68. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  69. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  70. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  71. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  72. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  73. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  74. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  75. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  76. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  77. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  78. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  79. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  80. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  81. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  82. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  83. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  84. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  85. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  86. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  87. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  88. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  89. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  90. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  91. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  92. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  93. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  94. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  95. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  96. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  97. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +2 -3
  98. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  99. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  100. package/common/cpp/audioapi/utils/AudioBus.cpp +28 -0
  101. package/common/cpp/audioapi/utils/AudioBus.h +3 -0
  102. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  103. package/common/cpp/test/CMakeLists.txt +19 -14
  104. package/common/cpp/test/src/AudioParamTest.cpp +1 -1
  105. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +134 -0
  106. package/common/cpp/test/src/ConstantSourceTest.cpp +1 -1
  107. package/common/cpp/test/src/GainTest.cpp +1 -1
  108. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +4 -4
  109. package/common/cpp/test/src/OscillatorTest.cpp +1 -1
  110. package/common/cpp/test/src/StereoPannerTest.cpp +1 -1
  111. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +389 -0
  112. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +64 -0
  113. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +284 -0
  114. package/common/cpp/test/src/biquad/BiquadFilterTest.h +40 -0
  115. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  116. package/ios/audioapi/ios/AudioAPIModule.mm +13 -0
  117. package/ios/audioapi/ios/core/IOSAudioRecorder.h +9 -18
  118. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +28 -70
  119. package/ios/audioapi/ios/core/NativeAudioRecorder.h +6 -2
  120. package/ios/audioapi/ios/core/NativeAudioRecorder.m +73 -5
  121. package/ios/audioapi/ios/system/AudioEngine.mm +3 -3
  122. package/ios/audioapi/ios/system/AudioSessionManager.h +2 -0
  123. package/ios/audioapi/ios/system/AudioSessionManager.mm +24 -0
  124. package/ios/audioapi/ios/system/LockScreenManager.h +0 -1
  125. package/ios/audioapi/ios/system/LockScreenManager.mm +6 -19
  126. package/lib/commonjs/api.js +141 -76
  127. package/lib/commonjs/api.js.map +1 -1
  128. package/lib/commonjs/api.web.js +8 -0
  129. package/lib/commonjs/api.web.js.map +1 -1
  130. package/lib/commonjs/core/AudioContext.js +1 -1
  131. package/lib/commonjs/core/AudioContext.js.map +1 -1
  132. package/lib/commonjs/core/AudioRecorder.js +12 -157
  133. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  134. package/lib/commonjs/core/BaseAudioContext.js +28 -25
  135. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  136. package/lib/commonjs/core/ConvolverNode.js +37 -0
  137. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  138. package/lib/commonjs/core/OfflineAudioContext.js +1 -1
  139. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  140. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  141. package/lib/commonjs/system/AudioManager.js +3 -0
  142. package/lib/commonjs/system/AudioManager.js.map +1 -1
  143. package/lib/commonjs/types.js +0 -46
  144. package/lib/commonjs/types.js.map +1 -1
  145. package/lib/commonjs/utils/index.js +19 -21
  146. package/lib/commonjs/utils/index.js.map +1 -1
  147. package/lib/commonjs/web-core/AudioContext.js +12 -0
  148. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  149. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  150. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  151. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  152. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  153. package/lib/commonjs/web-core/OfflineAudioContext.js +12 -0
  154. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  155. package/lib/module/api.js +16 -15
  156. package/lib/module/api.js.map +1 -1
  157. package/lib/module/api.web.js +1 -0
  158. package/lib/module/api.web.js.map +1 -1
  159. package/lib/module/core/AudioContext.js +2 -2
  160. package/lib/module/core/AudioContext.js.map +1 -1
  161. package/lib/module/core/AudioRecorder.js +12 -157
  162. package/lib/module/core/AudioRecorder.js.map +1 -1
  163. package/lib/module/core/BaseAudioContext.js +29 -26
  164. package/lib/module/core/BaseAudioContext.js.map +1 -1
  165. package/lib/module/core/ConvolverNode.js +31 -0
  166. package/lib/module/core/ConvolverNode.js.map +1 -0
  167. package/lib/module/core/OfflineAudioContext.js +2 -2
  168. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  169. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  170. package/lib/module/system/AudioManager.js +3 -0
  171. package/lib/module/system/AudioManager.js.map +1 -1
  172. package/lib/module/types.js +1 -45
  173. package/lib/module/types.js.map +1 -1
  174. package/lib/module/utils/index.js +15 -2
  175. package/lib/module/utils/index.js.map +1 -1
  176. package/lib/module/web-core/AudioContext.js +12 -0
  177. package/lib/module/web-core/AudioContext.js.map +1 -1
  178. package/lib/module/web-core/ConvolverNode.js +34 -0
  179. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  180. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  181. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  182. package/lib/module/web-core/OfflineAudioContext.js +12 -0
  183. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  184. package/lib/typescript/api.d.ts +19 -17
  185. package/lib/typescript/api.d.ts.map +1 -1
  186. package/lib/typescript/api.web.d.ts +1 -0
  187. package/lib/typescript/api.web.d.ts.map +1 -1
  188. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  189. package/lib/typescript/core/AudioRecorder.d.ts +6 -58
  190. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  191. package/lib/typescript/core/BaseAudioContext.d.ts +3 -1
  192. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  193. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  194. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  195. package/lib/typescript/events/types.d.ts +0 -16
  196. package/lib/typescript/events/types.d.ts.map +1 -1
  197. package/lib/typescript/interfaces.d.ts +8 -39
  198. package/lib/typescript/interfaces.d.ts.map +1 -1
  199. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +1 -0
  200. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  201. package/lib/typescript/system/AudioManager.d.ts +1 -0
  202. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  203. package/lib/typescript/types.d.ts +8 -74
  204. package/lib/typescript/types.d.ts.map +1 -1
  205. package/lib/typescript/utils/index.d.ts +5 -2
  206. package/lib/typescript/utils/index.d.ts.map +1 -1
  207. package/lib/typescript/web-core/AudioContext.d.ts +3 -0
  208. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  209. package/lib/typescript/web-core/BaseAudioContext.d.ts +2 -0
  210. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  211. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  212. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  213. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  214. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  215. package/lib/typescript/web-core/OfflineAudioContext.d.ts +3 -0
  216. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  217. package/package.json +14 -5
  218. package/scripts/download-prebuilt-binaries.sh +61 -0
  219. package/scripts/rnaa_utils.rb +8 -0
  220. package/scripts/validate-worklets-version.js +28 -0
  221. package/src/api.ts +45 -18
  222. package/src/api.web.ts +1 -0
  223. package/src/core/AudioContext.ts +3 -2
  224. package/src/core/AudioRecorder.ts +20 -190
  225. package/src/core/BaseAudioContext.ts +67 -60
  226. package/src/core/ConvolverNode.ts +35 -0
  227. package/src/core/OfflineAudioContext.ts +2 -2
  228. package/src/events/types.ts +0 -18
  229. package/src/interfaces.ts +15 -47
  230. package/src/specs/NativeAudioAPIModule.ts +1 -0
  231. package/src/system/AudioManager.ts +4 -0
  232. package/src/types.ts +9 -84
  233. package/src/utils/index.ts +22 -2
  234. package/src/web-core/AudioContext.tsx +25 -0
  235. package/src/web-core/BaseAudioContext.tsx +2 -0
  236. package/src/web-core/ConvolverNode.tsx +43 -0
  237. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  238. package/src/web-core/OfflineAudioContext.tsx +25 -0
  239. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +0 -33
  240. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  241. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  242. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +0 -3
  243. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  244. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  245. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +0 -431
  246. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +0 -112
  247. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  248. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  249. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +0 -237
  250. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +0 -46
  251. package/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp +0 -31
  252. package/android/src/main/java/com/swmansion/audioapi/system/NativeFileInfo.kt +0 -18
  253. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  254. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  255. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  256. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  257. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  258. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  259. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  260. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  261. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  262. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  263. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  264. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  265. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  266. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  267. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  268. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  269. package/common/cpp/audioapi/external/arm64-v8a/libcrypto.a +0 -0
  270. package/common/cpp/audioapi/external/arm64-v8a/libogg.a +0 -0
  271. package/common/cpp/audioapi/external/arm64-v8a/libopus.a +0 -0
  272. package/common/cpp/audioapi/external/arm64-v8a/libopusfile.a +0 -0
  273. package/common/cpp/audioapi/external/arm64-v8a/libssl.a +0 -0
  274. package/common/cpp/audioapi/external/arm64-v8a/libvorbis.a +0 -0
  275. package/common/cpp/audioapi/external/arm64-v8a/libvorbisenc.a +0 -0
  276. package/common/cpp/audioapi/external/arm64-v8a/libvorbisfile.a +0 -0
  277. package/common/cpp/audioapi/external/armeabi-v7a/libcrypto.a +0 -0
  278. package/common/cpp/audioapi/external/armeabi-v7a/libogg.a +0 -0
  279. package/common/cpp/audioapi/external/armeabi-v7a/libopus.a +0 -0
  280. package/common/cpp/audioapi/external/armeabi-v7a/libopusfile.a +0 -0
  281. package/common/cpp/audioapi/external/armeabi-v7a/libssl.a +0 -0
  282. package/common/cpp/audioapi/external/armeabi-v7a/libvorbis.a +0 -0
  283. package/common/cpp/audioapi/external/armeabi-v7a/libvorbisenc.a +0 -0
  284. package/common/cpp/audioapi/external/armeabi-v7a/libvorbisfile.a +0 -0
  285. package/common/cpp/audioapi/external/iphoneos/libcrypto.a +0 -0
  286. package/common/cpp/audioapi/external/iphoneos/libogg.a +0 -0
  287. package/common/cpp/audioapi/external/iphoneos/libopus.a +0 -0
  288. package/common/cpp/audioapi/external/iphoneos/libopusfile.a +0 -0
  289. package/common/cpp/audioapi/external/iphoneos/libssl.a +0 -0
  290. package/common/cpp/audioapi/external/iphoneos/libvorbis.a +0 -0
  291. package/common/cpp/audioapi/external/iphoneos/libvorbisenc.a +0 -0
  292. package/common/cpp/audioapi/external/iphoneos/libvorbisfile.a +0 -0
  293. package/common/cpp/audioapi/external/iphonesimulator/libcrypto.a +0 -0
  294. package/common/cpp/audioapi/external/iphonesimulator/libogg.a +0 -0
  295. package/common/cpp/audioapi/external/iphonesimulator/libopus.a +0 -0
  296. package/common/cpp/audioapi/external/iphonesimulator/libopusfile.a +0 -0
  297. package/common/cpp/audioapi/external/iphonesimulator/libssl.a +0 -0
  298. package/common/cpp/audioapi/external/iphonesimulator/libvorbis.a +0 -0
  299. package/common/cpp/audioapi/external/iphonesimulator/libvorbisenc.a +0 -0
  300. package/common/cpp/audioapi/external/iphonesimulator/libvorbisfile.a +0 -0
  301. package/common/cpp/audioapi/external/libavcodec.xcframework/Info.plist +0 -44
  302. package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/Info.plist +0 -1
  303. package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64/libavcodec.framework/libavcodec +0 -0
  304. package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -1
  305. package/common/cpp/audioapi/external/libavcodec.xcframework/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  306. package/common/cpp/audioapi/external/libavformat.xcframework/Info.plist +0 -44
  307. package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/Info.plist +0 -1
  308. package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64/libavformat.framework/libavformat +0 -0
  309. package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -1
  310. package/common/cpp/audioapi/external/libavformat.xcframework/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  311. package/common/cpp/audioapi/external/libavutil.xcframework/Info.plist +0 -44
  312. package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/Info.plist +0 -1
  313. package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64/libavutil.framework/libavutil +0 -0
  314. package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -1
  315. package/common/cpp/audioapi/external/libavutil.xcframework/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  316. package/common/cpp/audioapi/external/libswresample.xcframework/Info.plist +0 -44
  317. package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/Info.plist +0 -1
  318. package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64/libswresample.framework/libswresample +0 -0
  319. package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -1
  320. package/common/cpp/audioapi/external/libswresample.xcframework/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  321. package/common/cpp/audioapi/external/x86/libcrypto.a +0 -0
  322. package/common/cpp/audioapi/external/x86/libogg.a +0 -0
  323. package/common/cpp/audioapi/external/x86/libopus.a +0 -0
  324. package/common/cpp/audioapi/external/x86/libopusfile.a +0 -0
  325. package/common/cpp/audioapi/external/x86/libssl.a +0 -0
  326. package/common/cpp/audioapi/external/x86/libvorbis.a +0 -0
  327. package/common/cpp/audioapi/external/x86/libvorbisenc.a +0 -0
  328. package/common/cpp/audioapi/external/x86/libvorbisfile.a +0 -0
  329. package/common/cpp/audioapi/external/x86_64/libcrypto.a +0 -0
  330. package/common/cpp/audioapi/external/x86_64/libogg.a +0 -0
  331. package/common/cpp/audioapi/external/x86_64/libopus.a +0 -0
  332. package/common/cpp/audioapi/external/x86_64/libopusfile.a +0 -0
  333. package/common/cpp/audioapi/external/x86_64/libssl.a +0 -0
  334. package/common/cpp/audioapi/external/x86_64/libvorbis.a +0 -0
  335. package/common/cpp/audioapi/external/x86_64/libvorbisenc.a +0 -0
  336. package/common/cpp/audioapi/external/x86_64/libvorbisfile.a +0 -0
  337. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  338. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  339. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  340. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -35
  341. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -135
  342. package/ios/audioapi/ios/core/IOSAudioFileWriter.h +0 -38
  343. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -187
  344. package/lib/commonjs/utils/bitEnums.js +0 -33
  345. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  346. package/lib/module/utils/bitEnums.js +0 -27
  347. package/lib/module/utils/bitEnums.js.map +0 -1
  348. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  349. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  350. package/src/utils/bitEnums.ts +0 -51
@@ -0,0 +1,284 @@
1
+ #include <test/src/biquad/BiquadFilterChromium.h>
2
+ #include <test/src/biquad/BiquadFilterTest.h>
3
+
4
+ namespace audioapi {
5
+
6
+ void BiquadFilterTest::expectCoefficientsNear(
7
+ const std::shared_ptr<BiquadFilterNode> &biquadNode,
8
+ const BiquadCoefficients &expected) {
9
+ EXPECT_NEAR(biquadNode->b0_, expected.b0, tolerance);
10
+ EXPECT_NEAR(biquadNode->b1_, expected.b1, tolerance);
11
+ EXPECT_NEAR(biquadNode->b2_, expected.b2, tolerance);
12
+ EXPECT_NEAR(biquadNode->a1_, expected.a1, tolerance);
13
+ EXPECT_NEAR(biquadNode->a2_, expected.a2, tolerance);
14
+ }
15
+
16
+ void BiquadFilterTest::testLowpass(float frequency, float Q) {
17
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
18
+ float normalizedFrequency = frequency / nyquistFrequency;
19
+
20
+ node->setLowpassCoefficients(normalizedFrequency, Q);
21
+ expectCoefficientsNear(
22
+ node, calculateLowpassCoefficients(normalizedFrequency, Q));
23
+ }
24
+
25
+ void BiquadFilterTest::testHighpass(float frequency, float Q) {
26
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
27
+ float normalizedFrequency = frequency / nyquistFrequency;
28
+
29
+ node->setHighpassCoefficients(normalizedFrequency, Q);
30
+ expectCoefficientsNear(
31
+ node, calculateHighpassCoefficients(normalizedFrequency, Q));
32
+ }
33
+
34
+ void BiquadFilterTest::testBandpass(float frequency, float Q) {
35
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
36
+ float normalizedFrequency = frequency / nyquistFrequency;
37
+
38
+ node->setBandpassCoefficients(normalizedFrequency, Q);
39
+ expectCoefficientsNear(
40
+ node, calculateBandpassCoefficients(normalizedFrequency, Q));
41
+ }
42
+
43
+ void BiquadFilterTest::testNotch(float frequency, float Q) {
44
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
45
+ float normalizedFrequency = frequency / nyquistFrequency;
46
+
47
+ node->setNotchCoefficients(normalizedFrequency, Q);
48
+ expectCoefficientsNear(
49
+ node, calculateNotchCoefficients(normalizedFrequency, Q));
50
+ }
51
+
52
+ void BiquadFilterTest::testAllpass(float frequency, float Q) {
53
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
54
+ float normalizedFrequency = frequency / nyquistFrequency;
55
+
56
+ node->setAllpassCoefficients(normalizedFrequency, Q);
57
+ expectCoefficientsNear(
58
+ node, calculateAllpassCoefficients(normalizedFrequency, Q));
59
+ }
60
+
61
+ void BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {
62
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
63
+ float normalizedFrequency = frequency / nyquistFrequency;
64
+
65
+ node->setPeakingCoefficients(normalizedFrequency, Q, gain);
66
+ expectCoefficientsNear(
67
+ node, calculatePeakingCoefficients(normalizedFrequency, Q, gain));
68
+ }
69
+
70
+ void BiquadFilterTest::testLowshelf(float frequency, float gain) {
71
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
72
+ float normalizedFrequency = frequency / nyquistFrequency;
73
+
74
+ node->setLowshelfCoefficients(normalizedFrequency, gain);
75
+ expectCoefficientsNear(
76
+ node, calculateLowshelfCoefficients(normalizedFrequency, gain));
77
+ }
78
+
79
+ void BiquadFilterTest::testHighshelf(float frequency, float gain) {
80
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
81
+ float normalizedFrequency = frequency / nyquistFrequency;
82
+
83
+ node->setHighshelfCoefficients(normalizedFrequency, gain);
84
+ expectCoefficientsNear(
85
+ node, calculateHighshelfCoefficients(normalizedFrequency, gain));
86
+ }
87
+
88
+ INSTANTIATE_TEST_SUITE_P(
89
+ Frequencies,
90
+ BiquadFilterFrequencyTest,
91
+ ::testing::Values(
92
+ 0.0f, // 0 Hz - the filter should block all input signal
93
+ 10.0f, // very low frequency
94
+ 350.0f, // default
95
+ nyquistFrequency - 0.0001f, // frequency near Nyquist
96
+ nyquistFrequency)); // maximal frequency
97
+
98
+ INSTANTIATE_TEST_SUITE_P(
99
+ QEdgeCases,
100
+ BiquadFilterQTestLowpassHighpass,
101
+ ::testing::Values(
102
+ -770.63678f, // min value for lowpass and highpass
103
+ 0.0f, // default
104
+ 770.63678f)); // max value for lowpass and highpass
105
+
106
+ INSTANTIATE_TEST_SUITE_P(
107
+ QEdgeCases,
108
+ BiquadFilterQTestRestTypes, // bandpass, notch, allpass, peaking
109
+ ::testing::Values(
110
+ 0.0f, // default and min value
111
+ MOST_POSITIVE_SINGLE_FLOAT));
112
+
113
+ INSTANTIATE_TEST_SUITE_P(
114
+ GainEdgeCases,
115
+ BiquadFilterGainTest,
116
+ ::testing::Values(
117
+ -40.0f,
118
+ 0.0f, // default
119
+ 40.0f));
120
+
121
+ TEST_P(BiquadFilterFrequencyTest, SetLowpassCoefficients) {
122
+ float frequency = GetParam();
123
+ float Q = 1.0f;
124
+ testLowpass(frequency, Q);
125
+ }
126
+
127
+ TEST_P(BiquadFilterFrequencyTest, SetHighpassCoefficients) {
128
+ float frequency = GetParam();
129
+ float Q = 1.0f;
130
+ testHighpass(frequency, Q);
131
+ }
132
+
133
+ TEST_P(BiquadFilterFrequencyTest, SetBandpassCoefficients) {
134
+ float frequency = GetParam();
135
+ float Q = 1.0f;
136
+ testBandpass(frequency, Q);
137
+ }
138
+
139
+ TEST_P(BiquadFilterFrequencyTest, SetNotchCoefficients) {
140
+ float frequency = GetParam();
141
+ float Q = 1.0f;
142
+ testNotch(frequency, Q);
143
+ }
144
+
145
+ TEST_P(BiquadFilterFrequencyTest, SetAllpassCoefficients) {
146
+ float frequency = GetParam();
147
+ float Q = 1.0f;
148
+ testAllpass(frequency, Q);
149
+ }
150
+
151
+ TEST_P(BiquadFilterFrequencyTest, SetPeakingCoefficients) {
152
+ float frequency = GetParam();
153
+ float Q = 1.0f;
154
+ float gain = 2.0f;
155
+ testPeaking(frequency, Q, gain);
156
+ }
157
+
158
+ TEST_P(BiquadFilterFrequencyTest, SetLowshelfCoefficients) {
159
+ float frequency = GetParam();
160
+ float gain = 2.0f;
161
+ testLowshelf(frequency, gain);
162
+ }
163
+
164
+ TEST_P(BiquadFilterFrequencyTest, SetHighshelfCoefficients) {
165
+ float frequency = GetParam();
166
+ float gain = 2.0f;
167
+ testHighshelf(frequency, gain);
168
+ }
169
+
170
+ TEST_P(BiquadFilterQTestLowpassHighpass, SetLowpassCoefficients) {
171
+ float frequency = 1000.0f;
172
+ float Q = GetParam();
173
+ testLowpass(frequency, Q);
174
+ }
175
+
176
+ TEST_P(BiquadFilterQTestLowpassHighpass, SetHighpassCoefficients) {
177
+ float frequency = 1000.0f;
178
+ float Q = GetParam();
179
+ testHighpass(frequency, Q);
180
+ }
181
+
182
+ TEST_P(BiquadFilterQTestRestTypes, SetBandpassCoefficients) {
183
+ float frequency = 1000.0f;
184
+ float Q = GetParam();
185
+ testBandpass(frequency, Q);
186
+ }
187
+
188
+ TEST_P(BiquadFilterQTestRestTypes, SetNotchCoefficients) {
189
+ float frequency = 1000.0f;
190
+ float Q = GetParam();
191
+ testNotch(frequency, Q);
192
+ }
193
+
194
+ TEST_P(BiquadFilterQTestRestTypes, SetAllpassCoefficients) {
195
+ float frequency = 1000.0f;
196
+ float Q = GetParam();
197
+ testAllpass(frequency, Q);
198
+ }
199
+
200
+ TEST_P(BiquadFilterQTestRestTypes, SetPeakingCoefficients) {
201
+ float frequency = 1000.0f;
202
+ float Q = GetParam();
203
+ float gain = 2.0f;
204
+ testPeaking(frequency, Q, gain);
205
+ }
206
+
207
+ TEST_P(BiquadFilterGainTest, SetPeakingCoefficients) {
208
+ float frequency = 1000.0f;
209
+ float Q = 1.0f;
210
+ float gain = GetParam();
211
+ testPeaking(frequency, Q, gain);
212
+ }
213
+
214
+ TEST_P(BiquadFilterGainTest, SetLowshelfCoefficients) {
215
+ float frequency = 1000.0f;
216
+ float gain = GetParam();
217
+ testLowshelf(frequency, gain);
218
+ }
219
+
220
+ TEST_P(BiquadFilterGainTest, SetHighshelfCoefficients) {
221
+ float frequency = 1000.0f;
222
+ float gain = GetParam();
223
+ testHighshelf(frequency, gain);
224
+ }
225
+
226
+ TEST_F(BiquadFilterTest, GetFrequencyResponse) {
227
+ auto node = std::make_shared<BiquadFilterNode>(context.get());
228
+
229
+ float frequency = 1000.0f;
230
+ float Q = 1.0f;
231
+ float normalizedFrequency = frequency / nyquistFrequency;
232
+
233
+ node->setLowpassCoefficients(normalizedFrequency, Q);
234
+ auto coeffs = calculateLowpassCoefficients(normalizedFrequency, Q);
235
+
236
+ std::vector<float> TestFrequencies = {
237
+ -0.0001f,
238
+ 0.0f,
239
+ 0.0001f,
240
+ 0.25f * nyquistFrequency,
241
+ 0.5f * nyquistFrequency,
242
+ 0.75f * nyquistFrequency,
243
+ nyquistFrequency - 0.0001f,
244
+ nyquistFrequency,
245
+ nyquistFrequency + 0.0001f};
246
+
247
+ std::vector<float> magResponseNode(TestFrequencies.size());
248
+ std::vector<float> phaseResponseNode(TestFrequencies.size());
249
+ std::vector<float> magResponseExpected(TestFrequencies.size());
250
+ std::vector<float> phaseResponseExpected(TestFrequencies.size());
251
+
252
+ node->getFrequencyResponse(
253
+ TestFrequencies.data(),
254
+ magResponseNode.data(),
255
+ phaseResponseNode.data(),
256
+ TestFrequencies.size());
257
+ getFrequencyResponse(
258
+ coeffs,
259
+ TestFrequencies,
260
+ magResponseExpected,
261
+ phaseResponseExpected,
262
+ nyquistFrequency);
263
+
264
+ for (size_t i = 0; i < TestFrequencies.size(); ++i) {
265
+ float f = TestFrequencies[i];
266
+ if (std::isnan(magResponseExpected[i])) {
267
+ EXPECT_TRUE(std::isnan(magResponseNode[i]))
268
+ << "Expected NaN at frequency " << f;
269
+ } else {
270
+ EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)
271
+ << "Magnitude mismatch at " << f << " Hz";
272
+ }
273
+
274
+ if (std::isnan(phaseResponseExpected[i])) {
275
+ EXPECT_TRUE(std::isnan(phaseResponseNode[i]))
276
+ << "Expected NaN at frequency " << f;
277
+ } else {
278
+ EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)
279
+ << "Phase mismatch at " << f << " Hz";
280
+ }
281
+ }
282
+ }
283
+
284
+ } // namespace audioapi
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #include <audioapi/core/OfflineAudioContext.h>
4
+ #include <audioapi/core/effects/BiquadFilterNode.h>
5
+ #include <audioapi/core/utils/worklets/SafeIncludes.h>
6
+ #include <gtest/gtest.h>
7
+ #include <test/src/MockAudioEventHandlerRegistry.h>
8
+ #include <memory>
9
+
10
+ static constexpr int sampleRate = 44100;
11
+ static constexpr float nyquistFrequency = sampleRate / 2.0f;
12
+ static constexpr float tolerance = 0.0001f;
13
+
14
+ namespace audioapi {
15
+ class BiquadFilterTest : public ::testing::Test {
16
+ protected:
17
+ std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
18
+ std::unique_ptr<OfflineAudioContext> context;
19
+
20
+ void SetUp() override {
21
+ eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
22
+ context = std::make_unique<OfflineAudioContext>(2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});
23
+ }
24
+
25
+ void expectCoefficientsNear(const std::shared_ptr<BiquadFilterNode> &node, const BiquadCoefficients &expected);
26
+ void testLowpass(float frequency, float Q);
27
+ void testHighpass(float frequency, float Q);
28
+ void testBandpass(float frequency, float Q);
29
+ void testNotch(float frequency, float Q);
30
+ void testAllpass(float frequency, float Q);
31
+ void testPeaking(float frequency, float Q, float gain);
32
+ void testLowshelf(float frequency, float gain);
33
+ void testHighshelf(float frequency, float gain);
34
+ };
35
+
36
+ class BiquadFilterQTestLowpassHighpass : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
37
+ class BiquadFilterQTestRestTypes : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
38
+ class BiquadFilterFrequencyTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
39
+ class BiquadFilterGainTest : public BiquadFilterTest, public ::testing::WithParamInterface<float> {};
40
+ } // namespace audioapi
@@ -1,5 +1,6 @@
1
1
  #ifdef RCT_NEW_ARCH_ENABLED
2
2
  #import <React/RCTCallInvokerModule.h>
3
+ #import <React/RCTInvalidating.h>
3
4
  #import <rnaudioapi/rnaudioapi.h>
4
5
  #else // RCT_NEW_ARCH_ENABLED
5
6
  #import <React/RCTBridgeModule.h>
@@ -14,7 +15,7 @@
14
15
 
15
16
  @interface AudioAPIModule : RCTEventEmitter
16
17
  #ifdef RCT_NEW_ARCH_ENABLED
17
- <NativeAudioAPIModuleSpec, RCTCallInvokerModule>
18
+ <NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>
18
19
  #else
19
20
  <RCTBridgeModule>
20
21
  #endif // RCT_NEW_ARCH_ENABLED
@@ -54,6 +54,8 @@ RCT_EXPORT_MODULE(AudioAPIModule);
54
54
 
55
55
  _eventHandler = nullptr;
56
56
 
57
+ audioapi::AudioAPIModuleInstaller::closeAllContexts();
58
+
57
59
  [super invalidate];
58
60
  }
59
61
 
@@ -116,6 +118,9 @@ RCT_EXPORT_METHOD(
116
118
  setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
117
119
  reject)
118
120
  {
121
+ if (!self.audioSessionManager.shouldManageSession) {
122
+ [self.audioSessionManager setShouldManageSession:true];
123
+ }
119
124
  if ([self.audioSessionManager setActive:enabled]) {
120
125
  resolve(@"true");
121
126
  return;
@@ -128,6 +133,9 @@ RCT_EXPORT_METHOD(
128
133
  setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)
129
134
  options allowHaptics : (BOOL)allowHaptics)
130
135
  {
136
+ if (!self.audioSessionManager.shouldManageSession) {
137
+ [self.audioSessionManager setShouldManageSession:true];
138
+ }
131
139
  [self.audioSessionManager setAudioSessionOptions:category mode:mode options:options allowHaptics:allowHaptics];
132
140
  }
133
141
 
@@ -180,6 +188,11 @@ RCT_EXPORT_METHOD(
180
188
  [self.audioSessionManager getDevicesInfo:resolve reject:reject];
181
189
  }
182
190
 
191
+ RCT_EXPORT_METHOD(disableSessionManagement)
192
+ {
193
+ [self.audioSessionManager disableSessionManagement];
194
+ }
195
+
183
196
  #ifdef RCT_NEW_ARCH_ENABLED
184
197
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
185
198
  (const facebook::react::ObjCTurboModule::InitParams &)params
@@ -1,11 +1,8 @@
1
1
  #pragma once
2
2
 
3
- #ifdef __OBJC__ // when compiled as C++
3
+ #ifdef __OBJC__ // when compiled as Objective-C++
4
4
  #import <NativeAudioRecorder.h>
5
- #else
6
- typedef struct objc_object AVAudioFile;
7
- typedef struct objc_object NSURL;
8
- typedef struct objc_object AudioBufferList;
5
+ #else // when compiled as C++
9
6
  typedef struct objc_object NativeAudioRecorder;
10
7
  #endif // __OBJC__
11
8
 
@@ -15,27 +12,21 @@ namespace audioapi {
15
12
 
16
13
  class AudioBus;
17
14
  class CircularAudioArray;
18
- class IOSAudioFileWriter;
19
- class AudioEventHandlerRegistry;
20
15
 
21
16
  class IOSAudioRecorder : public AudioRecorder {
22
17
  public:
23
- IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
18
+ IOSAudioRecorder(
19
+ float sampleRate,
20
+ int bufferLength,
21
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
22
+
24
23
  ~IOSAudioRecorder() override;
25
24
 
26
25
  void start() override;
27
- std::string stop() override;
28
-
29
- void enableFileOutput(float sampleRate, size_t channelCount, size_t bitRate, size_t iosFlags, size_t androidFlags)
30
- override;
31
- void disableFileOutput() override;
32
-
33
- void pause() override;
34
- void resume() override;
26
+ void stop() override;
35
27
 
36
28
  private:
37
- std::shared_ptr<IOSAudioFileWriter> fileWriter_;
38
- NativeAudioRecorder *nativeRecorder_;
29
+ NativeAudioRecorder *audioRecorder_;
39
30
  };
40
31
 
41
32
  } // namespace audioapi
@@ -1,112 +1,70 @@
1
1
  #import <AVFoundation/AVFoundation.h>
2
- #import <Foundation/Foundation.h>
3
- #include <unordered_map>
4
2
 
5
3
  #include <audioapi/core/utils/Constants.h>
6
4
  #include <audioapi/dsp/VectorMath.h>
7
5
  #include <audioapi/events/AudioEventHandlerRegistry.h>
8
- #include <audioapi/ios/core/IOSAudioFileWriter.h>
9
6
  #include <audioapi/ios/core/IOSAudioRecorder.h>
10
7
  #include <audioapi/utils/AudioArray.h>
11
8
  #include <audioapi/utils/AudioBus.h>
12
9
  #include <audioapi/utils/CircularAudioArray.h>
13
10
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
11
+ #include <unordered_map>
14
12
 
15
13
  namespace audioapi {
16
14
 
17
- // AudioReceiverBlock audioReceiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
18
- // if (isRunning_.load()) {
19
- // auto *inputChannel = static_cast<float *>(inputBuffer->mBuffers[0].mData);
20
- // writeToBuffers(inputChannel, numFrames);
21
- // }
22
-
23
- // while (circularBuffer_->getNumberOfAvailableFrames() >= bufferLength_) {
24
- // auto bus = std::make_shared<AudioBus>(bufferLength_, 1, sampleRate_);
25
- // auto *outputChannel = bus->getChannel(0)->getData();
15
+ IOSAudioRecorder::IOSAudioRecorder(
16
+ float sampleRate,
17
+ int bufferLength,
18
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
19
+ : AudioRecorder(sampleRate, bufferLength, audioEventHandlerRegistry)
20
+ {
21
+ AudioReceiverBlock audioReceiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
22
+ if (isRunning_.load()) {
23
+ auto *inputChannel = static_cast<float *>(inputBuffer->mBuffers[0].mData);
24
+ writeToBuffers(inputChannel, numFrames);
25
+ }
26
26
 
27
- // circularBuffer_->pop_front(outputChannel, bufferLength_);
27
+ while (circularBuffer_->getNumberOfAvailableFrames() >= bufferLength_) {
28
+ auto bus = std::make_shared<AudioBus>(bufferLength_, 1, sampleRate_);
29
+ auto *outputChannel = bus->getChannel(0)->getData();
28
30
 
29
- // invokeOnAudioReadyCallback(bus, bufferLength_);
30
- // }
31
- // };
31
+ circularBuffer_->pop_front(outputChannel, bufferLength_);
32
32
 
33
- IOSAudioRecorder::IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
34
- : AudioRecorder(audioEventHandlerRegistry), fileWriter_(nullptr)
35
- {
36
- AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {
37
- if (usesFileOutput()) {
38
- fileWriter_->writeAudioData(inputBuffer, numFrames);
33
+ invokeOnAudioReadyCallback(bus, bufferLength_);
39
34
  }
40
35
  };
41
36
 
42
- nativeRecorder_ = [[NativeAudioRecorder alloc] initWithReceiverBlock:receiverBlock];
37
+ audioRecorder_ = [[NativeAudioRecorder alloc] initWithReceiverBlock:audioReceiverBlock
38
+ bufferLength:bufferLength
39
+ sampleRate:sampleRate];
43
40
  }
44
41
 
45
42
  IOSAudioRecorder::~IOSAudioRecorder()
46
43
  {
47
44
  stop();
48
- [nativeRecorder_ cleanup];
45
+ [audioRecorder_ cleanup];
49
46
  }
50
47
 
51
48
  void IOSAudioRecorder::start()
52
49
  {
53
- if (isRecording()) {
50
+ if (isRunning_.load()) {
54
51
  return;
55
52
  }
56
53
 
57
- if (usesFileOutput()) {
58
- fileWriter_->openFile([nativeRecorder_ getInputFormat]);
59
- }
60
-
61
- if (usesCallback()) {
62
- // TODO: create circular buffer and converter?
63
- }
64
-
65
- if (isConnected()) {
66
- // TODO: set adapter node properties?
67
- }
68
-
69
- [nativeRecorder_ start];
54
+ [audioRecorder_ start];
70
55
  isRunning_.store(true);
71
56
  }
72
57
 
73
- std::string IOSAudioRecorder::stop()
58
+ void IOSAudioRecorder::stop()
74
59
  {
75
- if (!isRecording()) {
76
- return std::string("");
60
+ if (!isRunning_.load()) {
61
+ return;
77
62
  }
78
63
 
79
- [nativeRecorder_ stop];
80
64
  isRunning_.store(false);
65
+ [audioRecorder_ stop];
81
66
 
82
- // TODO: send remaining data?
83
-
84
- if (usesFileOutput()) {
85
- return fileWriter_->closeFile();
86
- }
87
-
88
- return std::string("");
67
+ sendRemainingData();
89
68
  }
90
69
 
91
- void IOSAudioRecorder::enableFileOutput(
92
- float sampleRate,
93
- size_t channelCount,
94
- size_t bitRate,
95
- size_t iosFlags,
96
- size_t androidFlags)
97
- {
98
- fileOutputEnabled_.store(true);
99
- fileWriter_ = std::make_shared<IOSAudioFileWriter>(sampleRate, channelCount, bitRate, iosFlags);
100
- }
101
-
102
- void IOSAudioRecorder::disableFileOutput()
103
- {
104
- fileOutputEnabled_.store(false);
105
- fileWriter_ = nullptr;
106
- }
107
-
108
- void IOSAudioRecorder::pause() {}
109
-
110
- void IOSAudioRecorder::resume() {}
111
-
112
70
  } // namespace audioapi
@@ -14,9 +14,13 @@ typedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFr
14
14
  @property (nonatomic, copy) AVAudioSinkNodeReceiverBlock receiverSinkBlock;
15
15
  @property (nonatomic, copy) AudioReceiverBlock receiverBlock;
16
16
 
17
- - (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock;
17
+ @property (nonatomic, strong) AVAudioConverter *audioConverter;
18
+ @property (nonatomic, strong) AVAudioFormat *inputFormat;
19
+ @property (nonatomic, strong) AVAudioFormat *outputFormat;
18
20
 
19
- - (AVAudioFormat *)getInputFormat;
21
+ - (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
22
+ bufferLength:(int)bufferLength
23
+ sampleRate:(float)sampleRate;
20
24
 
21
25
  - (void)start;
22
26
 
@@ -5,18 +5,40 @@
5
5
  @implementation NativeAudioRecorder
6
6
 
7
7
  - (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock
8
+ bufferLength:(int)bufferLength
9
+ sampleRate:(float)sampleRate
8
10
  {
9
11
  if (self = [super init]) {
12
+ self.bufferLength = bufferLength;
13
+ self.sampleRate = sampleRate;
14
+
10
15
  self.receiverBlock = [receiverBlock copy];
11
16
 
17
+ float devicePrefferedSampleRate = [[AVAudioSession sharedInstance] sampleRate];
18
+
19
+ if (!devicePrefferedSampleRate) {
20
+ NSError *error;
21
+ devicePrefferedSampleRate = sampleRate;
22
+
23
+ [[AVAudioSession sharedInstance] setPreferredSampleRate:sampleRate error:&error];
24
+ }
25
+
26
+ self.inputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
27
+ sampleRate:devicePrefferedSampleRate
28
+ channels:1
29
+ interleaved:NO];
30
+ self.outputFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
31
+ sampleRate:sampleRate
32
+ channels:1
33
+ interleaved:NO];
34
+ self.audioConverter = [[AVAudioConverter alloc] initFromFormat:self.inputFormat toFormat:self.outputFormat];
35
+
12
36
  __weak typeof(self) weakSelf = self;
13
37
  self.receiverSinkBlock = ^OSStatus(
14
38
  const AudioTimeStamp *_Nonnull timestamp,
15
39
  AVAudioFrameCount frameCount,
16
40
  const AudioBufferList *_Nonnull inputData) {
17
- weakSelf.receiverBlock(inputData, frameCount);
18
-
19
- return kAudioServicesNoError;
41
+ return [weakSelf processAudioInput:inputData withFrameCount:frameCount atTimestamp:timestamp];
20
42
  };
21
43
 
22
44
  self.sinkNode = [[AVAudioSinkNode alloc] initWithReceiverBlock:self.receiverSinkBlock];
@@ -25,9 +47,55 @@
25
47
  return self;
26
48
  }
27
49
 
28
- - (AVAudioFormat *)getInputFormat
50
+ - (OSStatus)processAudioInput:(const AudioBufferList *)inputData
51
+ withFrameCount:(AVAudioFrameCount)frameCount
52
+ atTimestamp:(const AudioTimeStamp *)timestamp
29
53
  {
30
- return [AudioEngine.sharedInstance.audioEngine.inputNode inputFormatForBus:0];
54
+ float inputSampleRate = self.inputFormat.sampleRate;
55
+ float outputSampleRate = self.outputFormat.sampleRate;
56
+
57
+ if (inputSampleRate != outputSampleRate) {
58
+ AVAudioPCMBuffer *inputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.inputFormat
59
+ frameCapacity:frameCount];
60
+ memcpy(
61
+ inputBuffer.mutableAudioBufferList->mBuffers[0].mData,
62
+ inputData->mBuffers[0].mData,
63
+ inputData->mBuffers[0].mDataByteSize);
64
+ inputBuffer.frameLength = frameCount;
65
+
66
+ int outputFrameCount = frameCount * outputSampleRate / inputSampleRate;
67
+
68
+ AVAudioPCMBuffer *outputBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:self.audioConverter.outputFormat
69
+ frameCapacity:outputFrameCount];
70
+
71
+ NSError *error = nil;
72
+ AVAudioConverterInputBlock inputBlock =
73
+ ^AVAudioBuffer *_Nullable(AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)
74
+ {
75
+ *outStatus = AVAudioConverterInputStatus_HaveData;
76
+ return inputBuffer;
77
+ };
78
+
79
+ /// IMPORTANT: AVAudioConverter leaks memory without autorelease pool
80
+ /// more details here: https://github.com/poneciak57/AVAudioConverter-memory-leak-repro-electric-boogaloo
81
+ /// we can try to remove it in the future or refactor to reuse buffers to minimize allocations
82
+ @autoreleasepool {
83
+ [self.audioConverter convertToBuffer:outputBuffer error:&error withInputFromBlock:inputBlock];
84
+ }
85
+
86
+ if (error) {
87
+ NSLog(@"Error during audio conversion: %@", error.localizedDescription);
88
+ return kAudioServicesBadSpecifierSizeError;
89
+ }
90
+
91
+ self.receiverBlock(outputBuffer.audioBufferList, outputBuffer.frameLength);
92
+
93
+ return kAudioServicesNoError;
94
+ }
95
+
96
+ self.receiverBlock(inputData, frameCount);
97
+
98
+ return kAudioServicesNoError;
31
99
  }
32
100
 
33
101
  - (void)start