react-native-audio-api 0.3.0-rc2 → 0.3.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 (197) hide show
  1. package/RNAudioAPI.podspec +40 -29
  2. package/android/CMakeLists.txt +17 -21
  3. package/android/build.gradle +26 -9
  4. package/android/src/main/cpp/OnLoad.cpp +1 -1
  5. package/android/src/main/cpp/core/AudioAPIInstaller.cpp +37 -0
  6. package/android/src/main/cpp/{AudioAPIInstaller → core}/AudioAPIInstaller.h +5 -16
  7. package/android/src/main/cpp/{AudioDecoder → core}/AudioDecoder.cpp +0 -8
  8. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +2 -0
  9. package/android/src/main/java/com/swmansion/audioapi/nativemodules/AudioAPIModule.kt +6 -4
  10. package/common/cpp/HostObjects/AudioAPIInstallerHostObject.h +48 -0
  11. package/common/cpp/HostObjects/AudioBufferHostObject.h +79 -13
  12. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.h +93 -14
  13. package/common/cpp/HostObjects/AudioContextHostObject.h +10 -21
  14. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.h +3 -16
  15. package/common/cpp/HostObjects/AudioNodeHostObject.h +48 -11
  16. package/common/cpp/HostObjects/AudioParamHostObject.h +93 -14
  17. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.h +23 -16
  18. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +131 -14
  19. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.h +76 -18
  20. package/common/cpp/HostObjects/GainNodeHostObject.h +10 -15
  21. package/common/cpp/HostObjects/OscillatorNodeHostObject.h +40 -17
  22. package/common/cpp/HostObjects/PeriodicWaveHostObject.h +4 -17
  23. package/common/cpp/HostObjects/StereoPannerNodeHostObject.h +10 -17
  24. package/common/cpp/core/AudioBufferSourceNode.cpp +181 -73
  25. package/common/cpp/core/AudioBufferSourceNode.h +41 -1
  26. package/{android/src/main/cpp/AudioDecoder → common/cpp/core}/AudioDecoder.h +1 -3
  27. package/common/cpp/core/AudioDestinationNode.h +1 -1
  28. package/common/cpp/core/AudioParam.cpp +218 -58
  29. package/common/cpp/core/AudioParam.h +19 -15
  30. package/common/cpp/core/AudioScheduledSourceNode.cpp +94 -21
  31. package/common/cpp/core/AudioScheduledSourceNode.h +16 -5
  32. package/common/cpp/core/BaseAudioContext.cpp +3 -13
  33. package/common/cpp/core/BaseAudioContext.h +2 -4
  34. package/common/cpp/core/BiquadFilterNode.cpp +5 -7
  35. package/common/cpp/{HostObjects → core}/Constants.h +2 -2
  36. package/common/cpp/core/GainNode.cpp +1 -1
  37. package/common/cpp/core/OscillatorNode.cpp +11 -5
  38. package/common/cpp/core/ParamChangeEvent.cpp +58 -0
  39. package/common/cpp/core/{ParamChange.h → ParamChangeEvent.h} +11 -5
  40. package/common/cpp/core/StereoPannerNode.cpp +1 -1
  41. package/common/cpp/jsi/JsiHostObject.cpp +90 -0
  42. package/common/cpp/jsi/JsiHostObject.h +100 -0
  43. package/common/cpp/{utils → jsi}/JsiPromise.cpp +10 -9
  44. package/common/cpp/jsi/JsiPromise.h +48 -0
  45. package/common/cpp/jsi/RuntimeAwareCache.h +57 -0
  46. package/common/cpp/jsi/RuntimeLifecycleMonitor.cpp +61 -0
  47. package/common/cpp/jsi/RuntimeLifecycleMonitor.h +32 -0
  48. package/common/cpp/types/BiquadFilterType.h +0 -4
  49. package/common/cpp/types/ChannelCountMode.h +0 -3
  50. package/common/cpp/types/ChannelInterpretation.h +0 -3
  51. package/common/cpp/types/ContextState.h +0 -3
  52. package/common/cpp/types/OscillatorType.h +0 -4
  53. package/common/cpp/types/ParamChangeEventType.h +13 -0
  54. package/common/cpp/utils/AudioUtils.cpp +26 -0
  55. package/common/cpp/utils/AudioUtils.h +12 -0
  56. package/common/cpp/utils/{ios/FFTFrame.cpp → FFTFrame.cpp} +30 -3
  57. package/common/cpp/utils/VectorMath.h +7 -33
  58. package/ios/AudioAPIModule.h +4 -12
  59. package/ios/AudioAPIModule.mm +26 -25
  60. package/ios/core/AudioDecoder.mm +45 -0
  61. package/ios/{AudioPlayer → core}/AudioPlayer.m +2 -1
  62. package/lib/module/core/AudioBuffer.js +3 -1
  63. package/lib/module/core/AudioBuffer.js.map +1 -1
  64. package/lib/module/core/AudioBufferSourceNode.js +19 -2
  65. package/lib/module/core/AudioBufferSourceNode.js.map +1 -1
  66. package/lib/module/core/AudioContext.js +3 -1
  67. package/lib/module/core/AudioContext.js.map +1 -1
  68. package/lib/module/core/AudioDestinationNode.js +4 -6
  69. package/lib/module/core/AudioDestinationNode.js.map +1 -1
  70. package/lib/module/core/AudioNode.js +3 -1
  71. package/lib/module/core/AudioNode.js.map +1 -1
  72. package/lib/module/core/AudioParam.js +27 -1
  73. package/lib/module/core/AudioParam.js.map +1 -1
  74. package/lib/module/core/AudioScheduledSourceNode.js +4 -5
  75. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -1
  76. package/lib/module/core/BaseAudioContext.js +11 -9
  77. package/lib/module/core/BaseAudioContext.js.map +1 -1
  78. package/lib/module/core/BiquadFilterNode.js +5 -3
  79. package/lib/module/core/BiquadFilterNode.js.map +1 -1
  80. package/lib/module/core/GainNode.js +4 -2
  81. package/lib/module/core/GainNode.js.map +1 -1
  82. package/lib/module/core/OscillatorNode.js +5 -3
  83. package/lib/module/core/OscillatorNode.js.map +1 -1
  84. package/lib/module/core/PeriodicWave.js +2 -0
  85. package/lib/module/core/PeriodicWave.js.map +1 -1
  86. package/lib/module/core/StereoPannerNode.js +4 -2
  87. package/lib/module/core/StereoPannerNode.js.map +1 -1
  88. package/lib/module/core/types.js +1 -1
  89. package/lib/module/errors/IndexSizeError.js +2 -0
  90. package/lib/module/errors/IndexSizeError.js.map +1 -1
  91. package/lib/module/errors/InvalidAccessError.js +2 -0
  92. package/lib/module/errors/InvalidAccessError.js.map +1 -1
  93. package/lib/module/errors/InvalidStateError.js +2 -0
  94. package/lib/module/errors/InvalidStateError.js.map +1 -1
  95. package/lib/module/errors/RangeError.js +2 -0
  96. package/lib/module/errors/RangeError.js.map +1 -1
  97. package/lib/module/errors/index.js +6 -4
  98. package/lib/module/errors/index.js.map +1 -1
  99. package/lib/module/index.js +35 -10
  100. package/lib/module/index.js.map +1 -1
  101. package/lib/module/index.native.js +16 -14
  102. package/lib/module/index.native.js.map +1 -1
  103. package/lib/module/interfaces.js +2 -0
  104. package/lib/module/specs/global.d.js +4 -0
  105. package/lib/module/{modules → specs}/global.d.js.map +1 -1
  106. package/lib/module/{utils → specs}/install.js +5 -9
  107. package/lib/module/specs/install.js.map +1 -0
  108. package/lib/typescript/core/AudioBuffer.d.ts +2 -0
  109. package/lib/typescript/core/AudioBuffer.d.ts.map +1 -1
  110. package/lib/typescript/core/AudioBufferSourceNode.d.ts +7 -0
  111. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -1
  112. package/lib/typescript/core/AudioDestinationNode.d.ts +0 -3
  113. package/lib/typescript/core/AudioDestinationNode.d.ts.map +1 -1
  114. package/lib/typescript/core/AudioParam.d.ts +4 -0
  115. package/lib/typescript/core/AudioParam.d.ts.map +1 -1
  116. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +0 -3
  117. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -1
  118. package/lib/typescript/core/PeriodicWave.d.ts +2 -0
  119. package/lib/typescript/core/PeriodicWave.d.ts.map +1 -1
  120. package/lib/typescript/index.d.ts +13 -3
  121. package/lib/typescript/index.d.ts.map +1 -1
  122. package/lib/typescript/interfaces.d.ts +8 -0
  123. package/lib/typescript/interfaces.d.ts.map +1 -1
  124. package/lib/typescript/{utils → specs}/install.d.ts.map +1 -1
  125. package/metro-config/index.d.ts +5 -0
  126. package/metro-config/index.js +41 -0
  127. package/metro-config/tsconfig.json +3 -0
  128. package/package.json +50 -16
  129. package/scripts/audioapi_utils.rb +56 -0
  130. package/src/core/AudioBufferSourceNode.ts +23 -0
  131. package/src/core/AudioDestinationNode.ts +1 -7
  132. package/src/core/AudioParam.ts +48 -0
  133. package/src/core/AudioScheduledSourceNode.ts +0 -5
  134. package/src/index.native.ts +1 -1
  135. package/src/index.ts +54 -13
  136. package/src/interfaces.ts +17 -0
  137. package/src/{modules → specs}/global.d.ts +2 -0
  138. package/src/{utils → specs}/install.ts +4 -11
  139. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.cpp +0 -26
  140. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.cpp +0 -58
  141. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.h +0 -51
  142. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerWrapper.h +0 -38
  143. package/common/cpp/AudioAPIInstaller/android/AudioAPIInstallerWrapper.cpp +0 -16
  144. package/common/cpp/AudioAPIInstaller/ios/AudioAPIInstallerWrapper.cpp +0 -12
  145. package/common/cpp/HostObjects/AudioBufferHostObject.cpp +0 -150
  146. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +0 -79
  147. package/common/cpp/HostObjects/AudioContextHostObject.cpp +0 -55
  148. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.cpp +0 -33
  149. package/common/cpp/HostObjects/AudioNodeHostObject.cpp +0 -102
  150. package/common/cpp/HostObjects/AudioParamHostObject.cpp +0 -115
  151. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.cpp +0 -73
  152. package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +0 -250
  153. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +0 -125
  154. package/common/cpp/HostObjects/GainNodeHostObject.cpp +0 -41
  155. package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +0 -88
  156. package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +0 -33
  157. package/common/cpp/HostObjects/StereoPannerNodeHostObject.cpp +0 -41
  158. package/common/cpp/core/ParamChange.cpp +0 -46
  159. package/common/cpp/utils/JsiPromise.h +0 -48
  160. package/common/cpp/utils/android/FFTFrame.cpp +0 -23
  161. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +0 -45
  162. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +0 -26
  163. package/common/cpp/wrappers/AudioBufferWrapper.cpp +0 -46
  164. package/common/cpp/wrappers/AudioBufferWrapper.h +0 -30
  165. package/common/cpp/wrappers/AudioContextWrapper.cpp +0 -17
  166. package/common/cpp/wrappers/AudioContextWrapper.h +0 -19
  167. package/common/cpp/wrappers/AudioDestinationNodeWrapper.h +0 -16
  168. package/common/cpp/wrappers/AudioNodeWrapper.cpp +0 -37
  169. package/common/cpp/wrappers/AudioNodeWrapper.h +0 -25
  170. package/common/cpp/wrappers/AudioParamWrapper.cpp +0 -42
  171. package/common/cpp/wrappers/AudioParamWrapper.h +0 -25
  172. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.cpp +0 -23
  173. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.h +0 -23
  174. package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +0 -83
  175. package/common/cpp/wrappers/BaseAudioContextWrapper.h +0 -51
  176. package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +0 -60
  177. package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +0 -37
  178. package/common/cpp/wrappers/GainNodeWrapper.cpp +0 -14
  179. package/common/cpp/wrappers/GainNodeWrapper.h +0 -20
  180. package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +0 -44
  181. package/common/cpp/wrappers/OscillatorNodeWrapper.h +0 -31
  182. package/common/cpp/wrappers/PeriodicWaveWrapper.h +0 -17
  183. package/common/cpp/wrappers/StereoPannerNodeWrapper.cpp +0 -16
  184. package/common/cpp/wrappers/StereoPannerNodeWrapper.h +0 -21
  185. package/ios/AudioDecoder/AudioDecoder.h +0 -17
  186. package/ios/AudioDecoder/AudioDecoder.m +0 -80
  187. package/ios/AudioDecoder/IOSAudioDecoder.h +0 -28
  188. package/ios/AudioDecoder/IOSAudioDecoder.mm +0 -46
  189. package/lib/module/modules/global.d.js +0 -2
  190. package/lib/module/utils/install.js.map +0 -1
  191. /package/android/src/main/cpp/{AudioPlayer → core}/AudioPlayer.cpp +0 -0
  192. /package/android/src/main/cpp/{AudioPlayer → core}/AudioPlayer.h +0 -0
  193. /package/{android/libs/include → common/cpp/libs}/miniaudio.h +0 -0
  194. /package/ios/{AudioPlayer → core}/AudioPlayer.h +0 -0
  195. /package/ios/{AudioPlayer → core}/IOSAudioPlayer.h +0 -0
  196. /package/ios/{AudioPlayer → core}/IOSAudioPlayer.mm +0 -0
  197. /package/lib/typescript/{utils → specs}/install.d.ts +0 -0
