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

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