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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +13 -11
  2. package/RNAudioAPI.podspec +25 -18
  3. package/android/build.gradle +41 -5
  4. package/android/src/main/cpp/audioapi/CMakeLists.txt +6 -3
  5. package/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp +10 -16
  6. package/android/src/main/cpp/audioapi/android/OnLoad.cpp +1 -2
  7. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp +219 -84
  8. package/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h +24 -23
  9. package/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp +13 -20
  10. package/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h +14 -18
  11. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp +72 -89
  12. package/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h +12 -23
  13. package/android/src/main/cpp/audioapi/android/core/utils/AudioDecoder.cpp +47 -47
  14. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp +83 -0
  15. package/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h +22 -0
  16. package/android/src/main/cpp/audioapi/android/core/utils/MiniaudioImplementation.cpp +5 -0
  17. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp +379 -298
  18. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h +48 -91
  19. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp +48 -0
  20. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp +110 -0
  21. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h +34 -0
  22. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp +132 -104
  23. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h +8 -16
  24. package/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt +28 -1
  25. package/android/src/main/java/com/swmansion/audioapi/system/LockScreenManager.kt +28 -6
  26. package/android/src/main/java/com/swmansion/audioapi/system/MediaNotificationManager.kt +11 -0
  27. package/android/src/main/jniLibs/arm64-v8a/libavcodec.so +0 -0
  28. package/android/src/main/jniLibs/arm64-v8a/libavformat.so +0 -0
  29. package/android/src/main/jniLibs/arm64-v8a/libavutil.so +0 -0
  30. package/android/src/main/jniLibs/arm64-v8a/libswresample.so +0 -0
  31. package/android/src/main/jniLibs/armeabi-v7a/libavcodec.so +0 -0
  32. package/android/src/main/jniLibs/armeabi-v7a/libavformat.so +0 -0
  33. package/android/src/main/jniLibs/armeabi-v7a/libavutil.so +0 -0
  34. package/android/src/main/jniLibs/armeabi-v7a/libswresample.so +0 -0
  35. package/android/src/main/jniLibs/x86/libavcodec.so +0 -0
  36. package/android/src/main/jniLibs/x86/libavformat.so +0 -0
  37. package/android/src/main/jniLibs/x86/libavutil.so +0 -0
  38. package/android/src/main/jniLibs/x86/libswresample.so +0 -0
  39. package/android/src/main/jniLibs/x86_64/libavcodec.so +0 -0
  40. package/android/src/main/jniLibs/x86_64/libavformat.so +0 -0
  41. package/android/src/main/jniLibs/x86_64/libavutil.so +0 -0
  42. package/android/src/main/jniLibs/x86_64/libswresample.so +0 -0
  43. package/android/src/oldarch/NativeAudioAPIModuleSpec.java +4 -0
  44. package/common/cpp/audioapi/AudioAPIModuleInstaller.h +45 -70
  45. package/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp +20 -22
  46. package/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp +3 -4
  47. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp +6 -8
  48. package/common/cpp/audioapi/HostObjects/AudioParamHostObject.h +2 -2
  49. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp +102 -63
  50. package/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h +4 -1
  51. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp +25 -31
  52. package/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h +3 -3
  53. package/common/cpp/audioapi/HostObjects/WorkletNodeHostObject.h +1 -2
  54. package/common/cpp/audioapi/HostObjects/WorkletProcessingNodeHostObject.h +1 -2
  55. package/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp +10 -18
  56. package/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h +2 -3
  57. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp +18 -30
  58. package/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h +1 -2
  59. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp +50 -0
  60. package/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h +20 -0
  61. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp +27 -0
  62. package/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h +21 -0
  63. package/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp +2 -2
  64. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp +33 -0
  65. package/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h +20 -0
  66. package/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h +1 -2
  67. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp +2 -2
  68. package/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h +1 -2
  69. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp +6 -12
  70. package/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h +7 -7
  71. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp +98 -50
  72. package/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h +5 -2
  73. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp +27 -22
  74. package/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h +12 -10
  75. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp +17 -22
  76. package/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h +5 -7
  77. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp +25 -11
  78. package/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h +8 -8
  79. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp +19 -30
  80. package/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h +2 -4
  81. package/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp +7 -11
  82. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp +2 -2
  83. package/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h +1 -2
  84. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp +6 -8
  85. package/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h +1 -2
  86. package/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h +4 -5
  87. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.cpp +6 -2
  88. package/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h +5 -6
  89. package/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h +1 -2
  90. package/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp +39 -60
  91. package/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp +15 -30
  92. package/common/cpp/audioapi/core/AudioContext.cpp +23 -28
  93. package/common/cpp/audioapi/core/AudioContext.h +6 -3
  94. package/common/cpp/audioapi/core/AudioNode.cpp +17 -19
  95. package/common/cpp/audioapi/core/AudioNode.h +19 -8
  96. package/common/cpp/audioapi/core/AudioParam.cpp +68 -100
  97. package/common/cpp/audioapi/core/AudioParam.h +20 -12
  98. package/common/cpp/audioapi/core/BaseAudioContext.cpp +52 -34
  99. package/common/cpp/audioapi/core/BaseAudioContext.h +26 -14
  100. package/common/cpp/audioapi/core/OfflineAudioContext.cpp +12 -17
  101. package/common/cpp/audioapi/core/OfflineAudioContext.h +10 -5
  102. package/common/cpp/audioapi/core/analysis/AnalyserNode.cpp +13 -21
  103. package/common/cpp/audioapi/core/analysis/AnalyserNode.h +8 -6
  104. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp +1 -0
  105. package/common/cpp/audioapi/core/destinations/AudioDestinationNode.h +5 -3
  106. package/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp +84 -66
  107. package/common/cpp/audioapi/core/effects/BiquadFilterNode.h +39 -10
  108. package/common/cpp/audioapi/core/effects/ConvolverNode.cpp +201 -0
  109. package/common/cpp/audioapi/core/effects/ConvolverNode.h +64 -0
  110. package/common/cpp/audioapi/core/effects/DelayNode.cpp +101 -0
  111. package/common/cpp/audioapi/core/effects/DelayNode.h +39 -0
  112. package/common/cpp/audioapi/core/effects/GainNode.cpp +1 -0
  113. package/common/cpp/audioapi/core/effects/GainNode.h +3 -1
  114. package/common/cpp/audioapi/core/effects/IIRFilterNode.cpp +166 -0
  115. package/common/cpp/audioapi/core/effects/IIRFilterNode.h +74 -0
  116. package/common/cpp/audioapi/core/effects/PeriodicWave.cpp +22 -35
  117. package/common/cpp/audioapi/core/effects/PeriodicWave.h +4 -9
  118. package/common/cpp/audioapi/core/effects/StereoPannerNode.cpp +4 -5
  119. package/common/cpp/audioapi/core/effects/StereoPannerNode.h +4 -2
  120. package/common/cpp/audioapi/core/effects/WorkletNode.cpp +11 -13
  121. package/common/cpp/audioapi/core/effects/WorkletNode.h +15 -12
  122. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp +4 -4
  123. package/common/cpp/audioapi/core/effects/WorkletProcessingNode.h +15 -14
  124. package/common/cpp/audioapi/core/inputs/AudioRecorder.cpp +58 -36
  125. package/common/cpp/audioapi/core/inputs/AudioRecorder.h +41 -44
  126. package/common/cpp/audioapi/core/sources/AudioBuffer.cpp +4 -6
  127. package/common/cpp/audioapi/core/sources/AudioBuffer.h +4 -7
  128. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp +48 -57
  129. package/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h +37 -34
  130. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp +55 -17
  131. package/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h +35 -28
  132. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp +41 -49
  133. package/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h +8 -6
  134. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp +29 -24
  135. package/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h +6 -6
  136. package/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp +3 -4
  137. package/common/cpp/audioapi/core/sources/ConstantSourceNode.h +3 -1
  138. package/common/cpp/audioapi/core/sources/OscillatorNode.cpp +12 -23
  139. package/common/cpp/audioapi/core/sources/OscillatorNode.h +6 -4
  140. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp +43 -16
  141. package/common/cpp/audioapi/core/sources/RecorderAdapterNode.h +22 -17
  142. package/common/cpp/audioapi/core/sources/StreamerNode.cpp +104 -87
  143. package/common/cpp/audioapi/core/sources/StreamerNode.h +69 -33
  144. package/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp +5 -7
  145. package/common/cpp/audioapi/core/sources/WorkletSourceNode.h +15 -13
  146. package/common/cpp/audioapi/core/types/AudioFormat.h +1 -11
  147. package/common/cpp/audioapi/core/utils/AudioDecoder.h +15 -6
  148. package/common/cpp/audioapi/core/utils/AudioFileWriter.cpp +41 -0
  149. package/common/cpp/audioapi/core/utils/AudioFileWriter.h +43 -0
  150. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.cpp +5 -6
  151. package/common/cpp/audioapi/core/utils/AudioNodeDestructor.h +7 -10
  152. package/common/cpp/audioapi/core/utils/AudioNodeManager.cpp +17 -19
  153. package/common/cpp/audioapi/core/utils/AudioNodeManager.h +8 -11
  154. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.cpp +3 -3
  155. package/common/cpp/audioapi/core/utils/AudioParamEventQueue.h +5 -5
  156. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp +101 -0
  157. package/common/cpp/audioapi/core/utils/AudioRecorderCallback.h +51 -0
  158. package/common/cpp/audioapi/core/utils/AudioStretcher.cpp +6 -6
  159. package/common/cpp/audioapi/core/utils/Constants.h +7 -3
  160. package/common/cpp/audioapi/core/utils/ParamChangeEvent.cpp +1 -0
  161. package/common/cpp/audioapi/core/utils/ParamChangeEvent.h +9 -9
  162. package/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h +33 -34
  163. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp +17 -19
  164. package/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h +23 -19
  165. package/common/cpp/audioapi/dsp/AudioUtils.cpp +4 -10
  166. package/common/cpp/audioapi/dsp/AudioUtils.h +1 -1
  167. package/common/cpp/audioapi/dsp/Convolver.cpp +201 -0
  168. package/common/cpp/audioapi/dsp/Convolver.h +47 -0
  169. package/common/cpp/audioapi/dsp/FFT.cpp +1 -27
  170. package/common/cpp/audioapi/dsp/FFT.h +19 -3
  171. package/common/cpp/audioapi/dsp/VectorMath.cpp +24 -58
  172. package/common/cpp/audioapi/dsp/VectorMath.h +35 -8
  173. package/common/cpp/audioapi/dsp/Windows.cpp +4 -9
  174. package/common/cpp/audioapi/dsp/Windows.h +24 -23
  175. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp +12 -17
  176. package/common/cpp/audioapi/events/AudioEventHandlerRegistry.h +45 -40
  177. package/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h +15 -7
  178. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/avcodec.h +4 -4
  179. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec.h +1 -1
  180. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_desc.h +1 -1
  181. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_id.h +3 -1
  182. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/codec_par.h +2 -2
  183. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/defs.h +3 -0
  184. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/packet.h +1 -1
  185. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/smpte_436m.h +254 -0
  186. package/common/cpp/audioapi/external/ffmpeg_include/libavcodec/version.h +1 -1
  187. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/avformat.h +6 -6
  188. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version.h +2 -2
  189. package/common/cpp/audioapi/external/ffmpeg_include/libavformat/version_major.h +2 -0
  190. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avassert.h +5 -2
  191. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/avutil.h +2 -2
  192. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/channel_layout.h +2 -2
  193. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/csp.h +1 -1
  194. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/dict.h +1 -1
  195. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/ffversion.h +1 -1
  196. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/film_grain_params.h +1 -1
  197. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/frame.h +1 -1
  198. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hdr_dynamic_vivid_metadata.h +3 -3
  199. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext.h +1 -1
  200. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_opencl.h +1 -1
  201. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_qsv.h +0 -1
  202. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/hwcontext_vulkan.h +1 -1
  203. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/iamf.h +2 -2
  204. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/lfg.h +2 -2
  205. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/log.h +2 -2
  206. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/mathematics.h +1 -1
  207. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/opt.h +4 -4
  208. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rational.h +1 -1
  209. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/rc4.h +1 -1
  210. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/refstruct.h +1 -1
  211. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/spherical.h +6 -0
  212. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tdrdi.h +1 -1
  213. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/tx.h +1 -1
  214. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/version.h +3 -3
  215. package/common/cpp/audioapi/external/ffmpeg_include/libavutil/video_hint.h +1 -1
  216. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/swresample.h +1 -1
  217. package/common/cpp/audioapi/external/ffmpeg_include/libswresample/version.h +1 -1
  218. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/libavcodec +0 -0
  219. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/libavcodec +0 -0
  220. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/libavformat +0 -0
  221. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/libavformat +0 -0
  222. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/libavutil +0 -0
  223. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/libavutil +0 -0
  224. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/libswresample +0 -0
  225. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/libswresample +0 -0
  226. package/common/cpp/audioapi/jsi/AudioArrayBuffer.h +4 -5
  227. package/common/cpp/audioapi/jsi/JsiHostObject.cpp +11 -13
  228. package/common/cpp/audioapi/jsi/JsiHostObject.h +26 -33
  229. package/common/cpp/audioapi/jsi/JsiPromise.cpp +34 -67
  230. package/common/cpp/audioapi/jsi/JsiPromise.h +65 -26
  231. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp +7 -10
  232. package/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h +1 -3
  233. package/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp +4 -3
  234. package/common/cpp/audioapi/libs/ffmpeg/relinking.md +24 -0
  235. package/common/cpp/audioapi/utils/AlignedAllocator.hpp +50 -0
  236. package/common/cpp/audioapi/utils/AudioArray.cpp +3 -8
  237. package/common/cpp/audioapi/utils/AudioArray.h +3 -11
  238. package/common/cpp/audioapi/utils/AudioBus.cpp +79 -149
  239. package/common/cpp/audioapi/utils/AudioBus.h +17 -14
  240. package/common/cpp/audioapi/utils/AudioFileProperties.cpp +92 -0
  241. package/common/cpp/audioapi/utils/AudioFileProperties.h +76 -0
  242. package/common/cpp/audioapi/utils/CircularAudioArray.cpp +6 -18
  243. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp +6 -10
  244. package/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h +2 -2
  245. package/common/cpp/audioapi/utils/Result.hpp +286 -0
  246. package/common/cpp/audioapi/utils/ThreadPool.hpp +59 -1
  247. package/common/cpp/audioapi/utils/UnitConversion.h +9 -0
  248. package/common/cpp/test/CMakeLists.txt +20 -14
  249. package/common/cpp/test/src/AudioParamTest.cpp +4 -3
  250. package/common/cpp/test/src/AudioScheduledSourceTest.cpp +113 -0
  251. package/common/cpp/test/src/ConstantSourceTest.cpp +5 -7
  252. package/common/cpp/test/src/DelayTest.cpp +108 -0
  253. package/common/cpp/test/src/GainTest.cpp +4 -5
  254. package/common/cpp/test/src/IIRFilterTest.cpp +153 -0
  255. package/common/cpp/test/src/MockAudioEventHandlerRegistry.h +19 -11
  256. package/common/cpp/test/src/OscillatorTest.cpp +2 -1
  257. package/common/cpp/test/src/StereoPannerTest.cpp +6 -9
  258. package/common/cpp/test/src/biquad/BiquadFilterChromium.cpp +372 -0
  259. package/common/cpp/test/src/biquad/BiquadFilterChromium.h +65 -0
  260. package/common/cpp/test/src/biquad/BiquadFilterTest.cpp +272 -0
  261. package/common/cpp/test/src/biquad/BiquadFilterTest.h +47 -0
  262. package/ios/audioapi/ios/AudioAPIModule.h +2 -1
  263. package/ios/audioapi/ios/AudioAPIModule.mm +44 -20
  264. package/ios/audioapi/ios/core/IOSAudioPlayer.h +2 -2
  265. package/ios/audioapi/ios/core/IOSAudioPlayer.mm +7 -6
  266. package/ios/audioapi/ios/core/IOSAudioRecorder.h +26 -18
  267. package/ios/audioapi/ios/core/IOSAudioRecorder.mm +193 -53
  268. package/ios/audioapi/ios/core/NativeAudioPlayer.m +16 -13
  269. package/ios/audioapi/ios/core/NativeAudioRecorder.h +4 -0
  270. package/ios/audioapi/ios/core/NativeAudioRecorder.m +42 -7
  271. package/ios/audioapi/ios/core/utils/AudioDecoder.mm +21 -4
  272. package/ios/audioapi/ios/core/utils/FileOptions.h +31 -0
  273. package/ios/audioapi/ios/core/utils/FileOptions.mm +177 -0
  274. package/ios/audioapi/ios/core/{IOSAudioFileWriter.h → utils/IOSFileWriter.h} +16 -14
  275. package/ios/audioapi/ios/core/utils/IOSFileWriter.mm +224 -0
  276. package/ios/audioapi/ios/core/{IOSRecorderCallback.h → utils/IOSRecorderCallback.h} +7 -17
  277. package/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm +172 -0
  278. package/ios/audioapi/ios/system/AudioEngine.h +19 -16
  279. package/ios/audioapi/ios/system/AudioEngine.mm +101 -134
  280. package/ios/audioapi/ios/system/AudioSessionManager.h +25 -11
  281. package/ios/audioapi/ios/system/AudioSessionManager.mm +273 -202
  282. package/ios/audioapi/ios/system/LockScreenManager.mm +39 -23
  283. package/ios/audioapi/ios/system/NotificationManager.mm +37 -52
  284. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js +90 -0
  285. package/lib/commonjs/AudioAPIModule/AudioAPIModule.js.map +1 -0
  286. package/lib/commonjs/AudioAPIModule/globals.d.js +6 -0
  287. package/lib/commonjs/AudioAPIModule/globals.d.js.map +1 -0
  288. package/lib/commonjs/AudioAPIModule/index.js +14 -0
  289. package/lib/commonjs/AudioAPIModule/index.js.map +1 -0
  290. package/lib/commonjs/api.js +18 -12
  291. package/lib/commonjs/api.js.map +1 -1
  292. package/lib/commonjs/api.web.js +8 -0
  293. package/lib/commonjs/api.web.js.map +1 -1
  294. package/lib/commonjs/core/AudioBufferBaseSourceNode.js +3 -0
  295. package/lib/commonjs/core/AudioBufferBaseSourceNode.js.map +1 -1
  296. package/lib/commonjs/core/AudioBufferQueueSourceNode.js +5 -2
  297. package/lib/commonjs/core/AudioBufferQueueSourceNode.js.map +1 -1
  298. package/lib/commonjs/core/AudioContext.js +5 -8
  299. package/lib/commonjs/core/AudioContext.js.map +1 -1
  300. package/lib/commonjs/core/AudioNode.js +1 -1
  301. package/lib/commonjs/core/AudioNode.js.map +1 -1
  302. package/lib/commonjs/core/AudioParam.js +18 -11
  303. package/lib/commonjs/core/AudioParam.js.map +1 -1
  304. package/lib/commonjs/core/AudioRecorder.js +43 -55
  305. package/lib/commonjs/core/AudioRecorder.js.map +1 -1
  306. package/lib/commonjs/core/BaseAudioContext.js +61 -30
  307. package/lib/commonjs/core/BaseAudioContext.js.map +1 -1
  308. package/lib/commonjs/core/ConvolverNode.js +37 -0
  309. package/lib/commonjs/core/ConvolverNode.js.map +1 -0
  310. package/lib/commonjs/core/DelayNode.js +17 -0
  311. package/lib/commonjs/core/DelayNode.js.map +1 -0
  312. package/lib/commonjs/core/IIRFilterNode.js +19 -0
  313. package/lib/commonjs/core/IIRFilterNode.js.map +1 -0
  314. package/lib/commonjs/core/OfflineAudioContext.js +3 -6
  315. package/lib/commonjs/core/OfflineAudioContext.js.map +1 -1
  316. package/lib/commonjs/plugin/withAudioAPI.js +46 -0
  317. package/lib/commonjs/plugin/withAudioAPI.js.map +1 -1
  318. package/lib/commonjs/specs/NativeAudioAPIModule.js.map +1 -1
  319. package/lib/commonjs/system/AudioManager.js +4 -7
  320. package/lib/commonjs/system/AudioManager.js.map +1 -1
  321. package/lib/commonjs/types.js +16 -23
  322. package/lib/commonjs/types.js.map +1 -1
  323. package/lib/commonjs/utils/filePresets.js +43 -0
  324. package/lib/commonjs/utils/filePresets.js.map +1 -0
  325. package/lib/commonjs/utils/index.js +12 -27
  326. package/lib/commonjs/utils/index.js.map +1 -1
  327. package/lib/commonjs/web-core/AudioContext.js +21 -1
  328. package/lib/commonjs/web-core/AudioContext.js.map +1 -1
  329. package/lib/commonjs/web-core/ConvolverNode.js +40 -0
  330. package/lib/commonjs/web-core/ConvolverNode.js.map +1 -0
  331. package/lib/commonjs/web-core/ConvolverNodeOptions.js +6 -0
  332. package/lib/commonjs/web-core/ConvolverNodeOptions.js.map +1 -0
  333. package/lib/commonjs/web-core/DelayNode.js +17 -0
  334. package/lib/commonjs/web-core/DelayNode.js.map +1 -0
  335. package/lib/commonjs/web-core/IIRFilterNode.js +19 -0
  336. package/lib/commonjs/web-core/IIRFilterNode.js.map +1 -0
  337. package/lib/commonjs/web-core/OfflineAudioContext.js +20 -0
  338. package/lib/commonjs/web-core/OfflineAudioContext.js.map +1 -1
  339. package/lib/module/AudioAPIModule/AudioAPIModule.js +87 -0
  340. package/lib/module/AudioAPIModule/AudioAPIModule.js.map +1 -0
  341. package/lib/module/AudioAPIModule/globals.d.js +4 -0
  342. package/lib/module/AudioAPIModule/globals.d.js.map +1 -0
  343. package/lib/module/AudioAPIModule/index.js +4 -0
  344. package/lib/module/AudioAPIModule/index.js.map +1 -0
  345. package/lib/module/api.js +3 -12
  346. package/lib/module/api.js.map +1 -1
  347. package/lib/module/api.web.js +1 -0
  348. package/lib/module/api.web.js.map +1 -1
  349. package/lib/module/core/AudioBufferBaseSourceNode.js +3 -0
  350. package/lib/module/core/AudioBufferBaseSourceNode.js.map +1 -1
  351. package/lib/module/core/AudioBufferQueueSourceNode.js +5 -2
  352. package/lib/module/core/AudioBufferQueueSourceNode.js.map +1 -1
  353. package/lib/module/core/AudioContext.js +5 -8
  354. package/lib/module/core/AudioContext.js.map +1 -1
  355. package/lib/module/core/AudioNode.js +1 -1
  356. package/lib/module/core/AudioNode.js.map +1 -1
  357. package/lib/module/core/AudioParam.js +18 -11
  358. package/lib/module/core/AudioParam.js.map +1 -1
  359. package/lib/module/core/AudioRecorder.js +44 -56
  360. package/lib/module/core/AudioRecorder.js.map +1 -1
  361. package/lib/module/core/BaseAudioContext.js +63 -32
  362. package/lib/module/core/BaseAudioContext.js.map +1 -1
  363. package/lib/module/core/ConvolverNode.js +31 -0
  364. package/lib/module/core/ConvolverNode.js.map +1 -0
  365. package/lib/module/core/DelayNode.js +11 -0
  366. package/lib/module/core/DelayNode.js.map +1 -0
  367. package/lib/module/core/IIRFilterNode.js +13 -0
  368. package/lib/module/core/IIRFilterNode.js.map +1 -0
  369. package/lib/module/core/OfflineAudioContext.js +3 -6
  370. package/lib/module/core/OfflineAudioContext.js.map +1 -1
  371. package/lib/module/plugin/withAudioAPI.js +47 -1
  372. package/lib/module/plugin/withAudioAPI.js.map +1 -1
  373. package/lib/module/specs/NativeAudioAPIModule.js.map +1 -1
  374. package/lib/module/system/AudioManager.js +4 -7
  375. package/lib/module/system/AudioManager.js.map +1 -1
  376. package/lib/module/types.js +15 -22
  377. package/lib/module/types.js.map +1 -1
  378. package/lib/module/utils/filePresets.js +39 -0
  379. package/lib/module/utils/filePresets.js.map +1 -0
  380. package/lib/module/utils/index.js +10 -10
  381. package/lib/module/utils/index.js.map +1 -1
  382. package/lib/module/web-core/AudioContext.js +21 -1
  383. package/lib/module/web-core/AudioContext.js.map +1 -1
  384. package/lib/module/web-core/ConvolverNode.js +34 -0
  385. package/lib/module/web-core/ConvolverNode.js.map +1 -0
  386. package/lib/module/web-core/ConvolverNodeOptions.js +4 -0
  387. package/lib/module/web-core/ConvolverNodeOptions.js.map +1 -0
  388. package/lib/module/web-core/DelayNode.js +11 -0
  389. package/lib/module/web-core/DelayNode.js.map +1 -0
  390. package/lib/module/web-core/IIRFilterNode.js +13 -0
  391. package/lib/module/web-core/IIRFilterNode.js.map +1 -0
  392. package/lib/module/web-core/OfflineAudioContext.js +20 -0
  393. package/lib/module/web-core/OfflineAudioContext.js.map +1 -1
  394. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts +36 -0
  395. package/lib/typescript/AudioAPIModule/AudioAPIModule.d.ts.map +1 -0
  396. package/lib/typescript/AudioAPIModule/index.d.ts +2 -0
  397. package/lib/typescript/AudioAPIModule/index.d.ts.map +1 -0
  398. package/lib/typescript/api.d.ts +3 -9
  399. package/lib/typescript/api.d.ts.map +1 -1
  400. package/lib/typescript/api.web.d.ts +1 -0
  401. package/lib/typescript/api.web.d.ts.map +1 -1
  402. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts +1 -0
  403. package/lib/typescript/core/AudioBufferBaseSourceNode.d.ts.map +1 -1
  404. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts +1 -1
  405. package/lib/typescript/core/AudioBufferQueueSourceNode.d.ts.map +1 -1
  406. package/lib/typescript/core/AudioContext.d.ts +1 -1
  407. package/lib/typescript/core/AudioContext.d.ts.map +1 -1
  408. package/lib/typescript/core/AudioNode.d.ts +2 -1
  409. package/lib/typescript/core/AudioNode.d.ts.map +1 -1
  410. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  411. package/lib/typescript/core/AudioRecorder.d.ts +13 -6
  412. package/lib/typescript/core/AudioRecorder.d.ts.map +1 -1
  413. package/lib/typescript/core/BaseAudioContext.d.ts +9 -3
  414. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -1
  415. package/lib/typescript/core/ConvolverNode.d.ts +12 -0
  416. package/lib/typescript/core/ConvolverNode.d.ts.map +1 -0
  417. package/lib/typescript/core/DelayNode.d.ts +9 -0
  418. package/lib/typescript/core/DelayNode.d.ts.map +1 -0
  419. package/lib/typescript/core/IIRFilterNode.d.ts +5 -0
  420. package/lib/typescript/core/IIRFilterNode.d.ts.map +1 -0
  421. package/lib/typescript/core/OfflineAudioContext.d.ts +1 -1
  422. package/lib/typescript/core/OfflineAudioContext.d.ts.map +1 -1
  423. package/lib/typescript/events/types.d.ts +4 -0
  424. package/lib/typescript/events/types.d.ts.map +1 -1
  425. package/lib/typescript/interfaces.d.ts +34 -34
  426. package/lib/typescript/interfaces.d.ts.map +1 -1
  427. package/lib/typescript/plugin/withAudioAPI.d.ts +1 -0
  428. package/lib/typescript/plugin/withAudioAPI.d.ts.map +1 -1
  429. package/lib/typescript/specs/NativeAudioAPIModule.d.ts +2 -1
  430. package/lib/typescript/specs/NativeAudioAPIModule.d.ts.map +1 -1
  431. package/lib/typescript/system/AudioManager.d.ts +3 -2
  432. package/lib/typescript/system/AudioManager.d.ts.map +1 -1
  433. package/lib/typescript/types.d.ts +42 -34
  434. package/lib/typescript/types.d.ts.map +1 -1
  435. package/lib/typescript/utils/filePresets.d.ts +9 -0
  436. package/lib/typescript/utils/filePresets.d.ts.map +1 -0
  437. package/lib/typescript/utils/index.d.ts +1 -8
  438. package/lib/typescript/utils/index.d.ts.map +1 -1
  439. package/lib/typescript/web-core/AudioContext.d.ts +9 -2
  440. package/lib/typescript/web-core/AudioContext.d.ts.map +1 -1
  441. package/lib/typescript/web-core/BaseAudioContext.d.ts +7 -1
  442. package/lib/typescript/web-core/BaseAudioContext.d.ts.map +1 -1
  443. package/lib/typescript/web-core/ConvolverNode.d.ts +11 -0
  444. package/lib/typescript/web-core/ConvolverNode.d.ts.map +1 -0
  445. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts +6 -0
  446. package/lib/typescript/web-core/ConvolverNodeOptions.d.ts.map +1 -0
  447. package/lib/typescript/web-core/DelayNode.d.ts +8 -0
  448. package/lib/typescript/web-core/DelayNode.d.ts.map +1 -0
  449. package/lib/typescript/web-core/IIRFilterNode.d.ts +5 -0
  450. package/lib/typescript/web-core/IIRFilterNode.d.ts.map +1 -0
  451. package/lib/typescript/web-core/OfflineAudioContext.d.ts +8 -1
  452. package/lib/typescript/web-core/OfflineAudioContext.d.ts.map +1 -1
  453. package/package.json +11 -4
  454. package/scripts/download-prebuilt-binaries.sh +61 -0
  455. package/scripts/rnaa_utils.rb +8 -0
  456. package/scripts/validate-worklets-version.js +27 -0
  457. package/src/AudioAPIModule/AudioAPIModule.ts +122 -0
  458. package/src/AudioAPIModule/globals.d.ts +33 -0
  459. package/src/AudioAPIModule/index.ts +1 -0
  460. package/src/api.ts +4 -52
  461. package/src/api.web.ts +1 -0
  462. package/src/core/AudioBufferBaseSourceNode.ts +8 -0
  463. package/src/core/AudioBufferQueueSourceNode.ts +8 -2
  464. package/src/core/AudioContext.ts +5 -8
  465. package/src/core/AudioNode.ts +4 -3
  466. package/src/core/AudioParam.ts +18 -11
  467. package/src/core/AudioRecorder.ts +63 -78
  468. package/src/core/BaseAudioContext.ts +120 -54
  469. package/src/core/ConvolverNode.ts +35 -0
  470. package/src/core/DelayNode.ts +13 -0
  471. package/src/core/IIRFilterNode.ts +25 -0
  472. package/src/core/OfflineAudioContext.ts +4 -7
  473. package/src/events/types.ts +5 -0
  474. package/src/interfaces.ts +51 -34
  475. package/src/plugin/withAudioAPI.ts +61 -0
  476. package/src/specs/NativeAudioAPIModule.ts +3 -2
  477. package/src/system/AudioManager.ts +13 -19
  478. package/src/types.ts +45 -36
  479. package/src/utils/filePresets.ts +47 -0
  480. package/src/utils/index.ts +13 -19
  481. package/src/web-core/AudioContext.tsx +40 -1
  482. package/src/web-core/BaseAudioContext.tsx +11 -1
  483. package/src/web-core/ConvolverNode.tsx +43 -0
  484. package/src/web-core/ConvolverNodeOptions.tsx +6 -0
  485. package/src/web-core/DelayNode.tsx +12 -0
  486. package/src/web-core/IIRFilterNode.tsx +25 -0
  487. package/src/web-core/OfflineAudioContext.tsx +39 -0
  488. package/android/src/main/cpp/audioapi/android/core/utils/FileUtils.h +0 -34
  489. package/android/src/main/cpp/audioapi/android/core/utils/FileUtilts.cpp +0 -133
  490. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.cpp +0 -154
  491. package/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegAudioFileOptions.h +0 -41
  492. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.cpp +0 -47
  493. package/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileOptions.h +0 -28
  494. package/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md +0 -32
  495. package/common/cpp/audioapi/libs/ffmpeg/create_xcframework.sh +0 -111
  496. package/common/cpp/audioapi/libs/ffmpeg/ffmpeg_setup.sh +0 -391
  497. package/ios/audioapi/ios/core/IOSAudioFileOptions.h +0 -36
  498. package/ios/audioapi/ios/core/IOSAudioFileOptions.mm +0 -140
  499. package/ios/audioapi/ios/core/IOSAudioFileWriter.mm +0 -223
  500. package/ios/audioapi/ios/core/IOSRecorderCallback.mm +0 -189
  501. package/lib/commonjs/utils/bitEnums.js +0 -33
  502. package/lib/commonjs/utils/bitEnums.js.map +0 -1
  503. package/lib/module/utils/bitEnums.js +0 -27
  504. package/lib/module/utils/bitEnums.js.map +0 -1
  505. package/lib/typescript/utils/bitEnums.d.ts +0 -4
  506. package/lib/typescript/utils/bitEnums.d.ts.map +0 -1
  507. package/metro-config/index.d.ts +0 -5
  508. package/metro-config/index.js +0 -41
  509. package/metro-config/tsconfig.json +0 -3
  510. package/src/utils/bitEnums.ts +0 -51
  511. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/Info.plist +5 -5
  512. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64/libavcodec.framework/Info.plist +0 -0
  513. package/common/cpp/audioapi/external/{libavcodec.xcframework → ffmpeg_ios/libavcodec.xcframework}/ios-arm64_x86_64-simulator/libavcodec.framework/Info.plist +0 -0
  514. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/Info.plist +0 -0
  515. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64/libavformat.framework/Info.plist +0 -0
  516. package/common/cpp/audioapi/external/{libavformat.xcframework → ffmpeg_ios/libavformat.xcframework}/ios-arm64_x86_64-simulator/libavformat.framework/Info.plist +0 -0
  517. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/Info.plist +5 -5
  518. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64/libavutil.framework/Info.plist +0 -0
  519. package/common/cpp/audioapi/external/{libavutil.xcframework → ffmpeg_ios/libavutil.xcframework}/ios-arm64_x86_64-simulator/libavutil.framework/Info.plist +0 -0
  520. package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/Info.plist +5 -5
  521. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64/libswresample.framework/Info.plist +0 -0
  522. /package/common/cpp/audioapi/external/{libswresample.xcframework → ffmpeg_ios/libswresample.xcframework}/ios-arm64_x86_64-simulator/libswresample.framework/Info.plist +0 -0
