@glassly/bluetooth-sdk 0.1.0-dev.26

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 (548) hide show
  1. package/README.md +563 -0
  2. package/android/build.gradle +450 -0
  3. package/android/gradle.properties.example +9 -0
  4. package/android/lc3Lib/CMakeLists.txt +6 -0
  5. package/android/lc3Lib/build.gradle +212 -0
  6. package/android/lc3Lib/proguard-rules.pro +33 -0
  7. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  8. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  26. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  81. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  82. package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
  83. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  86. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  119. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  120. package/android/settings.gradle +4 -0
  121. package/android/silero/LICENSE.md +17 -0
  122. package/android/silero/build.gradle +50 -0
  123. package/android/silero/proguard-rules.pro +24 -0
  124. package/android/silero/src/androidTest/assets/hello.wav +0 -0
  125. package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
  126. package/android/silero/src/main/assets/LICENSE +21 -0
  127. package/android/silero/src/main/assets/silero_vad.onnx +0 -0
  128. package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
  129. package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
  130. package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
  131. package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
  132. package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
  133. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
  134. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
  135. package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
  136. package/android/src/main/AndroidManifest.xml +42 -0
  137. package/android/src/main/assets/G2Firmware/README.md +11 -0
  138. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
  139. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
  140. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
  141. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
  142. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
  143. package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
  144. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
  145. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
  146. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
  147. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
  148. package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
  149. package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
  150. package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
  151. package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
  152. package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
  153. package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
  154. package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
  155. package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
  156. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  157. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
  158. package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
  159. package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
  160. package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
  161. package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
  162. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
  163. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
  164. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
  165. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
  166. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
  167. package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
  168. package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
  169. package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
  170. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
  171. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
  172. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
  173. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
  174. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
  175. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
  176. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
  177. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
  178. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
  179. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
  180. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
  181. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
  182. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
  183. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
  184. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
  185. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
  186. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
  187. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
  188. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
  189. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
  190. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
  191. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
  192. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
  193. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
  194. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
  195. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
  196. package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
  197. package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
  198. package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
  199. package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
  200. package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
  201. package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
  202. package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
  203. package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
  204. package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
  205. package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
  206. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
  207. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  208. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
  209. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  210. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
  211. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
  212. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
  213. package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
  214. package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
  215. package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
  216. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  217. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
  218. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
  219. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
  220. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
  221. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
  222. package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
  223. package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
  224. package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  225. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
  226. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  227. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  228. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  229. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
  230. package/android/src/main/res/values/strings.xml +4 -0
  231. package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
  232. package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
  233. package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
  234. package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
  235. package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
  236. package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
  237. package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
  238. package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
  239. package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
  240. package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
  241. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
  242. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
  243. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
  244. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
  245. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
  246. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
  247. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
  248. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
  249. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
  250. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
  251. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
  252. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
  253. package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
  254. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
  255. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
  256. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
  257. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
  258. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
  259. package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
  260. package/android/src/test/resources/avif_with_exif.avif +0 -0
  261. package/app.plugin.js +3 -0
  262. package/build/BluetoothSdk.types.d.ts +1354 -0
  263. package/build/BluetoothSdk.types.d.ts.map +1 -0
  264. package/build/BluetoothSdk.types.js +41 -0
  265. package/build/BluetoothSdk.types.js.map +1 -0
  266. package/build/_internal.d.ts +17 -0
  267. package/build/_internal.d.ts.map +1 -0
  268. package/build/_internal.js +16 -0
  269. package/build/_internal.js.map +1 -0
  270. package/build/_private/BluetoothSdkModule.d.ts +172 -0
  271. package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
  272. package/build/_private/BluetoothSdkModule.js +300 -0
  273. package/build/_private/BluetoothSdkModule.js.map +1 -0
  274. package/build/_private/LocalNetworkModule.d.ts +38 -0
  275. package/build/_private/LocalNetworkModule.d.ts.map +1 -0
  276. package/build/_private/LocalNetworkModule.js +3 -0
  277. package/build/_private/LocalNetworkModule.js.map +1 -0
  278. package/build/_private/cameraRequestPayload.d.ts +4 -0
  279. package/build/_private/cameraRequestPayload.d.ts.map +1 -0
  280. package/build/_private/cameraRequestPayload.js +32 -0
  281. package/build/_private/cameraRequestPayload.js.map +1 -0
  282. package/build/_private/photoRequestPayload.d.ts +6 -0
  283. package/build/_private/photoRequestPayload.d.ts.map +1 -0
  284. package/build/_private/photoRequestPayload.js +86 -0
  285. package/build/_private/photoRequestPayload.js.map +1 -0
  286. package/build/_private/sdkOtaManifest.d.ts +11 -0
  287. package/build/_private/sdkOtaManifest.d.ts.map +1 -0
  288. package/build/_private/sdkOtaManifest.js +15 -0
  289. package/build/_private/sdkOtaManifest.js.map +1 -0
  290. package/build/changelogs.d.ts +7 -0
  291. package/build/changelogs.d.ts.map +1 -0
  292. package/build/changelogs.js +46 -0
  293. package/build/changelogs.js.map +1 -0
  294. package/build/debug.d.ts +3 -0
  295. package/build/debug.d.ts.map +1 -0
  296. package/build/debug.js +8 -0
  297. package/build/debug.js.map +1 -0
  298. package/build/generated/changelogCatalog.d.ts +9 -0
  299. package/build/generated/changelogCatalog.d.ts.map +1 -0
  300. package/build/generated/changelogCatalog.js +12 -0
  301. package/build/generated/changelogCatalog.js.map +1 -0
  302. package/build/generated/releaseMetadata.d.ts +12 -0
  303. package/build/generated/releaseMetadata.d.ts.map +1 -0
  304. package/build/generated/releaseMetadata.js +10 -0
  305. package/build/generated/releaseMetadata.js.map +1 -0
  306. package/build/index.d.ts +6 -0
  307. package/build/index.d.ts.map +1 -0
  308. package/build/index.js +171 -0
  309. package/build/index.js.map +1 -0
  310. package/build/ota-server/OtaServer.types.d.ts +14 -0
  311. package/build/ota-server/OtaServer.types.d.ts.map +1 -0
  312. package/build/ota-server/OtaServer.types.js +2 -0
  313. package/build/ota-server/OtaServer.types.js.map +1 -0
  314. package/build/ota-server/OtaServerModule.d.ts +21 -0
  315. package/build/ota-server/OtaServerModule.d.ts.map +1 -0
  316. package/build/ota-server/OtaServerModule.js +3 -0
  317. package/build/ota-server/OtaServerModule.js.map +1 -0
  318. package/build/ota-server/OtaServerModule.web.d.ts +10 -0
  319. package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
  320. package/build/ota-server/OtaServerModule.web.js +12 -0
  321. package/build/ota-server/OtaServerModule.web.js.map +1 -0
  322. package/build/ota-server/index.d.ts +3 -0
  323. package/build/ota-server/index.d.ts.map +1 -0
  324. package/build/ota-server/index.js +3 -0
  325. package/build/ota-server/index.js.map +1 -0
  326. package/build/ota-transport/index.d.ts +67 -0
  327. package/build/ota-transport/index.d.ts.map +1 -0
  328. package/build/ota-transport/index.js +58 -0
  329. package/build/ota-transport/index.js.map +1 -0
  330. package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
  331. package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
  332. package/build/photo-receiver/PhotoReceiver.types.js +2 -0
  333. package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
  334. package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
  335. package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
  336. package/build/photo-receiver/PhotoReceiverModule.js +3 -0
  337. package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
  338. package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
  339. package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
  340. package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
  341. package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
  342. package/build/photo-receiver/index.d.ts +3 -0
  343. package/build/photo-receiver/index.d.ts.map +1 -0
  344. package/build/photo-receiver/index.js +3 -0
  345. package/build/photo-receiver/index.js.map +1 -0
  346. package/build/react/index.d.ts +5 -0
  347. package/build/react/index.d.ts.map +1 -0
  348. package/build/react/index.js +4 -0
  349. package/build/react/index.js.map +1 -0
  350. package/build/react/useBluetooth.d.ts +100 -0
  351. package/build/react/useBluetooth.d.ts.map +1 -0
  352. package/build/react/useBluetooth.js +167 -0
  353. package/build/react/useBluetooth.js.map +1 -0
  354. package/build/react/useBluetoothEvent.d.ts +6 -0
  355. package/build/react/useBluetoothEvent.d.ts.map +1 -0
  356. package/build/react/useBluetoothEvent.js +21 -0
  357. package/build/react/useBluetoothEvent.js.map +1 -0
  358. package/build/react/useBluetoothScan.d.ts +22 -0
  359. package/build/react/useBluetoothScan.d.ts.map +1 -0
  360. package/build/react/useBluetoothScan.js +135 -0
  361. package/build/react/useBluetoothScan.js.map +1 -0
  362. package/build/react/useBluetoothStatus.d.ts +16 -0
  363. package/build/react/useBluetoothStatus.d.ts.map +1 -0
  364. package/build/react/useBluetoothStatus.js +137 -0
  365. package/build/react/useBluetoothStatus.js.map +1 -0
  366. package/build/react/useGlassesConnection.d.ts +29 -0
  367. package/build/react/useGlassesConnection.d.ts.map +1 -0
  368. package/build/react/useGlassesConnection.js +153 -0
  369. package/build/react/useGlassesConnection.js.map +1 -0
  370. package/build/types/index.d.ts +3 -0
  371. package/build/types/index.d.ts.map +1 -0
  372. package/build/types/index.js +2 -0
  373. package/build/types/index.js.map +1 -0
  374. package/expo-module.config.json +14 -0
  375. package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
  376. package/ios/BluetoothSdkModule.swift +1034 -0
  377. package/ios/GlasslyBluetoothSDK.podspec +106 -0
  378. package/ios/LocalIPv4.swift +150 -0
  379. package/ios/LocalOtaServer.swift +309 -0
  380. package/ios/LocalPhotoUploadServer.swift +754 -0
  381. package/ios/OtaServerModule.swift +147 -0
  382. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  383. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  384. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  385. package/ios/Packages/CoreObjC/attdet.c +92 -0
  386. package/ios/Packages/CoreObjC/attdet.h +44 -0
  387. package/ios/Packages/CoreObjC/bits.c +375 -0
  388. package/ios/Packages/CoreObjC/bits.h +315 -0
  389. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  390. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  391. package/ios/Packages/CoreObjC/common.h +151 -0
  392. package/ios/Packages/CoreObjC/energy.c +70 -0
  393. package/ios/Packages/CoreObjC/energy.h +43 -0
  394. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  395. package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
  396. package/ios/Packages/CoreObjC/lc3.c +704 -0
  397. package/ios/Packages/CoreObjC/lc3.h +313 -0
  398. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  399. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  400. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  401. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  402. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  403. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  404. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  405. package/ios/Packages/CoreObjC/mdct.c +469 -0
  406. package/ios/Packages/CoreObjC/mdct.h +57 -0
  407. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  408. package/ios/Packages/CoreObjC/meson.build +61 -0
  409. package/ios/Packages/CoreObjC/plc.c +61 -0
  410. package/ios/Packages/CoreObjC/plc.h +57 -0
  411. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  412. package/ios/Packages/CoreObjC/sns.c +880 -0
  413. package/ios/Packages/CoreObjC/sns.h +103 -0
  414. package/ios/Packages/CoreObjC/spec.c +907 -0
  415. package/ios/Packages/CoreObjC/spec.h +119 -0
  416. package/ios/Packages/CoreObjC/tables.c +3457 -0
  417. package/ios/Packages/CoreObjC/tables.h +94 -0
  418. package/ios/Packages/CoreObjC/tns.c +457 -0
  419. package/ios/Packages/CoreObjC/tns.h +99 -0
  420. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  421. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  422. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
  423. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
  424. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  425. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  426. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  427. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  428. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  429. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  430. package/ios/Packages/libbz2/module.modulemap +5 -0
  431. package/ios/Packages/libbz2/shim.h +1 -0
  432. package/ios/PhotoReceiverModule.swift +129 -0
  433. package/ios/Source/BluetoothSDK.swift +2303 -0
  434. package/ios/Source/BluetoothSDKDebug.swift +12 -0
  435. package/ios/Source/BluetoothSdkDefaults.swift +29 -0
  436. package/ios/Source/Bridge.swift +708 -0
  437. package/ios/Source/Bridging-Header.h +16 -0
  438. package/ios/Source/DeviceManager.swift +2109 -0
  439. package/ios/Source/DeviceStore.swift +336 -0
  440. package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
  441. package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
  442. package/ios/Source/ObservableStore.swift +118 -0
  443. package/ios/Source/OtaManifest.swift +211 -0
  444. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  445. package/ios/Source/ReleaseChangelog.swift +65 -0
  446. package/ios/Source/Resources/G2Firmware/README.md +10 -0
  447. package/ios/Source/audio/AudioModels.swift +178 -0
  448. package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
  449. package/ios/Source/camera/CameraModels.swift +866 -0
  450. package/ios/Source/connection/ScanSession.swift +27 -0
  451. package/ios/Source/controllers/ControllerManager.swift +184 -0
  452. package/ios/Source/controllers/R1.swift +829 -0
  453. package/ios/Source/errors/BluetoothSdkError.swift +19 -0
  454. package/ios/Source/events/BluetoothEvents.swift +342 -0
  455. package/ios/Source/internal/BleTraceLogger.swift +192 -0
  456. package/ios/Source/internal/BluetoothAvailability.swift +78 -0
  457. package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
  458. package/ios/Source/internal/ValueParsing.swift +99 -0
  459. package/ios/Source/requests/DisplayRequests.swift +82 -0
  460. package/ios/Source/services/PhoneMic.swift +662 -0
  461. package/ios/Source/sgcs/Ar99.swift +2451 -0
  462. package/ios/Source/sgcs/Frame.swift +649 -0
  463. package/ios/Source/sgcs/G1.swift +2554 -0
  464. package/ios/Source/sgcs/G2.swift +6887 -0
  465. package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
  466. package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
  467. package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
  468. package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
  469. package/ios/Source/sgcs/G2Flasher.swift +773 -0
  470. package/ios/Source/sgcs/Mach1.swift +541 -0
  471. package/ios/Source/sgcs/MentraLive.swift +7011 -0
  472. package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
  473. package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
  474. package/ios/Source/sgcs/MentraNex.swift +3221 -0
  475. package/ios/Source/sgcs/Nimo.swift +1886 -0
  476. package/ios/Source/sgcs/SGCManager.swift +608 -0
  477. package/ios/Source/sgcs/Simulated.swift +274 -0
  478. package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
  479. package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
  480. package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
  481. package/ios/Source/status/DeviceStatus.swift +981 -0
  482. package/ios/Source/status/RuntimeState.swift +359 -0
  483. package/ios/Source/status/WifiHotspotStatus.swift +345 -0
  484. package/ios/Source/streaming/StreamModels.swift +693 -0
  485. package/ios/Source/stt/STTTools.swift +191 -0
  486. package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
  487. package/ios/Source/tts/TTSTools.swift +171 -0
  488. package/ios/Source/types/DeviceModels.swift +177 -0
  489. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  490. package/ios/Source/utils/BinaryCodec.swift +61 -0
  491. package/ios/Source/utils/BleJsonCompact.swift +405 -0
  492. package/ios/Source/utils/BleWireProtocol.swift +92 -0
  493. package/ios/Source/utils/Constants.swift +78 -0
  494. package/ios/Source/utils/Enums.swift +95 -0
  495. package/ios/Source/utils/G1Text.swift +2096 -0
  496. package/ios/Source/utils/JSCExperiment.swift +241 -0
  497. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  498. package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
  499. package/ios/Source/utils/MessageChunker.swift +294 -0
  500. package/ios/Source/utils/Models.swift +135 -0
  501. package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
  502. package/ios/Source/utils/TarBz2Extractor.swift +257 -0
  503. package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
  504. package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
  505. package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
  506. package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
  507. package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
  508. package/ios/Tests/ReleaseChangelogTests.swift +13 -0
  509. package/package.json +129 -0
  510. package/plugin/build/index.d.ts +10 -0
  511. package/plugin/build/index.js +12 -0
  512. package/plugin/build/withAndroid.d.ts +3 -0
  513. package/plugin/build/withAndroid.js +190 -0
  514. package/plugin/build/withIos.d.ts +5 -0
  515. package/plugin/build/withIos.js +108 -0
  516. package/scripts/inject-ios-sdk-version.mjs +65 -0
  517. package/scripts/public-ota-api.test.mjs +37 -0
  518. package/scripts/verify-release-package.mjs +45 -0
  519. package/scripts/write-release-metadata.mjs +152 -0
  520. package/scripts/write-release-metadata.test.mjs +37 -0
  521. package/src/BluetoothSdk.types.ts +1623 -0
  522. package/src/_internal.ts +16 -0
  523. package/src/_private/BluetoothSdkModule.ts +684 -0
  524. package/src/_private/LocalNetworkModule.ts +50 -0
  525. package/src/_private/cameraRequestPayload.ts +34 -0
  526. package/src/_private/photoRequestPayload.ts +90 -0
  527. package/src/_private/sdkOtaManifest.ts +18 -0
  528. package/src/changelogs.ts +46 -0
  529. package/src/debug.ts +9 -0
  530. package/src/generated/changelogCatalog.ts +13 -0
  531. package/src/generated/releaseMetadata.ts +20 -0
  532. package/src/index.ts +321 -0
  533. package/src/ota-server/OtaServer.types.ts +10 -0
  534. package/src/ota-server/OtaServerModule.ts +23 -0
  535. package/src/ota-server/OtaServerModule.web.ts +17 -0
  536. package/src/ota-server/index.ts +2 -0
  537. package/src/ota-transport/index.ts +116 -0
  538. package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
  539. package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
  540. package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
  541. package/src/photo-receiver/index.ts +2 -0
  542. package/src/react/index.ts +21 -0
  543. package/src/react/useBluetooth.ts +309 -0
  544. package/src/react/useBluetoothEvent.ts +35 -0
  545. package/src/react/useBluetoothScan.ts +173 -0
  546. package/src/react/useBluetoothStatus.ts +180 -0
  547. package/src/react/useGlassesConnection.ts +202 -0
  548. package/src/types/index.ts +12 -0