@@ -1,46 +1,57 @@
1
1
  require "json"
2
+ require_relative './scripts/audioapi_utils'
2
3
 
3
- package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
- folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
4
+ package_json = JSON.parse(File.read(File.join(__dir__, "package.json")))
5
+
6
+ $config = find_config()
7
+ assert_minimal_react_native_version($config)
8
+ $new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
9
+
10
+ folly_flags = "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -DREACT_NATIVE_MINOR_VERSION=#{$config[:react_native_minor_version]}"
11
+ fabric_flags = $new_arch_enabled ? '-DRCT_NEW_ARCH_ENABLED' : ''
12
+ version_flag = "-DAUDIOAPI_VERSION=#{package_json['version']}"
5
13
 
6
14
  Pod::Spec.new do |s|
7
15
  s.name = "RNAudioAPI"
8
- s.version = package["version"]
9
- s.summary = package["description"]
10
- s.homepage = package["homepage"]
11
- s.license = package["license"]
12
- s.authors = package["author"]
16
+ s.version = package_json["version"]
17
+ s.summary = package_json["description"]
18
+ s.homepage = package_json["homepage"]
19
+ s.license = package_json["license"]
20
+ s.authors = package_json["author"]
13
21
 
14
22
  s.platforms = { :ios => min_ios_version_supported }