@@ -6,31 +6,25 @@
6
6
  #include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>
7
7
  #include <audioapi/core/sources/RecorderAdapterNode.h>
8
8
  #include <audioapi/core/utils/Constants.h>
9
+ #include <audioapi/core/utils/Locker.h>
9
10
  #include <audioapi/events/AudioEventHandlerRegistry.h>
10
11
  #include <audioapi/utils/AudioArray.h>
11
12
  #include <audioapi/utils/AudioBus.h>
13
+ #include <audioapi/utils/AudioFileProperties.h>
12
14
  #include <audioapi/utils/CircularAudioArray.h>
13
15
  #include <audioapi/utils/CircularOverflowableAudioArray.h>
14
16
 
17
+ #include <memory>
18
+ #include <string>
19
+
15
20
  namespace audioapi {
16
21
 
17
22
  AndroidAudioRecorder::AndroidAudioRecorder(
18
23
  const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)
19
- : AudioRecorder(audioEventHandlerRegistry) {
20
- AudioStreamBuilder builder;
21
-
22
- builder.setSharingMode(SharingMode::Exclusive)
23
- ->setDirection(Direction::Input)
24
- ->setFormat(AudioFormat::Float)
25
- ->setFormatConversionAllowed(true)
26
- ->setPerformanceMode(PerformanceMode::None)
27
- ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)
28
- ->setDataCallback(this)
29
- ->openStream(mStream_);
30
-
31
- streamSampleRate_ = mStream_->getSampleRate();
32
- streamChannelCount_ = mStream_->getChannelCount();
33
- streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
24
+ : AudioRecorder(audioEventHandlerRegistry),
25
+ streamSampleRate_(0.0),
26
+ streamChannelCount_(0),
27
+ streamMaxBufferSizeInFrames_(0) {
34
28
  nativeAudioRecorder_ = jni::make_global(NativeAudioRecorder::create());
35
29
  }
36
30
 
@@ -44,97 +38,164 @@ AndroidAudioRecorder::~AndroidAudioRecorder() {
44
38
  }
45
39
  }
