@mentra/bluetooth-sdk 0.1.0

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 (278) hide show
  1. package/README.md +278 -0
  2. package/android/build.gradle +167 -0
  3. package/android/lc3Lib/CMakeLists.txt +6 -0
  4. package/android/lc3Lib/build.gradle +109 -0
  5. package/android/lc3Lib/proguard-rules.pro +33 -0
  6. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  7. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  8. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  26. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  81. package/android/lc3Lib/src/main/java/com/mentra/lc3Lib/Lc3Cpp.java +38 -0
  82. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  83. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  86. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  119. package/android/settings.gradle +1 -0
  120. package/android/src/main/AndroidManifest.xml +40 -0
  121. package/android/src/main/java/com/mentra/bluetoothsdk/BluetoothSdkModule.kt +528 -0
  122. package/android/src/main/java/com/mentra/bluetoothsdk/Bridge.kt +610 -0
  123. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceManager.kt +1616 -0
  124. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceStore.kt +314 -0
  125. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothModels.kt +1710 -0
  126. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothSdk.kt +554 -0
  127. package/android/src/main/java/com/mentra/bluetoothsdk/ObservableStore.kt +68 -0
  128. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  129. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/R1.kt +934 -0
  130. package/android/src/main/java/com/mentra/bluetoothsdk/services/Foreground.kt +175 -0
  131. package/android/src/main/java/com/mentra/bluetoothsdk/services/PhoneMic.kt +1109 -0
  132. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G1.java +3974 -0
  133. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G2.kt +3551 -0
  134. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Mach1.java +1327 -0
  135. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraLive.java +6959 -0
  136. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraNex.kt +1655 -0
  137. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraosBle.java +53675 -0
  138. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/SGCManager.kt +202 -0
  139. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Simulated.kt +224 -0
  140. package/android/src/main/java/com/mentra/bluetoothsdk/stt/STTTools.kt +340 -0
  141. package/android/src/main/java/com/mentra/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +465 -0
  142. package/android/src/main/java/com/mentra/bluetoothsdk/stt/VadGateSpeechPolicy.kt +221 -0
  143. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AES.java +106 -0
  144. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  145. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  146. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BlePhotoUploadService.java +179 -0
  147. package/android/src/main/java/com/mentra/bluetoothsdk/utils/Constants.kt +44 -0
  148. package/android/src/main/java/com/mentra/bluetoothsdk/utils/G1Text.kt +436 -0
  149. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  150. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleUploadService.java +76 -0
  151. package/android/src/main/java/com/mentra/bluetoothsdk/utils/K900ProtocolUtils.java +791 -0
  152. package/android/src/main/java/com/mentra/bluetoothsdk/utils/MessageChunker.java +186 -0
  153. package/android/src/main/java/com/mentra/bluetoothsdk/utils/NexSGCUtils.kt +589 -0
  154. package/android/src/main/java/com/mentra/bluetoothsdk/utils/PhoneAudioMonitor.kt +303 -0
  155. package/android/src/main/java/com/mentra/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  156. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  157. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  158. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  159. package/android/src/main/res/values/strings.xml +4 -0
  160. package/app.plugin.js +1 -0
  161. package/build/BluetoothSdk.types.d.ts +498 -0
  162. package/build/BluetoothSdk.types.d.ts.map +1 -0
  163. package/build/BluetoothSdk.types.js +23 -0
  164. package/build/BluetoothSdk.types.js.map +1 -0
  165. package/build/BluetoothSdkModule.d.ts +71 -0
  166. package/build/BluetoothSdkModule.d.ts.map +1 -0
  167. package/build/BluetoothSdkModule.js +106 -0
  168. package/build/BluetoothSdkModule.js.map +1 -0
  169. package/build/index.d.ts +3 -0
  170. package/build/index.d.ts.map +1 -0
  171. package/build/index.js +5 -0
  172. package/build/index.js.map +1 -0
  173. package/expo-module.config.json +9 -0
  174. package/ios/BluetoothSdkModule.swift +665 -0
  175. package/ios/MentraBluetoothSDK.podspec +77 -0
  176. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  177. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  178. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  179. package/ios/Packages/CoreObjC/attdet.c +92 -0
  180. package/ios/Packages/CoreObjC/attdet.h +44 -0
  181. package/ios/Packages/CoreObjC/bits.c +375 -0
  182. package/ios/Packages/CoreObjC/bits.h +315 -0
  183. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  184. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  185. package/ios/Packages/CoreObjC/common.h +151 -0
  186. package/ios/Packages/CoreObjC/energy.c +70 -0
  187. package/ios/Packages/CoreObjC/energy.h +43 -0
  188. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  189. package/ios/Packages/CoreObjC/lc3.c +704 -0
  190. package/ios/Packages/CoreObjC/lc3.h +313 -0
  191. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  192. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  193. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  194. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  195. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  196. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  197. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  198. package/ios/Packages/CoreObjC/mdct.c +469 -0
  199. package/ios/Packages/CoreObjC/mdct.h +57 -0
  200. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  201. package/ios/Packages/CoreObjC/meson.build +61 -0
  202. package/ios/Packages/CoreObjC/plc.c +61 -0
  203. package/ios/Packages/CoreObjC/plc.h +57 -0
  204. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  205. package/ios/Packages/CoreObjC/sns.c +880 -0
  206. package/ios/Packages/CoreObjC/sns.h +103 -0
  207. package/ios/Packages/CoreObjC/spec.c +907 -0
  208. package/ios/Packages/CoreObjC/spec.h +119 -0
  209. package/ios/Packages/CoreObjC/tables.c +3457 -0
  210. package/ios/Packages/CoreObjC/tables.h +94 -0
  211. package/ios/Packages/CoreObjC/tns.c +457 -0
  212. package/ios/Packages/CoreObjC/tns.h +99 -0
  213. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  214. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  215. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +1659 -0
  216. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/cargs.h +162 -0
  217. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/c-api.h +1852 -0
  218. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/cxx-api.h +674 -0
  219. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +44 -0
  220. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  221. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/sherpa-onnx.a +0 -0
  222. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  223. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/sherpa-onnx.a +0 -0
  224. package/ios/Packages/VAD/Common/VAD/VADQuality.swift +41 -0
  225. package/ios/Packages/VAD/Common/VAD/VADState.swift +26 -0
  226. package/ios/Packages/VAD/Common/VAD/VADStrategy.swift +29 -0
  227. package/ios/Packages/VAD/Common/VAD/VADType.swift +14 -0
  228. package/ios/Packages/VAD/Data/Configuration.swift +68 -0
  229. package/ios/Packages/VAD/Data/FrameSize.swift +39 -0
  230. package/ios/Packages/VAD/Data/Record.swift +13 -0
  231. package/ios/Packages/VAD/Data/Result.swift +22 -0
  232. package/ios/Packages/VAD/Data/SampleRate.swift +48 -0
  233. package/ios/Packages/VAD/Silero/Model/silero_vad.onnx +0 -0
  234. package/ios/Packages/VAD/Silero/SileroVAD.swift +284 -0
  235. package/ios/Packages/VAD/Silero/SileroVADStrategy.swift +64 -0
  236. package/ios/Packages/libbz2/module.modulemap +5 -0
  237. package/ios/Packages/libbz2/shim.h +1 -0
  238. package/ios/Source/Bridge.swift +353 -0
  239. package/ios/Source/Bridging-Header.h +16 -0
  240. package/ios/Source/DeviceManager.swift +1478 -0
  241. package/ios/Source/DeviceStore.swift +295 -0
  242. package/ios/Source/MentraBluetoothSDK.swift +2439 -0
  243. package/ios/Source/ObservableStore.swift +88 -0
  244. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  245. package/ios/Source/controllers/ControllerManager.swift +187 -0
  246. package/ios/Source/controllers/R1.swift +827 -0
  247. package/ios/Source/services/PhoneMic.swift +662 -0
  248. package/ios/Source/sgcs/Frame.swift +651 -0
  249. package/ios/Source/sgcs/G1.swift +2505 -0
  250. package/ios/Source/sgcs/G2.swift +3730 -0
  251. package/ios/Source/sgcs/Mach1.swift +543 -0
  252. package/ios/Source/sgcs/MentraLive.swift +4708 -0
  253. package/ios/Source/sgcs/MentraNex.swift +2479 -0
  254. package/ios/Source/sgcs/SGCManager.swift +243 -0
  255. package/ios/Source/sgcs/Simulated.swift +270 -0
  256. package/ios/Source/sgcs/mentraos_ble.pb.swift +3811 -0
  257. package/ios/Source/stt/STTTools.swift +154 -0
  258. package/ios/Source/stt/SherpaOnnxTranscriber.swift +401 -0
  259. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  260. package/ios/Source/utils/Constants.swift +74 -0
  261. package/ios/Source/utils/Enums.swift +95 -0
  262. package/ios/Source/utils/G1Text.swift +2067 -0
  263. package/ios/Source/utils/JSCExperiment.swift +241 -0
  264. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  265. package/ios/Source/utils/MessageChunker.swift +164 -0
  266. package/ios/Source/utils/Models.swift +135 -0
  267. package/ios/Source/utils/PhoneAudioMonitor.swift +226 -0
  268. package/ios/Source/utils/TarBz2Extractor.swift +206 -0
  269. package/package.json +78 -0
  270. package/plugin/build/index.d.ts +6 -0
  271. package/plugin/build/index.js +12 -0
  272. package/plugin/build/withAndroid.d.ts +4 -0
  273. package/plugin/build/withAndroid.js +80 -0
  274. package/plugin/build/withIos.d.ts +4 -0
  275. package/plugin/build/withIos.js +64 -0
  276. package/src/BluetoothSdk.types.ts +581 -0
  277. package/src/BluetoothSdkModule.ts +259 -0
  278. package/src/index.ts +4 -0