15
23
  s.source = { :git => "https://github.com/software-mansion-labs/react-native-audio-api.git", :tag => "#{s.version}" }
16
24
 
17
25
  s.source_files = "ios/**/*.{h,m,mm}", "common/cpp/**/*.{hpp,cpp,c,h}"
18
26
 
19
- s.ios.frameworks = 'Accelerate'
27
+ s.ios.frameworks = 'CoreFoundation', 'CoreAudio', 'AudioToolbox', 'Accelerate'
28
+
29
+ s.pod_target_xcconfig = {
30
+ "USE_HEADERMAP" => "YES",
31
+ "DEFINES_MODULE" => "YES",
32
+ "HEADER_SEARCH_PATHS" => '"$(PODS_TARGET_SRCROOT)/ReactCommon" "$(PODS_TARGET_SRCROOT)" "$(PODS_ROOT)/RCT-Folly" "$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/DoubleConversion" "$(PODS_ROOT)/Headers/Private/React-Core" "$(PODS_ROOT)/Headers/Private/Yoga"',
33
+ "FRAMEWORK_SEARCH_PATHS" => '"${PODS_CONFIGURATION_BUILD_DIR}/React-hermes"',
34
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
35
+ "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) HAVE_ACCELERATE=1',
36
+ }
37
+ s.compiler_flags = "#{folly_flags}"
38
+
20
39
  s.xcconfig = {
21
- 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) HAVE_ACCELERATE=1'
40
+ "HEADER_SEARCH_PATHS" => [
41
+ '"$(PODS_ROOT)/boost"',
42
+ '"$(PODS_ROOT)/boost-for-react-native"',
43
+ '"$(PODS_ROOT)/glog"',
44
+ '"$(PODS_ROOT)/RCT-Folly"',
45
+ '"$(PODS_ROOT)/Headers/Public/React-hermes"',
46
+ '"$(PODS_ROOT)/Headers/Public/hermes-engine"',
47
+ "\"$(PODS_ROOT)/#{$config[:react_native_common_dir]}\"",
48
+ "\"$(PODS_ROOT)/#{$config[:react_native_audioapi_dir_from_pods_root]}/ios\"",
49
+ "\"$(PODS_ROOT)/#{$config[:react_native_audioapi_dir_from_pods_root]}/common/cpp\"",
50
+ ].join(' '),
51
+ 'OTHER_CFLAGS' => "$(inherited) #{folly_flags} #{fabric_flags} #{version_flag}"
22
52
  }