46
40
 
47
- std::string AndroidAudioRecorder::start() {
41
+ Result<NoneType, std::string> AndroidAudioRecorder::openAudioStream() {
42
+ if (mStream_) {
43
+ return Result<NoneType, std::string>::Ok(None);
44
+ }
45
+
46
+ oboe::AudioStreamBuilder builder;
47
+ builder.setSharingMode(oboe::SharingMode::Exclusive)
48
+ ->setDirection(oboe::Direction::Input)
49
+ ->setFormat(oboe::AudioFormat::Float)
50
+ ->setFormatConversionAllowed(true)
51
+ ->setPerformanceMode(oboe::PerformanceMode::None)
52
+ ->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)
53
+ ->setDataCallback(this)
54
+ ->setErrorCallback(this);
55
+
56
+ auto result = builder.openStream(mStream_);
57
+
58
+ if (result != oboe::Result::OK || mStream_ == nullptr) {
59
+ return Result<NoneType, std::string>::Err(
60
+ "Failed to open audio stream: " + std::string(oboe::convertToText(result)));
61
+ }
62
+
63
+ streamSampleRate_ = static_cast<float>(mStream_->getSampleRate());
64
+ streamChannelCount_ = mStream_->getChannelCount();
65
+ streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();
66
+
67
+ return Result<NoneType, std::string>::Ok(None);
68
+ }
69
+
70
+ Result<std::string, std::string> AndroidAudioRecorder::start() {
71
+ std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
72
+
48
73
  if (isRecording()) {
49
- return filePath_;
74
+ return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
75
+ }
76
+
77
+ auto streamResult = openAudioStream();
78
+
79
+ if (!streamResult.is_ok()) {
80
+ return Result<std::string, std::string>::Err(streamResult.unwrap_err());
50
81
  }
51
82
 
52
83
  if (!mStream_ || !nativeAudioRecorder_) {
53
- __android_log_print(
54
- ANDROID_LOG_ERROR,
55
- "AndroidAudioRecorder",
56
- "Audio stream is not initialized.\n");
57
- return filePath_;
84
+ return Result<std::string, std::string>::Err("Audio stream is not initialized.");
58
85
  }
59
86
 
60
87
  if (usesFileOutput()) {
61
- filePath_ = fileWriter_->openFile(
62
- streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
88
+ auto fileResult =
89
+ std::dynamic_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
90
+ ->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
91
+
92
+ if (!fileResult.is_ok()) {
93
+ return Result<std::string, std::string>::Err(
94
+ "Failed to open file for writing: " + fileResult.unwrap_err());
95
+ }
96
+
97
+ filePath_ = fileResult.unwrap();
63
98
  }
64
99
 
65
100
  if (usesCallback()) {
66
- // TODO: create circular buffer and converter?
67
- callback_->prepare(
68
- streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
101
+ std::dynamic_pointer_cast<AndroidRecorderCallback>(dataCallback_)
102
+ ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
69
103
  }
70
104
 
71
105
  if (isConnected()) {
72
- // TODO: set adapter node properties?
106
+ adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
73
107
  }
74
108
 
75
- nativeAudioRecorder_->start();
76
- mStream_->requestStart();
77
- state_.store(RecorderState::Recording);
109
+ auto result = mStream_->requestStart();
78
110
 
79
- return filePath_;
111
+ if (result != oboe::Result::OK) {
112
+ return Result<std::string, std::string>::Err(
113
+ "Failed to start stream: " + std::string(oboe::convertToText(result)));
114
+ }
115
+
116
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->start(); });
117
+
118
+ state_.store(RecorderState::Recording, std::memory_order_release);
119
+ return Result<std::string, std::string>::Ok(std::format("file://{}", filePath_));
80
120
  }