@@ -0,0 +1,441 @@
1
+ package com.mentra.bluetoothsdk.utils.audio;
2
+
3
+ import android.content.Context;
4
+ import android.media.AudioFormat;
5
+ import android.media.AudioManager;
6
+ import android.media.AudioRecord;
7
+ import android.media.AudioTrack;
8
+ import android.media.MediaRecorder;
9
+ import android.media.MediaCodec;
10
+ import android.media.MediaCodecInfo;
11
+ import android.media.MediaFormat;
12
+ import android.media.MediaMuxer;
13
+ import android.os.AsyncTask;
14
+ import android.os.Environment;
15
+ import android.os.Handler;
16
+ import android.os.Looper;
17
+ import android.util.Log;
18
+ import android.widget.Toast;
19
+
20
+ import com.mentra.lc3Lib.Lc3Cpp;
21
+ import com.mentra.bluetoothsdk.utils.audio.ByteUtilAudioPlayer;
22
+
23
+ import java.io.File;
24
+ import java.io.FileNotFoundException;
25
+ import java.io.FileOutputStream;
26
+ import java.io.IOException;
27
+ import java.nio.ByteBuffer;
28
+ import java.text.SimpleDateFormat;
29
+ import java.util.Date;
30
+ import java.util.Locale;
31
+ import java.util.concurrent.ArrayBlockingQueue;
32
+
33
+ public class Lc3Player extends Thread{
34
+ private Context mContext;
35
+ private AudioTrack mTrack;
36
+ private volatile boolean isPlaying = false;
37
+ private int bufferSize;
38
+ private final int mSampleRate = 16000 ; // 44100;
39
+ // private int mChannelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
40
+ private int mChannelConfig = AudioFormat.CHANNEL_OUT_MONO;
41
+ //private int mChannelConfig = AudioFormat.CHANNEL_OUT_STEREO;
42
+ private int mChannelRecordConfig = AudioFormat.CHANNEL_IN_MONO;
43
+ private final int mEncoding = AudioFormat.ENCODING_PCM_16BIT;
44
+ private long mDecorderHandle = -1;
45
+ private ArrayBlockingQueue<byte[]> mQueue;
46
+ private int mFrameSize; // LC3 frame size for this player instance
47
+
48
+ // Rolling audio recording - saves last 20 seconds every 20 seconds
49
+ private static final int ROLLING_DURATION_SECONDS = 20;
50
+ private static final int ROLLING_BUFFER_SIZE = 16000 * 2 * ROLLING_DURATION_SECONDS; // 16kHz * 2 bytes * 20 sec = 640KB
51
+ private byte[] rollingBuffer = new byte[ROLLING_BUFFER_SIZE];
52
+ private int rollingBufferPosition = 0;
53
+ private boolean rollingRecordingEnabled = false;
54
+ private Handler rollingHandler = new Handler(Looper.getMainLooper());
55
+ private Runnable rollingSaveRunnable;
56
+ private int rollingFileCounter = 0;
57
+ private long lastRollingSaveTime = 0;
58
+
59
+ public Lc3Player(Context context, int frameSize)
60
+ {
61
+ mContext = context;
62
+ mFrameSize = frameSize;
63
+ mQueue = new ArrayBlockingQueue(100);
64
+ }
65
+
66
+ // Backward compatibility constructor (defaults to 40-byte frames for 16kbps, mono, 10ms)
67
+ public Lc3Player(Context context)
68
+ {
69
+ this(context, 40);
70
+ }
71
+
72
+ public void init()
73
+ {
74
+ if(mTrack != null)
75
+ return;
76
+ bufferSize = AudioTrack.getMinBufferSize(mSampleRate, mChannelConfig, mEncoding)*4;
77
+ Log.e("_test_", "lc3 bufferSize="+bufferSize);
78
+ mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, mSampleRate, mChannelConfig, mEncoding, bufferSize, AudioTrack.MODE_STREAM);
79
+ // mTrack.setStereoVolume(0.8f,0.8f);
80
+ mTrack.setVolume(1.0f);
81
+ mTrack.setPlaybackRate(mSampleRate);
82
+ mDecorderHandle = Lc3Cpp.initDecoder();
83
+ Log.e("_test_", "lc3 decoder handle="+mDecorderHandle);
84
+ }
85
+
86
+ public void startPlay()
87
+ {
88
+ isPlaying = true;
89
+ this.start();
90
+ if(mTrack != null)
91
+ {
92
+ mTrack.play();
93
+ }
94
+ // startRec(); // Recording disabled
95
+ }
96
+
97
+ private byte[] mRecvBuffer = new byte[200*10]; // 5 frames × 40 bytes = 200
98
+ private byte[]mBuffer = new byte[200]; // 5 frames × 40 bytes = 200
99
+ private byte[]mTestBuffer = new byte[40]; // Single frame buffer (40 bytes)
100
+ public void write(byte[] data, int offset, int size)
101
+ {
102
+ // if(size != 102) // 20 bytes × 5 frames + 2 header bytes
103
+ // return;
104
+ if(!mQueue.offer(data))
105
+ {
106
+ Log.e("_test_","+++++++++ addFrame fail");
107
+ }
108
+ }
109
+ public void write1(byte[] data, int offset, int size)
110
+ {
111
+ if(size != 202) // 40 bytes × 5 frames + 2 header bytes
112
+ return;
113
+ for(int i = 0;i < 5; i++)
114
+ {
115
+ System.arraycopy(data, i*40 + 2, mTestBuffer, 0, 40);
116
+ byte []decData = Lc3Cpp.decodeLC3(mDecorderHandle, mTestBuffer, mFrameSize);
117
+ if(decData != null)
118
+ mTrack.write(decData, 0, decData.length);
119
+ }
120
+ }
121
+ public void write2(byte[] data, int offset, int size)
122
+ {
123
+ if(size != 202) // 40 bytes × 5 frames + 2 header bytes
124
+ return;
125
+ System.arraycopy(data, 2, mBuffer, 0, 200); // Copy 200 bytes (5 × 40)
126
+ byte []decData = Lc3Cpp.decodeLC3(mDecorderHandle, mBuffer, mFrameSize);
127
+ if(decData == null)
128
+ {
129
+ Log.e("_test_", "lc3 decoder data null");
130
+ return;
131
+ }
132
+ Log.e("_test_", "lc3 decoder data seq="+ ByteUtilAudioPlayer.bytetoHexString(data[1])+",size="+decData.length+",ori size="+size);
133
+ mTrack.write(decData, 0, decData.length);
134
+ }
135
+ public void stopPlay()
136
+ {
137
+ isPlaying = false;
138
+ interrupt(); // Properly interrupt the thread
139
+
140
+ // Wait for thread to finish before cleaning up resources
141
+ try {
142
+ join(1000); // Wait up to 1 second for thread to terminate
143
+ } catch (InterruptedException e) {
144
+ Thread.currentThread().interrupt();
145
+ }
146
+
147
+ synchronized (this) {
148
+ if(mTrack != null)
149
+ {
150
+ try {
151
+ mTrack.stop();
152
+ mTrack.release();
153
+ } catch (Exception e) {
154
+ Log.e("_test_", "Error stopping AudioTrack", e);
155
+ } finally {
156
+ mTrack = null;
157
+ }
158
+ Lc3Cpp.freeDecoder(mDecorderHandle);
159
+ }
160
+ }
161
+ // stopRec(); // Recording disabled
162
+ }
163
+ private int mLastSeq = 0;
164
+ @Override
165
+ public void run() {
166
+ try {
167
+ setPriority(Thread.MAX_PRIORITY);
168
+ while (isPlaying && !Thread.currentThread().isInterrupted())
169
+ {
170
+ //Log.e(AvConst.TAG, "DealThread mbStartPlay="+mbStartPlay);
171
+ byte[] data = mQueue.take();
172
+ if(data != null && isPlaying)
173
+ {
174
+ if(false)
175
+ {
176
+ for(int i = 0;i < 5; i++)
177
+ {
178
+ System.arraycopy(data, i*40 + 2, mTestBuffer, 0, 40);
179
+ byte []decData = Lc3Cpp.decodeLC3(mDecorderHandle, mTestBuffer, mFrameSize);
180
+ if(decData != null) {
181
+ addToRollingBuffer(decData);
182
+
183
+ // Audio playback disabled - uncomment to play through phone speakers
184
+ /*
185
+ synchronized (this) {
186
+ if (mTrack != null && isPlaying) {
187
+ try {
188
+ mTrack.write(decData, 0, decData.length);
189
+ } catch (IllegalStateException e) {
190
+ Log.e("_test_", "AudioTrack write failed - track released", e);
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ */
196
+ }
197
+ }
198
+ }
199
+ else
200
+ {
201
+ System.arraycopy(data, 2, mBuffer, 0, 200); // Copy 200 bytes (5 × 40)
202
+ if(ByteUtilAudioPlayer.byte2Int(data[1]) != mLastSeq)
203
+ {
204
+ Log.e("_test_", "seq error,should be=0x"+ ByteUtilAudioPlayer.intToHexString(mLastSeq, 2)+",but seq="+ByteUtilAudioPlayer.bytetoHexString(data[1]));
205
+ }
206
+ else
207
+ {
208
+ //Log.i("_test_", "seq ok,seq=0x"+ByteUtilAudioPlayer.bytetoHexString(data[1]));
209
+ }
210
+ mLastSeq = ByteUtilAudioPlayer.byte2Int(data[1]);
211
+ mLastSeq = (mLastSeq + 1) % 256;
212
+ byte []decData = Lc3Cpp.decodeLC3(mDecorderHandle, mBuffer, mFrameSize);
213
+ if(decData != null) {
214
+ // Add to rolling buffer for periodic saving
215
+ addToRollingBuffer(decData);
216
+
217
+ // Audio playback disabled - uncomment to play through phone speakers
218
+ synchronized (this) {
219
+ if (mTrack != null && isPlaying) {
220
+ try {
221
+ mTrack.write(decData, 0, decData.length);
222
+ //Log.e("_test_", "dec="+ByteUtilAudioPlayer.outputHexString(decData, 1440, 160));
223
+ //writeRecData(decData, 0, decData.length);
224
+ } catch (IllegalStateException e) {
225
+ Log.e("_test_", "AudioTrack write failed - track released", e);
226
+ break;
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+
233
+ }
234
+ }
235
+ } catch (InterruptedException e) {
236
+ Log.d("_test_", "LC3Player thread interrupted - shutting down gracefully");
237
+ Thread.currentThread().interrupt(); // Preserve interrupt status
238
+ }
239
+ finally {
240
+ mQueue.clear();
241
+ Log.d("_test_", "LC3Player thread finished");
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Enable rolling audio recording - saves last 20 seconds as M4A file every 20 seconds
247
+ */
248
+ public void enableRollingRecording(boolean enable) {
249
+ rollingRecordingEnabled = enable;
250
+ if (enable) {
251
+ Log.d("_test_", "Rolling audio recording ENABLED - will save 20-second files");
252
+ lastRollingSaveTime = System.currentTimeMillis();
253
+ } else {
254
+ Log.d("_test_", "Rolling audio recording DISABLED");
255
+ rollingHandler.removeCallbacks(rollingSaveRunnable);
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Add PCM data to the rolling buffer (circular buffer)
261
+ */
262
+ private void addToRollingBuffer(byte[] pcmData) {
263
+ if (!rollingRecordingEnabled || pcmData == null) return;
264
+
265
+ for (int i = 0; i < pcmData.length; i++) {
266
+ rollingBuffer[rollingBufferPosition] = pcmData[i];
267
+ rollingBufferPosition = (rollingBufferPosition + 1) % ROLLING_BUFFER_SIZE;
268
+ }
269
+
270
+ // Check if 20 seconds have passed
271
+ long currentTime = System.currentTimeMillis();
272
+ if (currentTime - lastRollingSaveTime >= ROLLING_DURATION_SECONDS * 1000) {
273
+ saveRollingBuffer();
274
+ lastRollingSaveTime = currentTime;
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Save the rolling buffer as an M4A file
280
+ */
281
+ private void saveRollingBuffer() {
282
+ new Thread(() -> {
283
+ try {
284
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US);
285
+ String timestamp = sdf.format(new Date());
286
+ String filename = "rolling_audio_" + timestamp + ".m4a";
287
+
288
+ File outputDir = new File(mContext.getExternalFilesDir(null), "rolling_recordings");
289
+ if (!outputDir.exists()) {
290
+ outputDir.mkdirs();
291
+ }
292
+ File outputFile = new File(outputDir, filename);
293
+
294
+ // Encode PCM to AAC and save as M4A
295
+ encodePcmToM4a(rollingBuffer, outputFile.getAbsolutePath());
296
+
297
+ rollingFileCounter++;
298
+ Log.d("_test_", "Saved rolling audio #" + rollingFileCounter + ": " + outputFile.getAbsolutePath());
299
+
300
+ } catch (Exception e) {
301
+ Log.e("_test_", "Error saving rolling audio", e);
302
+ }
303
+ }).start();
304
+ }
305
+
306
+ /**
307
+ * Encode PCM data to M4A (AAC) format
308
+ */
309
+ private void encodePcmToM4a(byte[] pcmData, String outputPath) throws IOException {
310
+ MediaCodec encoder = null;
311
+ MediaMuxer muxer = null;
312
+
313
+ try {
314
+ // Setup AAC encoder
315
+ MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, mSampleRate, 1);
316
+ format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
317
+ format.setInteger(MediaFormat.KEY_BIT_RATE, 64000);
318
+ format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16384);
319
+
320
+ encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);
321
+ encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
322
+ encoder.start();
323
+
324
+ // Setup muxer
325
+ muxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
326
+
327
+ boolean muxerStarted = false;
328
+ int trackIndex = -1;
329
+
330
+ // Encode PCM to AAC
331
+ ByteBuffer[] inputBuffers = encoder.getInputBuffers();
332
+ ByteBuffer[] outputBuffers = encoder.getOutputBuffers();
333
+ MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
334
+
335
+ boolean done = false;
336
+ int inputOffset = 0;
337
+
338
+ while (!done) {
339
+ // Feed input
340
+ if (inputOffset < pcmData.length) {
341
+ int inputIndex = encoder.dequeueInputBuffer(10000);
342
+ if (inputIndex >= 0) {
343
+ ByteBuffer inputBuffer = inputBuffers[inputIndex];
344
+ inputBuffer.clear();
345
+
346
+ int chunkSize = Math.min(inputBuffer.remaining(), pcmData.length - inputOffset);
347
+ inputBuffer.put(pcmData, inputOffset, chunkSize);
348
+
349
+ encoder.queueInputBuffer(inputIndex, 0, chunkSize, 0, 0);
350
+ inputOffset += chunkSize;
351
+ }
352
+ } else {
353
+ int inputIndex = encoder.dequeueInputBuffer(10000);
354
+ if (inputIndex >= 0) {
355
+ encoder.queueInputBuffer(inputIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
356
+ }
357
+ }
358
+
359
+ // Get output
360
+ int outputIndex = encoder.dequeueOutputBuffer(bufferInfo, 10000);
361
+
362
+ if (outputIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
363
+ MediaFormat newFormat = encoder.getOutputFormat();
364
+ trackIndex = muxer.addTrack(newFormat);
365
+ muxer.start();
366
+ muxerStarted = true;
367
+ } else if (outputIndex >= 0) {
368
+ ByteBuffer outputBuffer = outputBuffers[outputIndex];
369
+
370
+ if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0 && bufferInfo.size != 0 && muxerStarted) {
371
+ muxer.writeSampleData(trackIndex, outputBuffer, bufferInfo);
372
+ }
373
+
374
+ encoder.releaseOutputBuffer(outputIndex, false);
375
+
376
+ if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
377
+ done = true;
378
+ }
379
+ }
380
+ }
381
+
382
+ } finally {
383
+ if (encoder != null) {
384
+ encoder.stop();
385
+ encoder.release();
386
+ }
387
+ if (muxer != null) {
388
+ muxer.stop();
389
+ muxer.release();
390
+ }
391
+ }
392
+ }
393
+
394
+
395
+
396
+ //////////////////////
397
+ // Recording functionality disabled - commented out
398
+ /*
399
+ private float mWave = 0;
400
+ private boolean mIsRecording = false;
401
+ private static String FILE_PATH = Environment.getExternalStorageDirectory().toString()+"/1111.pcm";
402
+ private FileOutputStream mFos = null;
403
+
404
+ private void startRec(){
405
+ mIsRecording = true;
406
+ mWave = 0;
407
+ try {
408
+ mFos = new FileOutputStream(FILE_PATH);
409
+ } catch (FileNotFoundException e) {
410
+ }
411
+ }
412
+ private void writeRecData(byte[]data, int offset, int len)
413
+ {
414
+ if(len == 0){
415
+ return;
416
+ }
417
+ for(int i = 0; i < len; i++){
418
+ mWave += data[i] * data[i];
419
+ }
420
+ if(mFos != null) {
421
+ try {
422
+ mFos.write(data);
423
+ mWave = mWave / (float)len;
424
+ } catch (IOException e) {
425
+ }
426
+ }
427
+ }
428
+ private void stopRec()
429
+ {
430
+ mIsRecording = false;
431
+ if(mFos != null)
432
+ {
433
+ try {
434
+ mFos.close();
435
+ } catch (IOException e) {
436
+ }
437
+ mFos = null;
438
+ }
439
+ }
440
+ */
441
+ }