23
53
 
24
54
  # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
25
55
  # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
26
- if respond_to?(:install_modules_dependencies, true)
27
- install_modules_dependencies(s)
28
- else
29
- s.dependency "React-Core"
30
-
31
- # Don't install the dependencies when we run `pod install` in the old architecture.
32
- if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
33
- s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
34
- s.pod_target_xcconfig = {
35
- "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
36
- "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
37
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
38
- }
39
- s.dependency "React-Codegen"
40
- s.dependency "RCT-Folly"
41
- s.dependency "RCTRequired"
42
- s.dependency "RCTTypeSafety"
43
- s.dependency "ReactCommon/turbomodule/core"
44
- end
45
- end
56
+ install_modules_dependencies(s, new_arch_enabled: true)
46
57
  end
@@ -14,33 +14,28 @@ endif()
14
14
  include("${REACT_NATIVE_DIR}/ReactAndroid/cmake-utils/folly-flags.cmake")
15
15
  add_compile_options(${folly_FLAGS})
16
16
 
17
- file(GLOB_RECURSE SOURCE_FILES
18
- "src/main/cpp/*.cpp"
19
- "src/main/cpp/*.h"
20
- "../common/cpp/*.cpp"
21
- "../common/cpp/*.h"
22
- "../common/cpp/core/*.cpp"
23
- "../common/cpp/core/*.h"
24
- "../common/cpp/wrappers/*.cpp"
25
- "../common/cpp/wrappers/*.h"
26
- "../common/cpp/HostObjects/*.cpp"
27
- "../common/cpp/HostObjects/*.h"
28
- "../common/cpp/utils/*.cpp"
29
- "../common/cpp/utils/*.h"
30
- "../common/cpp/types/*.h"
31
- )
17
+ file(GLOB_RECURSE ANDROID_CPP_SOURCES CONFIGURE_DEPENDS "src/main/cpp/*.cpp")
18
+ file(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS "../common/cpp/*.cpp")
19
+
20
+ add_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${COMMON_CPP_SOURCES})
32
21
 
33
- add_library(react-native-audio-api SHARED ${SOURCE_FILES})
22
+ file(GLOB ANDROID_CPP_DIR CONFIGURE_DEPENDS "src/main/cpp/**")
23
+ file(GLOB COMMON_CPP_DIR CONFIGURE_DEPENDS "../common/cpp/**")
34
24
 
35
- file(GLOB DIRS CONFIGURE_DEPENDS "src/main/cpp/**" "../common/cpp/**")
25
+ target_include_directories(
26
+ react-native-audio-api
27
+ PUBLIC
28
+ ${ANDROID_CPP_DIR}
29
+ ${COMMON_CPP_DIR}
30
+ )
36
31
 
37
32
  target_include_directories(
38
33
  react-native-audio-api
39
34
  PRIVATE
40
- ${DIRS}
41
- "${REACT_NATIVE_DIR}/ReactCommon/jsi"
42
- "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/jni"
43
- "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/third-party/folly"
35
+ "${REACT_NATIVE_DIR}/ReactCommon"
36
+ "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule"
37
+ "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon"
38
+ "${REACT_NATIVE_DIR}/ReactCommon/callinvoker"
44
39
  "${CMAKE_CURRENT_SOURCE_DIR}/libs/include"
45
40
  )
46
41
 
@@ -66,6 +61,7 @@ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
66
61
  else()