81
121
 
82
- std::tuple<std::string, double, double> AndroidAudioRecorder::stop() {
83
- std::string filePath = filePath_;
122
+ Result<std::tuple<std::string, double, double>, std::string> AndroidAudioRecorder::stop() {
123
+ std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);
124
+
125
+ std::string filePath = std::format("file://{}", filePath_);
84
126
  double outputFileSize = 0.0;
85
127
  double outputDuration = 0.0;
86
128
 
87
129
  if (!isRecording()) {
88
- return {filePath_, 0.0, 0.0};
130
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
131
+ "Recorder is not in recording state.");
89
132
  }
90
133
 
91
134
  if (!mStream_ || !nativeAudioRecorder_) {
92
- __android_log_print(
93
- ANDROID_LOG_ERROR,
94
- "AndroidAudioRecorder",
95
- "Audio stream is not initialized.\n");
96
- return {filePath_, 0.0, 0.0};
135
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
136
+ "Audio stream is not initialized.");
97
137
  }
98
138
 
99
- nativeAudioRecorder_->stop();
139
+ state_.store(RecorderState::Idle, std::memory_order_release);
140
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioRecorder_->stop(); });
100
141
  mStream_->requestStop();
101
- state_.store(RecorderState::Idle);
102
142
 
103
143
  if (usesFileOutput()) {
104
- auto [size, duration] = fileWriter_->closeFile();
105
- outputFileSize = size;
106
- outputDuration = duration;
144
+ auto fileResult = fileWriter_->closeFile();
145
+
146
+ if (!fileResult.is_ok()) {
147
+ return Result<std::tuple<std::string, double, double>, std::string>::Err(
148
+ "Failed to close file: " + fileResult.unwrap_err());
149
+ }
150
+
151
+ outputFileSize = std::get<0>(fileResult.unwrap());
152
+ outputDuration = std::get<1>(fileResult.unwrap());
107
153
  }