@@ -0,0 +1,147 @@
1
+ import ExpoModulesCore
2
+ import Foundation
3
+
4
+ /// Expo surface for the hotspot-served OTA file server (OS-1676).
5
+ ///
6
+ /// JS hands over the rewritten manifest body and a map of sha256 -> local file path, and gets
7
+ /// back the base URL the glasses should be pointed at via ota_start. The optional host
8
+ /// argument lets the caller pass an authoritative address; otherwise interface scanning is
9
+ /// used (under a glasses-hotspot session en0 holds the hotspot client address).
10
+ public class OtaServerModule: Module {
11
+ private let serverLock = NSLock()
12
+ private var otaServer: LocalOtaServer?
13
+ private lazy var artifactDownloader = BackgroundOtaArtifactDownloader { [weak self] destination, written, total in
14
+ self?.sendEvent("artifactDownloadProgress", [
15
+ "destination": destination,
16
+ "bytesWritten": written,
17
+ "contentLength": total,
18
+ ])
19
+ }
20
+
21
+ public func definition() -> ModuleDefinition {
22
+ Name("OtaServer")
23
+
24
+ Events("artifactDownloadProgress")
25
+
26
+ AsyncFunction("startOtaServer") { (manifestJson: String, artifactPaths: [String: String], host: String?) -> [String: Any] in
27
+ try self.startOtaServer(manifestJson: manifestJson, artifactPaths: artifactPaths, hostOverride: host)
28
+ }
29
+
30
+ AsyncFunction("stopOtaServer") {
31
+ self.stopOtaServerInternal()
32
+ }
33
+
34
+ AsyncFunction("waitForWifiAddress") { (gateway: String, timeoutMs: Int) -> String in
35
+ try await self.waitForWifiAddress(gateway: gateway, timeoutMs: timeoutMs)
36
+ }
37
+
38
+ AsyncFunction("downloadArtifact") { (source: String, destination: String) in
39
+ try await self.artifactDownloader.download(from: source, to: destination)
40
+ }
41
+
42
+ OnDestroy {
43
+ self.stopOtaServerInternal()
44
+ }
45
+ }
46
+
47
+ private func startOtaServer(
48
+ manifestJson: String,
49
+ artifactPaths: [String: String],
50
+ hostOverride: String?
51
+ ) throws -> [String: Any] {
52
+ serverLock.lock()
53
+ defer { serverLock.unlock() }
54
+
55
+ var artifacts: [String: URL] = [:]
56
+ for (key, path) in artifactPaths {
57
+ let url = path.hasPrefix("file://")
58
+ ? (URL(string: path) ?? URL(fileURLWithPath: String(path.dropFirst("file://".count))))
59
+ : URL(fileURLWithPath: path)
60
+ guard FileManager.default.fileExists(atPath: url.path) else {
61
+ throw OtaServerModuleError("Artifact \(key) not found at \(url.path)")
62
+ }
63
+ artifacts[key] = url
64
+ }
65
+
66
+ guard let host = hostOverride?.isEmpty == false ? hostOverride : LocalIPv4.bestLocalIPv4Address() else {
67
+ throw OtaServerModuleError("No Wi-Fi/LAN IPv4 address found for this phone.")
68
+ }
69
+
70
+ let server = otaServer ?? LocalOtaServer(
71
+ onLog: { [weak self] message in
72
+ self?.emitStatus(message: message)
73
+ }
74
+ )
75
+ otaServer = server
76
+ server.configure(manifestJson: manifestJson, artifacts: artifacts)
77
+
78
+ if let activePort = server.activePort {
79
+ emitStatus(message: "OTA server ready at http://\(host):\(activePort)/version.json")
80
+ return serverResult(host: host, port: activePort)
81
+ }
82
+
83
+ var lastError: Error?
84
+ for port in otaPorts {
85
+ do {
86
+ let actualPort = try server.start(host: host, port: UInt16(port))
87
+ emitStatus(message: "OTA server ready at http://\(host):\(actualPort)/version.json")
88
+ return serverResult(host: host, port: actualPort)
89
+ } catch {
90
+ lastError = error
91
+ emitStatus(message: "Port \(port) unavailable: \(error.localizedDescription)")
92
+ }
93
+ }
94
+
95
+ throw OtaServerModuleError(
96
+ "Could not start OTA server: \(lastError?.localizedDescription ?? "all ports unavailable")"
97
+ )
98
+ }
99
+
100
+ private func waitForWifiAddress(gateway: String, timeoutMs: Int) async throws -> String {
101
+ let deadline = Date().addingTimeInterval(Double(max(timeoutMs, 0)) / 1000.0)
102
+ repeat {
103
+ if let address = LocalIPv4.wifiIPv4Address(matchingGateway: gateway) {
104
+ return address
105
+ }
106
+ try await Task.sleep(nanoseconds: 250_000_000)
107
+ } while Date() < deadline
108
+
109
+ throw OtaServerModuleError("The iPhone did not join the glasses hotspot subnet.")
110
+ }
111
+
112
+ private func stopOtaServerInternal() {
113
+ serverLock.lock()
114
+ defer { serverLock.unlock() }
115
+
116
+ otaServer?.stop()
117
+ emitStatus(message: "OTA server stopped")
118
+ }
119
+
120
+ private func emitStatus(message: String) {
121
+ NSLog("[OtaServer] %@", message)
122
+ }
123
+
124
+ private func serverResult(host: String, port: UInt16) -> [String: Any] {
125
+ [
126
+ "baseUrl": "http://\(host):\(port)",
127
+ "manifestUrl": "http://\(host):\(port)/version.json",
128
+ "host": host,
129
+ "port": port,
130
+ ]
131
+ }
132
+
133
+ private let otaPorts = [8791, 8792, 8793, 8794]
134
+ }
135
+
136
+ final class OtaServerModuleError: Exception, @unchecked Sendable {
137
+ private let message: String
138
+
139
+ init(_ message: String) {
140
+ self.message = message
141
+ super.init()
142
+ }
143
+
144
+ override var reason: String {
145
+ message
146
+ }
147
+ }
@@ -0,0 +1,213 @@
1
+ // !$*UTF8*$!
2
+ {
3
+ archiveVersion = 1;
4
+ classes = {
5
+ };
6
+ objectVersion = 77;
7
+ objects = {
8
+
9
+ /* Begin PBXFileReference section */
10
+ C56BE8092D78E44000407B70 /* attdet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = attdet.c; sourceTree = "<group>"; };
11
+ C56BE80A2D78E44000407B70 /* makefile.mk */ = {isa = PBXFileReference; lastKnownFileType = text; path = makefile.mk; sourceTree = "<group>"; };
12
+ C56BE80B2D78E44000407B70 /* bwdet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bwdet.h; sourceTree = "<group>"; };
13
+ C56BE80C2D78E44000407B70 /* ltpf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ltpf.c; sourceTree = "<group>"; };
14
+ C56BE80D2D78E44000407B70 /* tables.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tables.c; sourceTree = "<group>"; };
15
+ C56BE80E2D78E44000407B70 /* spec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = spec.c; sourceTree = "<group>"; };
16
+ C56BE80F2D78E44000407B70 /* plc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = plc.c; sourceTree = "<group>"; };
17
+ C56BE8102D78E44000407B70 /* energy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = energy.c; sourceTree = "<group>"; };
18
+ C56BE8112D78E44000407B70 /* lc3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lc3.h; sourceTree = "<group>"; };
19
+ C56BE8122D78E44000407B70 /* rnnoise.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rnnoise.h; sourceTree = "<group>"; };
20
+ C56BE8132D78E44000407B70 /* lc3_private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lc3_private.h; sourceTree = "<group>"; };
21
+ C56BE8142D78E44000407B70 /* sns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sns.c; sourceTree = "<group>"; };
22
+ C56BE8152D78E44000407B70 /* mdct.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdct.c; sourceTree = "<group>"; };
23
+ C56BE8162D78E44000407B70 /* include */ = {isa = PBXFileReference; lastKnownFileType = folder; path = include; sourceTree = "<group>"; };
24
+ C56BE8172D78E44000407B70 /* tns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tns.c; sourceTree = "<group>"; };
25
+ C56BE8182D78E44000407B70 /* bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bits.c; sourceTree = "<group>"; };
26
+ C56BE8192D78E44000407B70 /* PcmConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PcmConverter.h; sourceTree = "<group>"; };
27
+ C56BE81A2D78E44000407B70 /* fastmath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fastmath.h; sourceTree = "<group>"; };
28
+ C56BE81B2D78E44000407B70 /* meson.build */ = {isa = PBXFileReference; lastKnownFileType = text; path = meson.build; sourceTree = "<group>"; };
29
+ C56BE81C2D78E44000407B70 /* spec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = spec.h; sourceTree = "<group>"; };
30
+ C56BE81D2D78E44000407B70 /* tables.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tables.h; sourceTree = "<group>"; };
31
+ C56BE81E2D78E44000407B70 /* ltpf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ltpf.h; sourceTree = "<group>"; };
32
+ C56BE81F2D78E44000407B70 /* bwdet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bwdet.c; sourceTree = "<group>"; };
33
+ C56BE8202D78E44000407B70 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
34
+ C56BE8212D78E44000407B70 /* attdet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = attdet.h; sourceTree = "<group>"; };
35
+ C56BE8222D78E44000407B70 /* lc3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lc3.c; sourceTree = "<group>"; };
36
+ C56BE8232D78E44000407B70 /* ltpf_neon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ltpf_neon.h; sourceTree = "<group>"; };
37
+ C56BE8242D78E44000407B70 /* energy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = energy.h; sourceTree = "<group>"; };
38
+ C56BE8252D78E44000407B70 /* plc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = plc.h; sourceTree = "<group>"; };
39
+ C56BE8262D78E44000407B70 /* lc3_cpp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lc3_cpp.h; sourceTree = "<group>"; };
40
+ C56BE8272D78E44000407B70 /* ltpf_arm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ltpf_arm.h; sourceTree = "<group>"; };
41
+ C56BE8282D78E44000407B70 /* mdct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mdct.h; sourceTree = "<group>"; };
42
+ C56BE8292D78E44000407B70 /* sns.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sns.h; sourceTree = "<group>"; };
43
+ C56BE82A2D78E44000407B70 /* mdct_neon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mdct_neon.h; sourceTree = "<group>"; };
44
+ C56BE82B2D78E44000407B70 /* PcmConverter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PcmConverter.m; sourceTree = "<group>"; };
45
+ C56BE82C2D78E44000407B70 /* bits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bits.h; sourceTree = "<group>"; };
46
+ C56BE82D2D78E44000407B70 /* tns.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tns.h; sourceTree = "<group>"; };
47
+ /* End PBXFileReference section */
48
+
49
+ /* Begin PBXGroup section */
50
+ C56BE8032D78E44000407B70 = {
51
+ isa = PBXGroup;
52
+ children = (
53
+ C56BE8092D78E44000407B70 /* attdet.c */,
54
+ C56BE80A2D78E44000407B70 /* makefile.mk */,
55
+ C56BE80B2D78E44000407B70 /* bwdet.h */,
56
+ C56BE80C2D78E44000407B70 /* ltpf.c */,
57
+ C56BE80D2D78E44000407B70 /* tables.c */,
58
+ C56BE80E2D78E44000407B70 /* spec.c */,
59
+ C56BE80F2D78E44000407B70 /* plc.c */,
60
+ C56BE8102D78E44000407B70 /* energy.c */,
61
+ C56BE8112D78E44000407B70 /* lc3.h */,
62
+ C56BE8122D78E44000407B70 /* rnnoise.h */,
63
+ C56BE8132D78E44000407B70 /* lc3_private.h */,
64
+ C56BE8142D78E44000407B70 /* sns.c */,
65
+ C56BE8152D78E44000407B70 /* mdct.c */,
66
+ C56BE8162D78E44000407B70 /* include */,
67
+ C56BE8172D78E44000407B70 /* tns.c */,
68
+ C56BE8182D78E44000407B70 /* bits.c */,
69
+ C56BE8192D78E44000407B70 /* PcmConverter.h */,
70
+ C56BE81A2D78E44000407B70 /* fastmath.h */,
71
+ C56BE81B2D78E44000407B70 /* meson.build */,
72
+ C56BE81C2D78E44000407B70 /* spec.h */,
73
+ C56BE81D2D78E44000407B70 /* tables.h */,
74
+ C56BE81E2D78E44000407B70 /* ltpf.h */,
75
+ C56BE81F2D78E44000407B70 /* bwdet.c */,
76
+ C56BE8202D78E44000407B70 /* common.h */,
77
+ C56BE8212D78E44000407B70 /* attdet.h */,
78
+ C56BE8222D78E44000407B70 /* lc3.c */,
79
+ C56BE8232D78E44000407B70 /* ltpf_neon.h */,
80
+ C56BE8242D78E44000407B70 /* energy.h */,
81
+ C56BE8252D78E44000407B70 /* plc.h */,
82
+ C56BE8262D78E44000407B70 /* lc3_cpp.h */,
83
+ C56BE8272D78E44000407B70 /* ltpf_arm.h */,
84
+ C56BE8282D78E44000407B70 /* mdct.h */,
85
+ C56BE8292D78E44000407B70 /* sns.h */,
86
+ C56BE82A2D78E44000407B70 /* mdct_neon.h */,
87
+ C56BE82B2D78E44000407B70 /* PcmConverter.m */,
88
+ C56BE82C2D78E44000407B70 /* bits.h */,
89
+ C56BE82D2D78E44000407B70 /* tns.h */,
90
+ );
91
+ sourceTree = "<group>";
92
+ };
93
+ /* End PBXGroup section */
94
+
95
+ /* Begin PBXLegacyTarget section */
96
+ C56BE8082D78E44000407B70 /* CoreObjC */ = {
97
+ isa = PBXLegacyTarget;
98
+ buildArgumentsString = "$(ACTION)";
99
+ buildConfigurationList = C56BE82E2D78E44000407B70 /* Build configuration list for PBXLegacyTarget "CoreObjC" */;
100
+ buildPhases = (
101
+ );
102
+ buildToolPath = /usr/bin/make;
103
+ buildWorkingDirectory = /Users/fosse/dev/AugmentOS/mobile/ios/Packages/CoreObjC;
104
+ dependencies = (
105
+ );
106
+ name = CoreObjC;
107
+ packageProductDependencies = (
108
+ );
109
+ passBuildSettingsInEnvironment = 1;
110
+ productName = CoreObjC;
111
+ };
112
+ /* End PBXLegacyTarget section */
113
+
114
+ /* Begin PBXProject section */
115
+ C56BE8042D78E44000407B70 /* Project object */ = {
116
+ isa = PBXProject;
117
+ attributes = {
118
+ BuildIndependentTargetsInParallel = 1;
119
+ };
120
+ buildConfigurationList = C56BE8072D78E44000407B70 /* Build configuration list for PBXProject "CoreObjC" */;
121
+ developmentRegion = en;
122
+ hasScannedForEncodings = 0;
123
+ knownRegions = (
124
+ en,
125
+ Base,
126
+ );
127
+ mainGroup = C56BE8032D78E44000407B70;
128
+ minimizedProjectReferenceProxies = 1;
129
+ preferredProjectObjectVersion = 77;
130
+ projectDirPath = "";
131
+ projectRoot = "";
132
+ targets = (
133
+ C56BE8082D78E44000407B70 /* CoreObjC */,
134
+ );
135
+ };
136
+ /* End PBXProject section */
137
+
138
+ /* Begin XCBuildConfiguration section */
139
+ C56BE8052D78E44000407B70 /* Debug */ = {
140
+ isa = XCBuildConfiguration;
141
+ buildSettings = {
142
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
143
+ COPY_PHASE_STRIP = NO;
144
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
145
+ GCC_WARN_UNUSED_VARIABLE = YES;
146
+ ONLY_ACTIVE_ARCH = YES;
147
+ SDKROOT = macosx10.6;
148
+ };
149
+ name = Debug;
150
+ };
151
+ C56BE8062D78E44000407B70 /* Release */ = {
152
+ isa = XCBuildConfiguration;
153
+ buildSettings = {
154
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
155
+ COPY_PHASE_STRIP = YES;
156
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
157
+ GCC_WARN_UNUSED_VARIABLE = YES;
158
+ SDKROOT = macosx10.6;
159
+ };
160
+ name = Release;
161
+ };
162
+ C56BE82F2D78E44000407B70 /* Debug */ = {
163
+ isa = XCBuildConfiguration;
164
+ buildSettings = {
165
+ COPY_PHASE_STRIP = NO;
166
+ DEBUGGING_SYMBOLS = YES;
167
+ GCC_DYNAMIC_NO_PIC = NO;
168
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
169
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
170
+ GCC_OPTIMIZATION_LEVEL = 0;
171
+ OTHER_CFLAGS = "";
172
+ OTHER_LDFLAGS = "";
173
+ PRODUCT_NAME = CoreObjC;
174
+ };
175
+ name = Debug;
176
+ };
177
+ C56BE8302D78E44000407B70 /* Release */ = {
178
+ isa = XCBuildConfiguration;
179
+ buildSettings = {
180
+ COPY_PHASE_STRIP = YES;
181
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
182
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
183
+ OTHER_CFLAGS = "";
184
+ OTHER_LDFLAGS = "";
185
+ PRODUCT_NAME = CoreObjC;
186
+ };
187
+ name = Release;
188
+ };
189
+ /* End XCBuildConfiguration section */
190
+
191
+ /* Begin XCConfigurationList section */
192
+ C56BE8072D78E44000407B70 /* Build configuration list for PBXProject "CoreObjC" */ = {
193
+ isa = XCConfigurationList;
194
+ buildConfigurations = (
195
+ C56BE8052D78E44000407B70 /* Debug */,
196
+ C56BE8062D78E44000407B70 /* Release */,
197
+ );
198
+ defaultConfigurationIsVisible = 0;
199
+ defaultConfigurationName = Release;
200
+ };
201
+ C56BE82E2D78E44000407B70 /* Build configuration list for PBXLegacyTarget "CoreObjC" */ = {
202
+ isa = XCConfigurationList;
203
+ buildConfigurations = (
204
+ C56BE82F2D78E44000407B70 /* Debug */,
205
+ C56BE8302D78E44000407B70 /* Release */,
206
+ );
207
+ defaultConfigurationIsVisible = 0;
208
+ defaultConfigurationName = Release;
209
+ };
210
+ /* End XCConfigurationList section */
211
+ };
212
+ rootObject = C56BE8042D78E44000407B70 /* Project object */;
213
+ }
@@ -0,0 +1,22 @@
1
+ //
2
+ // PcmConverter.h
3
+ // Runner
4
+ //
5
+ // Created by Hawk on 2024/3/14.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+
10
+ NS_ASSUME_NONNULL_BEGIN
11
+
12
+ @interface PcmConverter : NSObject
13
+ + (void)setupStaticEncoderAndDecoder;
14
+ -(NSMutableData *)decode: (NSData *)lc3data frameSize:(NSInteger)frameSize;
15
+ -(NSMutableData *)encode: (NSData *)pcmdata frameSize:(NSInteger)frameSize;
16
+ -(void)setOutputFrameSize:(NSInteger)frameSize;
17
+ -(NSInteger)getOutputFrameSize;
18
+ -(void)resetEncoder;
19
+ -(void)resetDecoder;
20
+ @end
21
+
22
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,266 @@
1
+ //
2
+ // PcmConverter.m
3
+ // Runner
4
+ //
5
+ // Created by Hawk on 2024/3/14.
6
+ //
7
+
8
+ #import "PcmConverter.h"
9
+ #import "lc3.h"
10
+
11
+ @implementation PcmConverter {
12
+ // Instance variables for persistent decoder
13
+ lc3_decoder_t _lc3_decoder;
14
+ void* _decMem;
15
+ unsigned char* _outBuf;
16
+ BOOL _decoderInitialized;
17
+
18
+ // Decoder parameters
19
+ unsigned _decodeSize;
20
+ uint16_t _sampleOfFrames;
21
+ uint16_t _bytesOfFrames;
22
+
23
+ // Instance variables for persistent encoder
24
+ lc3_encoder_t _lc3_encoder;
25
+ void* _encMem;
26
+ unsigned char* _encOutBuf;
27
+ BOOL _encoderInitialized;
28
+ unsigned _encodeSize;
29
+
30
+ // Sample accumulation buffer for encoder
31
+ // LC3 requires exactly 160 samples (320 bytes) per frame at 16kHz/10ms
32
+ // iOS audio callbacks may not align with frame boundaries, so we accumulate samples
33
+ NSMutableData* _encAccumulationBuffer;
34
+
35
+ // Configurable output frame size (determines bitrate)
36
+ // 20 bytes = 16kbps, 40 bytes = 32kbps, 60 bytes = 48kbps
37
+ uint16_t _outputFrameSize;
38
+ }
39
+
40
+ // Frame length 10ms
41
+ static const int dtUs = 10000;
42
+ // Sampling rate 16kHz
43
+ static const int srHz = 16000;
44
+ // Default output bytes after encoding a single frame (can be changed via setOutputFrameSize)
45
+ static const uint16_t defaultOutputByteCount = 20;
46
+
47
+ - (instancetype)init {
48
+ self = [super init];
49
+ if (self) {
50
+ _decoderInitialized = NO;
51
+ _decMem = NULL;
52
+ _outBuf = NULL;
53
+ _encoderInitialized = NO;
54
+ _encMem = NULL;
55
+ _encOutBuf = NULL;
56
+ _encAccumulationBuffer = [[NSMutableData alloc] init];
57
+ _outputFrameSize = defaultOutputByteCount;
58
+ }
59
+ return self;
60
+ }
61
+
62
+ - (void)setOutputFrameSize:(NSInteger)frameSize {
63
+ // Validate frame size (20, 40, or 60 bytes)
64
+ if (frameSize != 20 && frameSize != 40 && frameSize != 60) {
65
+ printf("Invalid frame size %ld, must be 20, 40, or 60. Using default.\n", (long)frameSize);
66
+ _outputFrameSize = defaultOutputByteCount;
67
+ return;
68
+ }
69
+
70
+ // If encoder is already initialized and frame size is changing, we need to reallocate output buffer
71
+ if (_encoderInitialized && _outputFrameSize != frameSize) {
72
+ if (_encOutBuf) {
73
+ free(_encOutBuf);
74
+ }
75
+ _encOutBuf = malloc(frameSize);
76
+ if (_encOutBuf == NULL) {
77
+ printf("Failed to reallocate encoder output buffer for new frame size\n");
78
+ _encoderInitialized = NO;
79
+ return;
80
+ }
81
+ }
82
+
83
+ _outputFrameSize = (uint16_t)frameSize;
84
+ }
85
+
86
+ - (void)setupDecoder {
87
+ if (_decoderInitialized) {
88
+ return; // Already initialized
89
+ }
90
+
91
+ _decodeSize = lc3_decoder_size(dtUs, srHz);
92
+ _sampleOfFrames = lc3_frame_samples(dtUs, srHz);
93
+ _bytesOfFrames = _sampleOfFrames * 2;
94
+
95
+ _decMem = malloc(_decodeSize);
96
+ if (_decMem == NULL) {
97
+ printf("Failed to allocate memory for decoder\n");
98
+ return;
99
+ }
100
+
101
+ _lc3_decoder = lc3_setup_decoder(dtUs, srHz, 0, _decMem);
102
+
103
+ _outBuf = malloc(_bytesOfFrames);
104
+ if (_outBuf == NULL) {
105
+ printf("Failed to allocate memory for outBuf\n");
106
+ free(_decMem);
107
+ _decMem = NULL;
108
+ return;
109
+ }
110
+
111
+ _decoderInitialized = YES;
112
+ }
113
+
114
+ - (NSMutableData *)decode:(NSData *)lc3data frameSize:(NSInteger)frameSize {
115
+ if (lc3data == nil) {
116
+ printf("Failed to decode Base64 data\n");
117
+ return [[NSMutableData alloc] init];
118
+ }
119
+
120
+ // Setup decoder on first use
121
+ [self setupDecoder];
122
+
123
+ if (!_decoderInitialized) {
124
+ printf("Decoder not initialized\n");
125
+ return [[NSMutableData alloc] init];
126
+ }
127
+
128
+ int totalBytes = (int)lc3data.length;
129
+ int bytesRead = 0;
130
+
131
+ NSMutableData *pcmData = [[NSMutableData alloc] init];
132
+
133
+ while (bytesRead < totalBytes) {
134
+ int bytesToRead = MIN(frameSize, totalBytes - bytesRead);
135
+ NSRange range = NSMakeRange(bytesRead, bytesToRead);
136
+ NSData *subdata = [lc3data subdataWithRange:range];
137
+ unsigned char *inBuf = (unsigned char *)subdata.bytes;
138
+
139
+ lc3_decode(_lc3_decoder, inBuf, frameSize, LC3_PCM_FORMAT_S16, _outBuf, 1);
140
+
141
+ NSData *data = [NSData dataWithBytes:_outBuf length:_bytesOfFrames];
142
+ [pcmData appendData:data];
143
+ bytesRead += bytesToRead;
144
+ }
145
+
146
+ return pcmData;
147
+ }
148
+
149
+ - (void)resetDecoder {
150
+ // Call this if you need to reset the decoder state
151
+ if (_decoderInitialized && _decMem) {
152
+ _lc3_decoder = lc3_setup_decoder(dtUs, srHz, 0, _decMem);
153
+ }
154
+ }
155
+
156
+ - (void)resetEncoder {
157
+ // Call this when starting a new recording session to clear accumulated samples
158
+ // and reset encoder state for clean audio
159
+ [_encAccumulationBuffer setLength:0];
160
+ if (_encoderInitialized && _encMem) {
161
+ _lc3_encoder = lc3_setup_encoder(dtUs, srHz, 0, _encMem);
162
+ }
163
+ }
164
+
165
+ - (void)setupEncoder {
166
+ if (_encoderInitialized) {
167
+ return; // Already initialized
168
+ }
169
+
170
+ _encodeSize = lc3_encoder_size(dtUs, srHz);
171
+
172
+ _encMem = malloc(_encodeSize);
173
+ if (_encMem == NULL) {
174
+ printf("Failed to allocate memory for encoder\n");
175
+ return;
176
+ }
177
+
178
+ _lc3_encoder = lc3_setup_encoder(dtUs, srHz, 0, _encMem);
179
+
180
+ _encOutBuf = malloc(_outputFrameSize);
181
+ if (_encOutBuf == NULL) {
182
+ printf("Failed to allocate memory for encoder output buffer\n");
183
+ free(_encMem);
184
+ _encMem = NULL;
185
+ return;
186
+ }
187
+
188
+ _encoderInitialized = YES;
189
+ }
190
+
191
+ - (NSMutableData *)encode:(NSData *)pcmdata frameSize:(NSInteger)frameSize {
192
+ if (pcmdata == nil || pcmdata.length == 0) {
193
+ return [[NSMutableData alloc] init];
194
+ }
195
+
196
+ // Setup encoder on first use
197
+ [self setupEncoder];
198
+
199
+ if (!_encoderInitialized) {
200
+ printf("Encoder not initialized\n");
201
+ return [[NSMutableData alloc] init];
202
+ }
203
+
204
+ // if the frame size is not set to the passed in frame size, we need to reallocate the output buffer:
205
+ if (frameSize != _outputFrameSize) {
206
+ [self setOutputFrameSize:frameSize];
207
+ }
208
+
209
+ // LC3 frame size: 160 samples * 2 bytes = 320 bytes per frame
210
+ uint16_t bytesPerFrame = lc3_frame_samples(dtUs, srHz) * 2;
211
+
212
+ // Append new PCM data to accumulation buffer
213
+ [_encAccumulationBuffer appendData:pcmdata];
214
+
215
+ NSMutableData *lc3Data = [[NSMutableData alloc] init];
216
+ const int16_t *pcmSamples = (const int16_t *)_encAccumulationBuffer.bytes;
217
+ int totalBytes = (int)_encAccumulationBuffer.length;
218
+ int bytesRead = 0;
219
+
220
+ // Encode complete frames from the accumulation buffer
221
+ while (totalBytes - bytesRead >= bytesPerFrame) {
222
+ const int16_t *currentSamples = pcmSamples + (bytesRead / 2);
223
+ int result = lc3_encode(_lc3_encoder, LC3_PCM_FORMAT_S16, currentSamples, 1, _outputFrameSize, _encOutBuf);
224
+
225
+ if (result == 0) {
226
+ [lc3Data appendBytes:_encOutBuf length:_outputFrameSize];
227
+ }
228
+ bytesRead += bytesPerFrame;
229
+ }
230
+
231
+ // Keep leftover samples in the accumulation buffer for next call
232
+ if (bytesRead > 0) {
233
+ NSData *leftover = [_encAccumulationBuffer subdataWithRange:NSMakeRange(bytesRead, totalBytes - bytesRead)];
234
+ [_encAccumulationBuffer setLength:0];
235
+ [_encAccumulationBuffer appendData:leftover];
236
+ }
237
+
238
+ return lc3Data;
239
+ }
240
+
241
+ - (void)dealloc {
242
+ if (_decMem) {
243
+ free(_decMem);
244
+ _decMem = NULL;
245
+ }
246
+ if (_outBuf) {
247
+ free(_outBuf);
248
+ _outBuf = NULL;
249
+ }
250
+ _decoderInitialized = NO;
251
+
252
+ if (_encMem) {
253
+ free(_encMem);
254
+ _encMem = NULL;
255
+ }
256
+ if (_encOutBuf) {
257
+ free(_encOutBuf);
258
+ _encOutBuf = NULL;
259
+ }
260
+ if (_encAccumulationBuffer) {
261
+ [_encAccumulationBuffer setLength:0];
262
+ _encAccumulationBuffer = nil;
263
+ }
264
+ _encoderInitialized = NO;
265
+ }
266
+ @end