67
62
  set(RN_VERSION_LINK_LIBRARIES
68
63
  ReactAndroid::folly_runtime
64
+ ReactAndroid::react_nativemodule_core
69
65
  ReactAndroid::glog
70
66
  ReactAndroid::reactnativejni
71
67
  )
@@ -1,5 +1,6 @@
1
1
  import com.android.Version
2
2
  import org.apache.tools.ant.taskdefs.condition.Os
3
+ import com.android.build.gradle.tasks.ExternalNativeBuildJsonTask
3
4
 
4
5
  buildscript {
5
6
  repositories {
@@ -72,8 +73,6 @@ def toPlatformFileString(String path) {
72
73
  return path
73
74
  }
74
75
 
75
- def reactNativeRootDir = resolveReactNativeDirectory()
76
-
77
76
  static def supportsNamespace() {
78
77
  def parsed = Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
79
78
  def major = parsed[0].toInteger()
@@ -83,6 +82,15 @@ static def supportsNamespace() {
83
82
  return (major == 7 && minor >= 3) || major >= 8
84
83
  }
85
84
 
85
+ def reactNativeRootDir = resolveReactNativeDirectory()
86
+
87
+ def reactProperties = new Properties()
88
+ file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
89
+
90
+ def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME")
91
+ def REACT_NATIVE_MINOR_VERSION = REACT_NATIVE_VERSION.startsWith("0.0.0-") ? 1000 : REACT_NATIVE_VERSION.split("\\.")[1].toInteger()
92
+ def IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled()
93
+
86
94
  android {
87
95
  if (supportsNamespace()) {
88
96
  namespace "com.swmansion.audioapi"
@@ -107,7 +115,10 @@ android {
107
115
  cppFlags "-O2 -frtti -fexceptions -Wall -fstack-protector-all"
108
116
  abiFilters (*reactNativeArchitectures())
109
117
  arguments "-DANDROID_STL=c++_shared",
110
- "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}"
118
+ "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}",
119
+ "-DANDROID_TOOLCHAIN=clang",
120
+ "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}",
121
+ "-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}"
111
122
  }
112
123
  }
113
124
  }
@@ -148,6 +159,7 @@ android {
148
159
  "**/libjsi.so",
149
160
  "**/libfolly_runtime.so",
150
161
  "**/libreactnativejni.so",
162
+ "**/libreactnative.so",
151
163
  ]
152
164
  }
153
165
  }
@@ -183,10 +195,15 @@ dependencies {
183
195
  implementation 'com.google.oboe:oboe:1.9.0'
184
196
  }
185
197
 
186
- if (isNewArchitectureEnabled()) {
187
- react {
188
- jsRootDir = file("../src/")
189
- libraryName = "react-native-audio-api"
190
- codegenJavaPackageName = "com.swmansion.audioapi"
191
- }
198
+ def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask {
199
+ // If you change the minimal React Native version remember to update Compatibility Table in docs
200
+ def minimalReactNativeVersion = 75
201
+ onlyIf { REACT_NATIVE_MINOR_VERSION < minimalReactNativeVersion }
202
+ doFirst {
203
+ throw new GradleException("[AudioAPI] Unsupported React Native version. Please use $minimalReactNativeVersion. or newer.")
204
+ }
205
+ }
206
+
207
+ tasks.preBuild {
208
+ dependsOn assertMinimalReactNativeVersion
192
209
  }
@@ -3,7 +3,7 @@
3
3
 
4
4
  using namespace audioapi;
5
5
 
6
- JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
6
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
7
7
  return facebook::jni::initialize(
8
8
  vm, [] { AudioAPIInstaller::registerNatives(); });
9
9
  }
@@ -0,0 +1,37 @@
1
+ #include "AudioAPIInstaller.h"
2
+
3
+ namespace audioapi {
4
+
5
+ using namespace facebook::jni;
6
+
7
+ AudioAPIInstaller::AudioAPIInstaller(
8
+ jni::alias_ref<AudioAPIInstaller::jhybridobject> &jThis,
9
+ jsi::Runtime *jsiRuntime,
10
+ const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker)
11
+ : javaPart_(make_global(jThis)),
12
+ jsiRuntime_(jsiRuntime),
13
+ jsCallInvoker_(jsCallInvoker) {}
14
+
15
+ jni::local_ref<AudioAPIInstaller::jhybriddata> AudioAPIInstaller::initHybrid(
16
+ jni::alias_ref<jhybridobject> jThis,
17
+ jlong jsContext,
18
+ jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
19
+ jsCallInvokerHolder) {
20
+ auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
21
+ auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
22
+ return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
23
+ }
24
+
25
+ void AudioAPIInstaller::registerNatives() {
26
+ registerHybrid({
27
+ makeNativeMethod("initHybrid", AudioAPIInstaller::initHybrid),
28
+ makeNativeMethod("install", AudioAPIInstaller::install),
29
+ });
30
+ }
31
+
32
+ void AudioAPIInstaller::install() {
33
+ auto hostObject = std::make_shared<AudioAPIInstallerHostObject>(
34
+ jsiRuntime_, jsCallInvoker_);
35
+ hostObject->install();
36
+ }
37
+ } // namespace audioapi
@@ -8,7 +8,6 @@
8
8
  #include <utility>
9
9
 
10
10
  #include "AudioAPIInstallerHostObject.h"
11
- #include "AudioAPIInstallerWrapper.h"
12
11
  #include "AudioContext.h"
13
12
 
14
13
  namespace audioapi {
@@ -25,27 +24,17 @@ class AudioAPIInstaller : public jni::HybridClass<AudioAPIInstaller> {
25
24
  jni::alias_ref<jhybridobject> jThis,
26
25
  jlong jsContext,
27
26
  jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
28
- jsCallInvokerHolder) {
29
- auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
30
- auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);
31
- return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);
32
- }
33
-
34
- static void registerNatives() {
35
- registerHybrid({
36
- makeNativeMethod("initHybrid", AudioAPIInstaller::initHybrid),
37
- makeNativeMethod("install", AudioAPIInstaller::install),
38
- });
39
- }
40
-
41
- std::shared_ptr<AudioContext> createAudioContext();
27
+ jsCallInvokerHolder);
28
+
29
+ static void registerNatives();
30
+
42
31
  void install();