108
154
 
109
155
  if (usesCallback()) {
110
- callback_->cleanup();
156
+ dataCallback_->cleanup();
157
+ }
158
+
159
+ if (isConnected()) {
160
+ adapterNode_->cleanup();
111
161
  }
112
162
 
113
163
  filePath_ = "";
114
- return {filePath, outputFileSize, outputDuration};
164
+ return Result<std::tuple<std::string, double, double>, std::string>::Ok(
165
+ {filePath, outputFileSize, outputDuration});
115
166
  }
116
167
 
117
- void AndroidAudioRecorder::enableFileOutput(
118
- float sampleRate,
119
- size_t channelCount,
120
- size_t bitRate,
121
- size_t iosFlags,
122
- size_t androidFlags) {
123
- uint8_t format = static_cast<uint8_t>(androidFlags & 0xF);
124
-
125
- if (format == 1) {
126
- fileWriter_ = std::make_shared<MiniAudioFileWriter>(
127
- sampleRate, channelCount, bitRate, androidFlags);
168
+ Result<std::string, std::string> AndroidAudioRecorder::enableFileOutput(
169
+ std::shared_ptr<AudioFileProperties> properties) {
170
+ std::scoped_lock fileWriterLock(fileWriterMutex_);
171
+
172
+ if (properties->format == AudioFileProperties::Format::WAV) {
173
+ fileWriter_ = std::make_shared<MiniAudioFileWriter>(audioEventHandlerRegistry_, properties);
128
174
  } else {
129
- fileWriter_ = std::make_shared<FFmpegAudioFileWriter>(
130
- sampleRate, channelCount, bitRate, androidFlags);
175
+ fileWriter_ = std::make_shared<android::ffmpeg::FFmpegAudioFileWriter>(
176
+ audioEventHandlerRegistry_, properties);
131
177
  }
132
178
 
133
- fileOutputEnabled_.store(true);
179
+ if (!isIdle()) {
180
+ auto fileResult =
181
+ std::dynamic_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
182
+ ->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
183
+
184
+ if (!fileResult.is_ok()) {
185
+ return Result<std::string, std::string>::Err(
186
+ "Failed to open file for writing: " + fileResult.unwrap_err());
187
+ }
188
+
189
+ filePath_ = fileResult.unwrap();
190
+ }
191
+
192
+ fileOutputEnabled_.store(true, std::memory_order_release);
193
+ return Result<std::string, std::string>::Ok(filePath_);
134
194
  }
135
195
 
136
196
  void AndroidAudioRecorder::disableFileOutput() {
137
- fileOutputEnabled_.store(false);
197
+ std::scoped_lock fileWriterLock(fileWriterMutex_);
198
+ fileOutputEnabled_.store(false, std::memory_order_release);
138
199
  fileWriter_ = nullptr;
139
200
  }
140
201
 
@@ -144,7 +205,7 @@ void AndroidAudioRecorder::pause() {
144
205
  }
145
206
 
146
207
  mStream_->pause(0);
147
- state_.store(RecorderState::Paused);
208
+ state_.store(RecorderState::Paused, std::memory_order_release);
148
209
  }
149
210
 
150
211
  void AndroidAudioRecorder::resume() {
@@ -153,53 +214,127 @@ void AndroidAudioRecorder::resume() {
153
214
  }
154
215
 
155
216
  mStream_->start(0);
156
- state_.store(RecorderState::Recording);
217
+ state_.store(RecorderState::Recording, std::memory_order_release);
157
218
  }
158
219
 
159
- void AndroidAudioRecorder::setOnAudioReadyCallback(
220
+ Result<NoneType, std::string> AndroidAudioRecorder::setOnAudioReadyCallback(
160
221
  float sampleRate,
161
222
  size_t bufferLength,
162
- size_t channelCount,
223
+ int channelCount,
163
224
  uint64_t callbackId) {
164
- callback_ = std::make_shared<AndroidRecorderCallback>(
165
- audioEventHandlerRegistry_,
166
- sampleRate,
167
- bufferLength,
168
- channelCount,
169
- callbackId);
170
- callbackOutputEnabled_.store(true);
225
+ std::scoped_lock callbackLock(callbackMutex_);
226
+ dataCallback_ = std::make_shared<AndroidRecorderCallback>(
227
+ audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);
228
+
229
+ if (!isIdle()) {
230
+ std::dynamic_pointer_cast<AndroidRecorderCallback>(dataCallback_)
231
+ ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);
232
+ }
233
+
234
+ callbackOutputEnabled_.store(true, std::memory_order_release);
235
+
236
+ return Result<NoneType, std::string>::Ok(None);
171
237
  }
172
238
 
173
239
  void AndroidAudioRecorder::clearOnAudioReadyCallback() {
174
- callbackOutputEnabled_.store(false);
175
- callback_ = nullptr;
240
+ std::scoped_lock callbackLock(callbackMutex_);
241
+ callbackOutputEnabled_.store(false, std::memory_order_release);
242
+ dataCallback_ = nullptr;
176
243
  }
177
244
 
178
- DataCallbackResult AndroidAudioRecorder::onAudioReady(
245
+ void AndroidAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node) {
246
+ std::scoped_lock adapterLock(adapterNodeMutex_);
247
+ adapterNode_ = node;
248
+ deinterleavingBuffer_ = std::make_shared<AudioArray>(streamMaxBufferSizeInFrames_);
249
+
250
+ if (!isIdle()) {
251
+ adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_);
252
+ }
253
+
254
+ isConnected_.store(true, std::memory_order_release);
255
+ }
256
+
257
+ void AndroidAudioRecorder::disconnect() {
258
+ std::scoped_lock adapterLock(adapterNodeMutex_);
259
+ isConnected_.store(false, std::memory_order_release);
260
+ deinterleavingBuffer_ = nullptr;
261
+ adapterNode_ = nullptr;
262
+ }
263
+
264
+ oboe::DataCallbackResult AndroidAudioRecorder::onAudioReady(
179
265
  oboe::AudioStream *oboeStream,
180
266
  void *audioData,
181
267
  int32_t numFrames) {
182
268
  if (isPaused()) {
183
- return DataCallbackResult::Continue;
269
+ return oboe::DataCallbackResult::Continue;
184
270
  }
185
271
 
186
272
  if (usesFileOutput()) {
187
- fileWriter_->writeAudioData(audioData, numFrames);
273
+ if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {
274
+ std::dynamic_pointer_cast<AndroidFileWriterBackend>(fileWriter_)
275
+ ->writeAudioData(audioData, numFrames);
276
+ }
188
277
  }
189
278
 
190
279
  if (usesCallback()) {
191
- callback_->receiveAudioData(audioData, numFrames);
280
+ if (auto callbackLock = Locker::tryLock(callbackMutex_)) {
281
+ std::dynamic_pointer_cast<AndroidRecorderCallback>(dataCallback_)
282
+ ->receiveAudioData(audioData, numFrames);
283
+ }
284
+ }
285
+
286
+ if (isConnected()) {
287
+ if (auto adapterLock = Locker::tryLock(adapterNodeMutex_)) {
288
+ for (int channel = 0; channel < streamChannelCount_; ++channel) {
289
+ for (int frame = 0; frame < numFrames; ++frame) {
290
+ deinterleavingBuffer_->getData()[frame] =
291
+ static_cast<float *>(audioData)[frame * streamChannelCount_ + channel];
292
+ }
293
+
294
+ adapterNode_->buff_[channel]->write(deinterleavingBuffer_->getData(), numFrames);
295
+ }
296
+ }
192
297
  }
193
298
 
194
- return DataCallbackResult::Continue;
299
+ return oboe::DataCallbackResult::Continue;
195
300
  }