43
32
 
44
33
  private:
45
34
  friend HybridBase;
46
35
 
47
36
  jni::global_ref<AudioAPIInstaller::javaobject> javaPart_;
48
- jsi::Runtime *rnRuntime_;
37
+ jsi::Runtime *jsiRuntime_;
49
38
  std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;
50
39
 
51
40
  explicit AudioAPIInstaller(
@@ -9,8 +9,6 @@
9
9
 
10
10
  namespace audioapi {
11
11
 
12
- AudioDecoder::AudioDecoder(int sampleRate) : sampleRate_(sampleRate) {}
13
-
14
12
  AudioBus *AudioDecoder::decodeWithFilePath(const std::string &path) const {
15
13
  ma_decoder decoder;
16
14
  ma_decoder_config config =
@@ -55,10 +53,4 @@ AudioBus *AudioDecoder::decodeWithFilePath(const std::string &path) const {
55
53
 
56
54
  return audioBus;
57
55
  }
58
-
59
- AudioBus *AudioDecoder::decodeWithArrayBuffer() const {
60
- // TODO: implement this
61
- return new AudioBus(1, 1, 1);
62
- }
63
-
64
56
  } // namespace audioapi
@@ -3,9 +3,11 @@ package com.swmansion.audioapi
3
3
  import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.annotations.ReactModuleList
6
7
  import com.facebook.react.uimanager.ViewManager
7
8
  import com.swmansion.audioapi.nativemodules.AudioAPIModule
8
9
 
10
+ @ReactModuleList(nativeModules = [AudioAPIModule::class])
9
11
  class AudioAPIPackage : ReactPackage {
10
12
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> =
11
13
  listOf<NativeModule>(AudioAPIModule(reactContext))
@@ -3,11 +3,17 @@ package com.swmansion.audioapi.nativemodules
3
3
  import com.facebook.react.bridge.ReactApplicationContext
4
4
  import com.facebook.react.bridge.ReactContextBaseJavaModule
5
5
  import com.facebook.react.bridge.ReactMethod
6
+ import com.facebook.react.module.annotations.ReactModule
6
7
  import com.swmansion.audioapi.module.AudioAPIInstaller
7
8
 
9
+ @ReactModule(name = AudioAPIModule.NAME)
8
10
  class AudioAPIModule(
9
11
  private val reactContext: ReactApplicationContext,
10
12
  ) : ReactContextBaseJavaModule(reactContext) {
13
+ companion object {
14
+ const val NAME: String = "AudioAPIModule"
15
+ }
16
+
11
17
  override fun getName(): String = NAME
12
18
 
13
19
  @ReactMethod(isBlockingSynchronousMethod = true)
@@ -17,8 +23,4 @@ class AudioAPIModule(
17
23
 
18
24
  return true
19
25
  }
20
-
21
- companion object {
22
- const val NAME: String = "AudioAPIModule"
23
- }
24
26
  }
@@ -0,0 +1,48 @@
1
+ #pragma once
2
+
3
+ #include <ReactCommon/CallInvoker.h>
4
+ #include <jsi/jsi.h>
5
+ #include <memory>
6
+ #include <utility>
7
+ #include <vector>
8
+
9
+ #include <JsiHostObject.h>
10
+ #include <JsiPromise.h>
11
+ #include "AudioContextHostObject.h"
12
+
13
+ namespace audioapi {
14
+ using namespace facebook;
15
+
16
+ class AudioAPIInstallerHostObject
17
+ : public JsiHostObject,
18
+ public std::enable_shared_from_this<AudioAPIInstallerHostObject> {
19
+ public:
20
+ explicit AudioAPIInstallerHostObject(
21
+ jsi::Runtime *runtime,
22
+ const std::shared_ptr<react::CallInvoker> &jsInvoker)
23
+ : rnRuntime_(runtime) {
24
+ promiseVendor_ = std::make_shared<PromiseVendor>(runtime, jsInvoker);
25
+
26
+ addFunctions(
27
+ JSI_EXPORT_FUNCTION(AudioAPIInstallerHostObject, createAudioContext));
28
+ }
29
+
30
+ void install() {
31
+ auto object =
32
+ jsi::Object::createFromHostObject(*rnRuntime_, shared_from_this());
33
+ rnRuntime_->global().setProperty(
34
+ *rnRuntime_, "__AudioAPIInstaller", std::move(object));
35
+ }
36
+
37
+ JSI_HOST_FUNCTION(createAudioContext) {
38
+ auto audioContext = std::make_shared<AudioContext>();
39
+ auto audioContextHostObject =
40
+ std::make_shared<AudioContextHostObject>(audioContext, promiseVendor_);
41
+ return jsi::Object::createFromHostObject(runtime, audioContextHostObject);
42
+ }
43
+
44
+ private:
45
+ std::shared_ptr<PromiseVendor> promiseVendor_;
46
+ jsi::Runtime *rnRuntime_;
47
+ };
48
+ } // namespace audioapi
@@ -4,30 +4,96 @@
4
4
  #include <memory>
5
5
  #include <vector>
6
6
 
7
- #include "AudioBufferWrapper.h"
7
+ #include <JsiHostObject.h>
8
+ #include "AudioBuffer.h"
8
9
 
9
10
  namespace audioapi {
10
11
  using namespace facebook;
11
12
 
12
- class AudioBufferHostObject : public jsi::HostObject {
13
+ class AudioBufferHostObject : public JsiHostObject {
13
14
  public:
14
- std::shared_ptr<AudioBufferWrapper> wrapper_;
15
+ std::shared_ptr<AudioBuffer> audioBuffer_;
15
16
 
16
17
  explicit AudioBufferHostObject(
17
- const std::shared_ptr<AudioBufferWrapper> &wrapper);
18
+ const std::shared_ptr<AudioBuffer> &audioBuffer)
19
+ : audioBuffer_(audioBuffer) {
20
+ addGetters(
21
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, sampleRate),
22
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, length),
23
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, duration),
24
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, numberOfChannels));
18
25
 
19
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
26
+ addFunctions(
27
+ JSI_EXPORT_FUNCTION(AudioBufferHostObject, getChannelData),
28
+ JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyFromChannel),
29
+ JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyToChannel));
30
+ }
31
+
32
+ JSI_PROPERTY_GETTER(sampleRate) {
33
+ return {audioBuffer_->getSampleRate()};
34
+ }
35
+
36
+ JSI_PROPERTY_GETTER(length) {
37
+ return {audioBuffer_->getLength()};
38
+ }
39
+
40
+ JSI_PROPERTY_GETTER(duration) {
41
+ return {audioBuffer_->getDuration()};
42
+ }
43
+
44
+ JSI_PROPERTY_GETTER(numberOfChannels) {
45
+ return {audioBuffer_->getNumberOfChannels()};
46
+ }
47
+
48
+ JSI_HOST_FUNCTION(getChannelData) {
49
+ int channel = static_cast<int>(args[0].getNumber());
50
+ float *channelData = audioBuffer_->getChannelData(channel);
51
+
52
+ auto array = jsi::Array(runtime, audioBuffer_->getLength());
53
+ for (int i = 0; i < audioBuffer_->getLength(); i++) {
54
+ array.setValueAtIndex(runtime, i, jsi::Value(channelData[i]));
55
+ }
56
+
57
+ return array;
58
+ }
59
+
60
+ JSI_HOST_FUNCTION(copyFromChannel) {
61
+ auto destination = args[0].getObject(runtime).asArray(runtime);
62
+ auto destinationLength =
63
+ static_cast<int>(destination.getProperty(runtime, "length").asNumber());
64
+ auto channelNumber = static_cast<int>(args[1].getNumber());
65
+ auto startInChannel = static_cast<int>(args[2].getNumber());
66
+
67
+ auto *destinationData = new float[destinationLength];
68
+
69
+ audioBuffer_->copyFromChannel(
70
+ destinationData, destinationLength, channelNumber, startInChannel);
71
+
72
+ for (int i = 0; i < destinationLength; i++) {
73
+ destination.setValueAtIndex(runtime, i, jsi::Value(destinationData[i]));
74
+ }
75
+
76
+ return jsi::Value::undefined();
77
+ }
78
+
79
+ JSI_HOST_FUNCTION(copyToChannel) {
80
+ auto source = args[0].getObject(runtime).asArray(runtime);
81
+ auto sourceLength =
82
+ static_cast<int>(source.getProperty(runtime, "length").asNumber());
83
+ auto channelNumber = static_cast<int>(args[1].getNumber());
84
+ auto startInChannel = static_cast<int>(args[2].getNumber());
85
+
86
+ auto *sourceData = new float[sourceLength];
20
87
 
21
- void set(
22
- jsi::Runtime &runtime,
23
- const jsi::PropNameID &name,
24
- const jsi::Value &value) override;
88
+ for (int i = 0; i < sourceLength; i++) {
89
+ sourceData[i] =
90
+ static_cast<float>(source.getValueAtIndex(runtime, i).getNumber());
91
+ }
25
92
 
26
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
93
+ audioBuffer_->copyToChannel(
94
+ sourceData, sourceLength, channelNumber, startInChannel);
27
95
 
28
- static std::shared_ptr<AudioBufferHostObject> createFromWrapper(
29
- const std::shared_ptr<AudioBufferWrapper> &wrapper) {
30
- return std::make_shared<AudioBufferHostObject>(wrapper);
96
+ return jsi::Value::undefined();
31
97
  }
32
98
  };