196
301
 
197
- double AndroidAudioRecorder::getCurrentDuration() const {
198
- if (usesFileOutput()) {
199
- return fileWriter_->getCurrentDuration();
302
+ bool AndroidAudioRecorder::isRecording() const {
303
+ return state_.load(std::memory_order_acquire) == RecorderState::Recording &&
304
+ mStream_->getState() == oboe::StreamState::Started;
305
+ }
306
+
307
+ bool AndroidAudioRecorder::isPaused() const {
308
+ return state_.load(std::memory_order_acquire) == RecorderState::Paused;
309
+ }
310
+
311
+ bool AndroidAudioRecorder::isIdle() const {
312
+ return state_.load(std::memory_order_acquire) == RecorderState::Idle;
313
+ }
314
+
315
+ void AndroidAudioRecorder::cleanup() {
316
+ state_.store(RecorderState::Idle, std::memory_order_release);
317
+
318
+ if (mStream_) {
319
+ mStream_->close();
320
+ mStream_.reset();
200
321
  }
322
+ }
201
323
 
202
- return 0.0;
324
+ void AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
325
+ if (error == oboe::Result::ErrorDisconnected) {
326
+ cleanup();
327
+
328
+ auto streamResult = openAudioStream();
329
+
330
+ if (!streamResult.is_ok()) {
331
+ // TODO: call error callback
332
+ return;
333
+ }
334
+
335
+ mStream_->requestStart();
336
+ state_.store(RecorderState::Recording, std::memory_order_release);
337
+ }
203
338
  }
204
339
 
205
340
  } // namespace audioapi
@@ -1,67 +1,68 @@
1
1
  #pragma once
2
2
 
3
3
  #include <audioapi/core/inputs/AudioRecorder.h>
4
-
5
4
  #include <oboe/Oboe.h>
6
5
  #include <functional>
7
6
  #include <memory>
8
7
  #include <string>
9
8
  #include <tuple>
10
-
9
+ #include <mutex>
10
+ #include <audioapi/utils/Result.hpp>
11
11
  #include <audioapi/android/core/NativeAudioRecorder.hpp>
12
12
 
13
13
  namespace audioapi {
14
14
 
15
- using namespace oboe;
16
-
17
15
  class AudioBus;
16
+ class AudioArray;
18
17
  class CircularAudioArray;
18
+ class AudioFileProperties;
19
19
  class AndroidRecorderCallback;
20
20
  class AndroidFileWriterBackend;
21
21
  class AudioEventHandlerRegistry;
22
22
 
23
- class AndroidAudioRecorder : public AudioStreamDataCallback, public AudioRecorder {
23
+ class AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {
24
24
  public:
25
25
  explicit AndroidAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);
26
26
  ~AndroidAudioRecorder() override;
27
+ void cleanup();
27
28
 
28
- std::string start() override;
29
- std::tuple<std::string, double, double> stop() override;
29
+ Result<std::string, std::string> start() override;
30
+ Result<std::tuple<std::string, double, double>, std::string> stop() override;
30
31
 
31
- void enableFileOutput(
32
- float sampleRate,
33
- size_t channelCount,
34
- size_t bitRate,
35
- size_t iosFlags,
36
- size_t androidFlags) override;
32
+ Result<std::string, std::string> enableFileOutput(std::shared_ptr<AudioFileProperties> properties) override;
37
33
  void disableFileOutput() override;
38
34
 
39
35
  void pause() override;
40
36
  void resume() override;
37
+ bool isRecording() const override;
38
+ bool isPaused() const override;
39
+ bool isIdle() const override;
41
40
 
42
- void setOnAudioReadyCallback(float sampleRate, size_t bufferLength, size_t channelCount, uint64_t callbackId)
41
+ Result<NoneType, std::string> setOnAudioReadyCallback(float sampleRate, size_t bufferLength, int channelCount, uint64_t callbackId)
43
42
  override;
44
43
  void clearOnAudioReadyCallback() override;
45
44
 
46
- double getCurrentDuration() const override;
45
+ void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;
46
+ void disconnect() override;
47
47
 
48
- DataCallbackResult onAudioReady(
49
- AudioStream *oboeStream,
48
+ oboe::DataCallbackResult onAudioReady(
49
+ oboe::AudioStream *oboeStream,
50
50
  void *audioData,
51
51
  int32_t numFrames) override;
52
+ void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;
52
53
 
53
54
  private:
54
- std::string filePath_;
55
- std::shared_ptr<AudioStream> mStream_;
55
+ std::string filePath_{""};
56
+ std::shared_ptr<AudioArray> deinterleavingBuffer_;
56
57
 
57
- std::shared_ptr<AndroidFileWriterBackend> fileWriter_;
58
- std::shared_ptr<AndroidRecorderCallback> callback_;
59
-
60
- int32_t streamSampleRate_;
58
+ float streamSampleRate_;
61
59
  int32_t streamChannelCount_;
62
60
  int32_t streamMaxBufferSizeInFrames_;
63
61
 
64
62
  facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;
63
+
64
+ std::shared_ptr<oboe::AudioStream> mStream_;
65
+ Result<NoneType, std::string> openAudioStream();
65
66
  };
66
67
 
67
68
  } // namespace audioapi
@@ -4,6 +4,10 @@
4
4
  #include <audioapi/core/utils/Constants.h>
5
5
  #include <audioapi/utils/AudioArray.h>
6
6
  #include <audioapi/utils/AudioBus.h>
7
+ #include <jni.h>
8
+
9
+ #include <algorithm>
10
+ #include <memory>
7
11
 
8
12
  namespace audioapi {
9
13
 
@@ -11,9 +15,7 @@ AudioPlayer::AudioPlayer(
11
15
  const std::function<void(std::shared_ptr<AudioBus>, int)> &renderAudio,
12
16
  float sampleRate,
13
17
  int channelCount)
14
- : renderAudio_(renderAudio),
15
- sampleRate_(sampleRate),
16
- channelCount_(channelCount) {
18
+ : renderAudio_(renderAudio), sampleRate_(sampleRate), channelCount_(channelCount) {
17
19
  isInitialized_ = openAudioStream();
18
20
 
19
21
  nativeAudioPlayer_ = jni::make_global(NativeAudioPlayer::create());
@@ -35,21 +37,17 @@ bool AudioPlayer::openAudioStream() {
35
37
  auto result = builder.openStream(mStream_);
36
38
  if (result != oboe::Result::OK || mStream_ == nullptr) {
37
39
  __android_log_print(
38
- ANDROID_LOG_ERROR,
39
- "AudioPlayer",
40
- "Failed to open stream: %s",
41
- oboe::convertToText(result));
40
+ ANDROID_LOG_ERROR, "AudioPlayer", "Failed to open stream: %s", oboe::convertToText(result));
42
41
  return false;
43
42
  }
44
43
 
45
- mBus_ = std::make_shared<AudioBus>(
46
- RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
44
+ mBus_ = std::make_shared<AudioBus>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);
47
45
  return true;
48
46
  }
49
47
 
50
48
  bool AudioPlayer::start() {
51
49
  if (mStream_) {
52
- nativeAudioPlayer_->start();
50
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->start(); });
53
51
  auto result = mStream_->requestStart();
54
52
  return result == oboe::Result::OK;
55
53
  }
@@ -59,7 +57,7 @@ bool AudioPlayer::start() {
59
57
 
60
58
  void AudioPlayer::stop() {
61
59
  if (mStream_) {
62
- nativeAudioPlayer_->stop();
60
+ jni::ThreadScope::WithClassLoader([this]() { nativeAudioPlayer_->stop(); });
63
61
  mStream_->requestStop();
64
62
  }
65
63
  }
@@ -92,10 +90,8 @@ bool AudioPlayer::isRunning() const {
92
90
  return mStream_ && mStream_->getState() == oboe::StreamState::Started;
93
91
  }
94
92
 
95
- DataCallbackResult AudioPlayer::onAudioReady(
96
- AudioStream *oboeStream,
97
- void *audioData,
98
- int32_t numFrames) {
93
+ DataCallbackResult
94
+ AudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {
99
95
  if (!isInitialized_) {
100
96
  return DataCallbackResult::Continue;
101
97
  }
@@ -106,8 +102,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
106
102
  assert(buffer != nullptr);
107
103
 
108
104
  while (processedFrames < numFrames) {
109
- int framesToProcess =
110
- std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
105
+ int framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);
111
106
  renderAudio_(mBus_, framesToProcess);
112
107
 
113
108
  // TODO: optimize this with SIMD?
@@ -124,9 +119,7 @@ DataCallbackResult AudioPlayer::onAudioReady(
124
119
  return DataCallbackResult::Continue;
125
120
  }
126
121
 
127
- void AudioPlayer::onErrorAfterClose(
128
- oboe::AudioStream *stream,
129
- oboe::Result error) {
122
+ void AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {
130
123
  if (error == oboe::Result::ErrorDisconnected) {
131
124
  cleanup();
132
125
  if (openAudioStream()) {
@@ -1,37 +1,33 @@
1
1
  #pragma once
2
2
 
3
+ #include <audioapi/core/utils/AudioFileWriter.h>
3
4
  #include <tuple>
4
5
  #include <string>
5
6
  #include <memory>
7
+ #include <audioapi/utils/Result.hpp>
6
8
 
7
9
  namespace audioapi {
8
10
 
9
- class AndroidFileWriterBackend {
10
- public:
11
- AndroidFileWriterBackend(
12
- float sampleRate,
13
- size_t channelCount,
14
- size_t bitRate,
15
- size_t androidFlags) {}
16
-
17
- virtual ~AndroidFileWriterBackend() = default;
11
+ class AudioFileProperties;
18
12
 
19
- virtual std::string openFile(int32_t streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) = 0;
20
- virtual std::tuple<double, double> closeFile() = 0;
13
+ class AndroidFileWriterBackend : public AudioFileWriter {
14
+ public:
15
+ explicit AndroidFileWriterBackend(
16
+ const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,
17
+ const std::shared_ptr<AudioFileProperties> &fileProperties)
18
+ : AudioFileWriter(audioEventHandlerRegistry, fileProperties) {}
21
19
 
20
+ virtual OpenFileResult openFile(float streamSampleRate, int32_t streamChannelCount, int32_t streamMaxBufferSize) = 0;
22
21
  virtual bool writeAudioData(void *data, int numFrames) = 0;
23
22
 
24
- std::string getFilePath() const { return filePath_; }
25
-
26
- double getCurrentDuration() const { return static_cast<double>(framesWritten_.load()) / streamSampleRate_; }
23
+ std::string getFilePath() const override { return filePath_; }
24
+ double getCurrentDuration() const override { return static_cast<double>(framesWritten_.load(std::memory_order_acquire)) / streamSampleRate_; }
27
25
 
28
26
  protected:
29
- std::string filePath_{""};
30
- std::atomic<size_t> framesWritten_{0};
31
-
32
- int32_t streamSampleRate_{0};
27
+ float streamSampleRate_{0};
33
28
  int32_t streamChannelCount_{0};
34
29
  int32_t streamMaxBufferSize_{0};
30
+ std::string filePath_{""};
35
31
  };
36
32
 
37
33
  } // namespace audioapi