33
99
  } // namespace audioapi
@@ -4,7 +4,8 @@
4
4
  #include <vector>
5
5
 
6
6
  #include "AudioBufferHostObject.h"
7
- #include "AudioBufferSourceNodeWrapper.h"
7
+ #include "AudioBufferSourceNode.h"
8
+ #include "AudioParamHostObject.h"
8
9
  #include "AudioScheduledSourceNodeHostObject.h"
9
10
 
10
11
  namespace audioapi {
@@ -14,24 +15,102 @@ class AudioBufferSourceNodeHostObject
14
15
  : public AudioScheduledSourceNodeHostObject {
15
16
  public:
16
17
  explicit AudioBufferSourceNodeHostObject(
17
- const std::shared_ptr<AudioBufferSourceNodeWrapper> &wrapper);
18
+ const std::shared_ptr<AudioBufferSourceNode> &node)
19
+ : AudioScheduledSourceNodeHostObject(node) {
20
+ addGetters(
21
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),
22
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, buffer),
23
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),
24
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd),
25
+ JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, detune),
26
+ JSI_EXPORT_PROPERTY_GETTER(
27
+ AudioBufferSourceNodeHostObject, playbackRate));
28
+ addSetters(
29
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),
30
+ JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, buffer));
31
+ }
32
+
33
+ JSI_PROPERTY_GETTER(loop) {
34
+ auto audioBufferSourceNode =
35
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
36
+ auto loop = audioBufferSourceNode->getLoop();
37
+ return {loop};
38
+ }
39
+
40
+ JSI_PROPERTY_GETTER(buffer) {
41
+ auto audioBufferSourceNode =
42
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
43
+ auto buffer = audioBufferSourceNode->getBuffer();
44
+
45
+ if (!buffer) {
46
+ return jsi::Value::null();
47
+ }
18
48
 
19
- jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;
49
+ auto bufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);
50
+ return jsi::Object::createFromHostObject(runtime, bufferHostObject);
51
+ }
20
52
 
21
- void set(
22
- jsi::Runtime &runtime,
23
- const jsi::PropNameID &name,
24
- const jsi::Value &value) override;
53
+ JSI_PROPERTY_GETTER(loopStart) {
54
+ auto audioBufferSourceNode =
55
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
56
+ auto loopStart = audioBufferSourceNode->getLoopStart();
57
+ return {loopStart};
58
+ }
25
59
 
26
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
60
+ JSI_PROPERTY_GETTER(loopEnd) {
61
+ auto audioBufferSourceNode =
62
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
63
+ auto loopEnd = audioBufferSourceNode->getLoopEnd();
64
+ return {loopEnd};
65
+ }
66
+
67
+ JSI_PROPERTY_GETTER(detune) {
68
+ auto audioBufferSourceNode =
69
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
70
+ auto detune = audioBufferSourceNode->getDetuneParam();
71
+ auto detuneHostObject = std::make_shared<AudioParamHostObject>(detune);
72
+ return jsi::Object::createFromHostObject(runtime, detuneHostObject);
73
+ }
27
74
 
28
- static std::shared_ptr<AudioBufferSourceNodeHostObject> createFromWrapper(
29
- const std::shared_ptr<AudioBufferSourceNodeWrapper> &wrapper) {
30
- return std::make_shared<AudioBufferSourceNodeHostObject>(wrapper);
75
+ JSI_PROPERTY_GETTER(playbackRate) {
76
+ auto audioBufferSourceNode =
77
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
78
+ auto playbackRate = audioBufferSourceNode->getPlaybackRateParam();
79
+ auto playbackRateHostObject =
80
+ std::make_shared<AudioParamHostObject>(playbackRate);
81
+ return jsi::Object::createFromHostObject(runtime, playbackRateHostObject);
31
82
  }
32
83
 
33
- private:
34
- std::shared_ptr<AudioBufferSourceNodeWrapper>
35
- getAudioBufferSourceNodeWrapperFromAudioNodeWrapper();
84
+ JSI_PROPERTY_SETTER(loop) {
85
+ auto audioBufferSourceNode =
86
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
87
+ audioBufferSourceNode->setLoop(value.getBool());
88
+ }
89
+
90
+ JSI_PROPERTY_SETTER(buffer) {
91
+ auto audioBufferSourceNode =
92
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
93
+ if (value.isNull()) {
94
+ audioBufferSourceNode->setBuffer(std::shared_ptr<AudioBuffer>(nullptr));
95
+ return;
96
+ }
97
+
98
+ auto bufferHostObject =
99
+ value.getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);
100
+ audioBufferSourceNode->setBuffer(bufferHostObject->audioBuffer_);
101
+ }
102
+
103
+ JSI_PROPERTY_SETTER(loopStart) {
104
+ auto audioBufferSourceNode =
105
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
106
+ audioBufferSourceNode->setLoopStart(value.getNumber());
107
+ }
108
+
109
+ JSI_PROPERTY_SETTER(loopEnd) {
110
+ auto audioBufferSourceNode =
111
+ std::static_pointer_cast<AudioBufferSourceNode>(node_);
112
+ audioBufferSourceNode->setLoopEnd(value.getNumber());
113
+ }
36
114
  };
115
+
37
116
  } // namespace audioapi