@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,704 @@
1
+ /******************************************************************************
2
+ *
3
+ * Copyright 2022 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ ******************************************************************************/
18
+
19
+ #include "lc3.h"
20
+
21
+ #include "common.h"
22
+ #include "bits.h"
23
+
24
+ #include "attdet.h"
25
+ #include "bwdet.h"
26
+ #include "ltpf.h"
27
+ #include "mdct.h"
28
+ #include "energy.h"
29
+ #include "sns.h"
30
+ #include "tns.h"
31
+ #include "spec.h"
32
+ #include "plc.h"
33
+
34
+
35
+ /**
36
+ * Frame side data
37
+ */
38
+
39
+ struct side_data {
40
+ enum lc3_bandwidth bw;
41
+ bool pitch_present;
42
+ lc3_ltpf_data_t ltpf;
43
+ lc3_sns_data_t sns;
44
+ lc3_tns_data_t tns;
45
+ lc3_spec_side_t spec;
46
+ };
47
+
48
+
49
+ /* ----------------------------------------------------------------------------
50
+ * General
51
+ * -------------------------------------------------------------------------- */
52
+
53
+ /**
54
+ * Resolve frame duration in us
55
+ * us Frame duration in us
56
+ * return Frame duration identifier, or LC3_NUM_DT
57
+ */
58
+ static enum lc3_dt resolve_dt(int us)
59
+ {
60
+ return us == 7500 ? LC3_DT_7M5 :
61
+ us == 10000 ? LC3_DT_10M : LC3_NUM_DT;
62
+ }
63
+
64
+ /**
65
+ * Resolve samplerate in Hz
66
+ * hz Samplerate in Hz
67
+ * return Sample rate identifier, or LC3_NUM_SRATE
68
+ */
69
+ static enum lc3_srate resolve_sr(int hz)
70
+ {
71
+ return hz == 8000 ? LC3_SRATE_8K : hz == 16000 ? LC3_SRATE_16K :
72
+ hz == 24000 ? LC3_SRATE_24K : hz == 32000 ? LC3_SRATE_32K :
73
+ hz == 48000 ? LC3_SRATE_48K : LC3_NUM_SRATE;
74
+ }
75
+
76
+ /**
77
+ * Return the number of PCM samples in a frame
78
+ */
79
+ int lc3_frame_samples(int dt_us, int sr_hz)
80
+ {
81
+ enum lc3_dt dt = resolve_dt(dt_us);
82
+ enum lc3_srate sr = resolve_sr(sr_hz);
83
+
84
+ if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
85
+ return -1;
86
+
87
+ return LC3_NS(dt, sr);
88
+ }
89
+
90
+ /**
91
+ * Return the size of frames, from bitrate
92
+ */
93
+ int lc3_frame_bytes(int dt_us, int bitrate)
94
+ {
95
+ if (resolve_dt(dt_us) >= LC3_NUM_DT)
96
+ return -1;
97
+
98
+ if (bitrate < LC3_MIN_BITRATE)
99
+ return LC3_MIN_FRAME_BYTES;
100
+
101
+ if (bitrate > LC3_MAX_BITRATE)
102
+ return LC3_MAX_FRAME_BYTES;
103
+
104
+ int nbytes = ((unsigned)bitrate * dt_us) / (1000*1000*8);
105
+
106
+ return LC3_CLIP(nbytes, LC3_MIN_FRAME_BYTES, LC3_MAX_FRAME_BYTES);
107
+ }
108
+
109
+ /**
110
+ * Resolve the bitrate, from the size of frames
111
+ */
112
+ int lc3_resolve_bitrate(int dt_us, int nbytes)
113
+ {
114
+ if (resolve_dt(dt_us) >= LC3_NUM_DT)
115
+ return -1;
116
+
117
+ if (nbytes < LC3_MIN_FRAME_BYTES)
118
+ return LC3_MIN_BITRATE;
119
+
120
+ if (nbytes > LC3_MAX_FRAME_BYTES)
121
+ return LC3_MAX_BITRATE;
122
+
123
+ int bitrate = ((unsigned)nbytes * (1000*1000*8) + dt_us/2) / dt_us;
124
+
125
+ return LC3_CLIP(bitrate, LC3_MIN_BITRATE, LC3_MAX_BITRATE);
126
+ }
127
+
128
+ /**
129
+ * Return algorithmic delay, as a number of samples
130
+ */
131
+ int lc3_delay_samples(int dt_us, int sr_hz)
132
+ {
133
+ enum lc3_dt dt = resolve_dt(dt_us);
134
+ enum lc3_srate sr = resolve_sr(sr_hz);
135
+
136
+ if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
137
+ return -1;
138
+
139
+ return (dt == LC3_DT_7M5 ? 8 : 5) * (LC3_SRATE_KHZ(sr) / 2);
140
+ }
141
+
142
+
143
+ /* ----------------------------------------------------------------------------
144
+ * Encoder
145
+ * -------------------------------------------------------------------------- */
146
+
147
+ /**
148
+ * Input PCM Samples from signed 16 bits
149
+ * encoder Encoder state
150
+ * pcm, stride Input PCM samples, and count between two consecutives
151
+ */
152
+ static void load_s16(
153
+ struct lc3_encoder *encoder, const void *_pcm, int stride)
154
+ {
155
+ const int16_t *pcm = _pcm;
156
+
157
+ enum lc3_dt dt = encoder->dt;
158
+ enum lc3_srate sr = encoder->sr_pcm;
159
+
160
+ int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
161
+ float *xs = encoder->x + encoder->xs_off;
162
+ int ns = LC3_NS(dt, sr);
163
+
164
+ for (int i = 0; i < ns; i++, pcm += stride)
165
+ xt[i] = *pcm, xs[i] = *pcm;
166
+ }
167
+
168
+ /**
169
+ * Input PCM Samples from signed 24 bits
170
+ * encoder Encoder state
171
+ * pcm, stride Input PCM samples, and count between two consecutives
172
+ */
173
+ static void load_s24(
174
+ struct lc3_encoder *encoder, const void *_pcm, int stride)
175
+ {
176
+ const int32_t *pcm = _pcm;
177
+
178
+ enum lc3_dt dt = encoder->dt;
179
+ enum lc3_srate sr = encoder->sr_pcm;
180
+
181
+ int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
182
+ float *xs = encoder->x + encoder->xs_off;
183
+ int ns = LC3_NS(dt, sr);
184
+
185
+ for (int i = 0; i < ns; i++, pcm += stride) {
186
+ xt[i] = *pcm >> 8;
187
+ xs[i] = ldexpf(*pcm, -8);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Input PCM Samples from signed 24 bits packed
193
+ * encoder Encoder state
194
+ * pcm, stride Input PCM samples, and count between two consecutives
195
+ */
196
+ static void load_s24_3le(
197
+ struct lc3_encoder *encoder, const void *_pcm, int stride)
198
+ {
199
+ const uint8_t *pcm = _pcm;
200
+
201
+ enum lc3_dt dt = encoder->dt;
202
+ enum lc3_srate sr = encoder->sr_pcm;
203
+
204
+ int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
205
+ float *xs = encoder->x + encoder->xs_off;
206
+ int ns = LC3_NS(dt, sr);
207
+
208
+ for (int i = 0; i < ns; i++, pcm += 3*stride) {
209
+ int32_t in = ((uint32_t)pcm[0] << 8) |
210
+ ((uint32_t)pcm[1] << 16) |
211
+ ((uint32_t)pcm[2] << 24) ;
212
+
213
+ xt[i] = in >> 16;
214
+ xs[i] = ldexpf(in, -16);
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Input PCM Samples from float 32 bits
220
+ * encoder Encoder state
221
+ * pcm, stride Input PCM samples, and count between two consecutives
222
+ */
223
+ static void load_float(
224
+ struct lc3_encoder *encoder, const void *_pcm, int stride)
225
+ {
226
+ const float *pcm = _pcm;
227
+
228
+ enum lc3_dt dt = encoder->dt;
229
+ enum lc3_srate sr = encoder->sr_pcm;
230
+
231
+ int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
232
+ float *xs = encoder->x + encoder->xs_off;
233
+ int ns = LC3_NS(dt, sr);
234
+
235
+ for (int i = 0; i < ns; i++, pcm += stride) {
236
+ xs[i] = ldexpf(*pcm, 15);
237
+ xt[i] = LC3_SAT16((int32_t)xs[i]);
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Frame Analysis
243
+ * encoder Encoder state
244
+ * nbytes Size in bytes of the frame
245
+ * side, xq Return frame data
246
+ */
247
+ static void analyze(struct lc3_encoder *encoder,
248
+ int nbytes, struct side_data *side, uint16_t *xq)
249
+ {
250
+ enum lc3_dt dt = encoder->dt;
251
+ enum lc3_srate sr = encoder->sr;
252
+ enum lc3_srate sr_pcm = encoder->sr_pcm;
253
+ int ns = LC3_NS(dt, sr_pcm);
254
+ int nt = LC3_NT(sr_pcm);
255
+
256
+ int16_t *xt = (int16_t *)encoder->x + encoder->xt_off;
257
+ float *xs = encoder->x + encoder->xs_off;
258
+ float *xd = encoder->x + encoder->xd_off;
259
+ float *xf = xs;
260
+
261
+ /* --- Temporal --- */
262
+
263
+ bool att = lc3_attdet_run(dt, sr_pcm, nbytes, &encoder->attdet, xt);
264
+
265
+ side->pitch_present =
266
+ lc3_ltpf_analyse(dt, sr_pcm, &encoder->ltpf, xt, &side->ltpf);
267
+
268
+ memmove(xt - nt, xt + (ns-nt), nt * sizeof(*xt));
269
+
270
+ /* --- Spectral --- */
271
+
272
+ float e[LC3_NUM_BANDS];
273
+
274
+ lc3_mdct_forward(dt, sr_pcm, sr, xs, xd, xf);
275
+
276
+ bool nn_flag = lc3_energy_compute(dt, sr, xf, e);
277
+ if (nn_flag)
278
+ lc3_ltpf_disable(&side->ltpf);
279
+
280
+ side->bw = lc3_bwdet_run(dt, sr, e);
281
+
282
+ lc3_sns_analyze(dt, sr, e, att, &side->sns, xf, xf);
283
+
284
+ lc3_tns_analyze(dt, side->bw, nn_flag, nbytes, &side->tns, xf);
285
+
286
+ lc3_spec_analyze(dt, sr,
287
+ nbytes, side->pitch_present, &side->tns,
288
+ &encoder->spec, xf, xq, &side->spec);
289
+ }
290
+
291
+ /**
292
+ * Encode bitstream
293
+ * encoder Encoder state
294
+ * side, xq The frame data
295
+ * nbytes Target size of the frame (20 to 400)
296
+ * buffer Output bitstream buffer of `nbytes` size
297
+ */
298
+ static void encode(struct lc3_encoder *encoder,
299
+ const struct side_data *side, uint16_t *xq, int nbytes, void *buffer)
300
+ {
301
+ enum lc3_dt dt = encoder->dt;
302
+ enum lc3_srate sr = encoder->sr;
303
+ enum lc3_bandwidth bw = side->bw;
304
+ float *xf = encoder->x + encoder->xs_off;
305
+
306
+ lc3_bits_t bits;
307
+
308
+ lc3_setup_bits(&bits, LC3_BITS_MODE_WRITE, buffer, nbytes);
309
+
310
+ lc3_bwdet_put_bw(&bits, sr, bw);
311
+
312
+ lc3_spec_put_side(&bits, dt, sr, &side->spec);
313
+
314
+ lc3_tns_put_data(&bits, &side->tns);
315
+
316
+ lc3_put_bit(&bits, side->pitch_present);
317
+
318
+ lc3_sns_put_data(&bits, &side->sns);
319
+
320
+ if (side->pitch_present)
321
+ lc3_ltpf_put_data(&bits, &side->ltpf);
322
+
323
+ lc3_spec_encode(&bits,
324
+ dt, sr, bw, nbytes, xq, &side->spec, xf);
325
+
326
+ lc3_flush_bits(&bits);
327
+ }
328
+
329
+ /**
330
+ * Return size needed for an encoder
331
+ */
332
+ unsigned lc3_encoder_size(int dt_us, int sr_hz)
333
+ {
334
+ if (resolve_dt(dt_us) >= LC3_NUM_DT ||
335
+ resolve_sr(sr_hz) >= LC3_NUM_SRATE)
336
+ return 0;
337
+
338
+ return sizeof(struct lc3_encoder) +
339
+ (LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1) * sizeof(float);
340
+ }
341
+
342
+ /**
343
+ * Setup encoder
344
+ */
345
+ struct lc3_encoder *lc3_setup_encoder(
346
+ int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
347
+ {
348
+ if (sr_pcm_hz <= 0)
349
+ sr_pcm_hz = sr_hz;
350
+
351
+ enum lc3_dt dt = resolve_dt(dt_us);
352
+ enum lc3_srate sr = resolve_sr(sr_hz);
353
+ enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
354
+
355
+ if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
356
+ return NULL;
357
+
358
+ struct lc3_encoder *encoder = mem;
359
+ int ns = LC3_NS(dt, sr_pcm);
360
+ int nt = LC3_NT(sr_pcm);
361
+
362
+ *encoder = (struct lc3_encoder){
363
+ .dt = dt, .sr = sr,
364
+ .sr_pcm = sr_pcm,
365
+
366
+ .xt_off = nt,
367
+ .xs_off = (nt + ns) / 2,
368
+ .xd_off = (nt + ns) / 2 + ns,
369
+ };
370
+
371
+ memset(encoder->x, 0,
372
+ LC3_ENCODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
373
+
374
+ return encoder;
375
+ }
376
+
377
+ /**
378
+ * Encode a frame
379
+ */
380
+ int lc3_encode(struct lc3_encoder *encoder, enum lc3_pcm_format fmt,
381
+ const void *pcm, int stride, int nbytes, void *out)
382
+ {
383
+ static void (* const load[])(struct lc3_encoder *, const void *, int) = {
384
+ [LC3_PCM_FORMAT_S16 ] = load_s16,
385
+ [LC3_PCM_FORMAT_S24 ] = load_s24,
386
+ [LC3_PCM_FORMAT_S24_3LE] = load_s24_3le,
387
+ [LC3_PCM_FORMAT_FLOAT ] = load_float,
388
+ };
389
+
390
+ /* --- Check parameters --- */
391
+
392
+ if (!encoder || nbytes < LC3_MIN_FRAME_BYTES
393
+ || nbytes > LC3_MAX_FRAME_BYTES)
394
+ return -1;
395
+
396
+ /* --- Processing --- */
397
+
398
+ struct side_data side;
399
+ uint16_t xq[LC3_MAX_NE];
400
+
401
+ load[fmt](encoder, pcm, stride);
402
+
403
+ analyze(encoder, nbytes, &side, xq);
404
+
405
+ encode(encoder, &side, xq, nbytes, out);
406
+
407
+ return 0;
408
+ }
409
+
410
+
411
+ /* ----------------------------------------------------------------------------
412
+ * Decoder
413
+ * -------------------------------------------------------------------------- */
414
+
415
+ /**
416
+ * Output PCM Samples to signed 16 bits
417
+ * decoder Decoder state
418
+ * pcm, stride Output PCM samples, and count between two consecutives
419
+ */
420
+ static void store_s16(
421
+ struct lc3_decoder *decoder, void *_pcm, int stride)
422
+ {
423
+ int16_t *pcm = _pcm;
424
+
425
+ enum lc3_dt dt = decoder->dt;
426
+ enum lc3_srate sr = decoder->sr_pcm;
427
+
428
+ float *xs = decoder->x + decoder->xs_off;
429
+ int ns = LC3_NS(dt, sr);
430
+
431
+ for ( ; ns > 0; ns--, xs++, pcm += stride) {
432
+ int32_t s = *xs >= 0 ? (int)(*xs + 0.5f) : (int)(*xs - 0.5f);
433
+ *pcm = LC3_SAT16(s);
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Output PCM Samples to signed 24 bits
439
+ * decoder Decoder state
440
+ * pcm, stride Output PCM samples, and count between two consecutives
441
+ */
442
+ static void store_s24(
443
+ struct lc3_decoder *decoder, void *_pcm, int stride)
444
+ {
445
+ int32_t *pcm = _pcm;
446
+
447
+ enum lc3_dt dt = decoder->dt;
448
+ enum lc3_srate sr = decoder->sr_pcm;
449
+
450
+ float *xs = decoder->x + decoder->xs_off;
451
+ int ns = LC3_NS(dt, sr);
452
+
453
+ for ( ; ns > 0; ns--, xs++, pcm += stride) {
454
+ int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
455
+ : (int32_t)(ldexpf(*xs, 8) - 0.5f);
456
+ *pcm = LC3_SAT24(s);
457
+ }
458
+ }
459
+
460
+ /**
461
+ * Output PCM Samples to signed 24 bits packed
462
+ * decoder Decoder state
463
+ * pcm, stride Output PCM samples, and count between two consecutives
464
+ */
465
+ static void store_s24_3le(
466
+ struct lc3_decoder *decoder, void *_pcm, int stride)
467
+ {
468
+ uint8_t *pcm = _pcm;
469
+
470
+ enum lc3_dt dt = decoder->dt;
471
+ enum lc3_srate sr = decoder->sr_pcm;
472
+
473
+ float *xs = decoder->x + decoder->xs_off;
474
+ int ns = LC3_NS(dt, sr);
475
+
476
+ for ( ; ns > 0; ns--, xs++, pcm += 3*stride) {
477
+ int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
478
+ : (int32_t)(ldexpf(*xs, 8) - 0.5f);
479
+
480
+ s = LC3_SAT24(s);
481
+ pcm[0] = (s >> 0) & 0xff;
482
+ pcm[1] = (s >> 8) & 0xff;
483
+ pcm[2] = (s >> 16) & 0xff;
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Output PCM Samples to float 32 bits
489
+ * decoder Decoder state
490
+ * pcm, stride Output PCM samples, and count between two consecutives
491
+ */
492
+ static void store_float(
493
+ struct lc3_decoder *decoder, void *_pcm, int stride)
494
+ {
495
+ float *pcm = _pcm;
496
+
497
+ enum lc3_dt dt = decoder->dt;
498
+ enum lc3_srate sr = decoder->sr_pcm;
499
+
500
+ float *xs = decoder->x + decoder->xs_off;
501
+ int ns = LC3_NS(dt, sr);
502
+
503
+ for ( ; ns > 0; ns--, xs++, pcm += stride) {
504
+ float s = ldexpf(*xs, -15);
505
+ *pcm = fminf(fmaxf(s, -1.f), 1.f);
506
+ }
507
+ }
508
+
509
+ /**
510
+ * Decode bitstream
511
+ * decoder Decoder state
512
+ * data, nbytes Input bitstream buffer
513
+ * side Return the side data
514
+ * return 0: Ok < 0: Bitsream error detected
515
+ */
516
+ static int decode(struct lc3_decoder *decoder,
517
+ const void *data, int nbytes, struct side_data *side)
518
+ {
519
+ enum lc3_dt dt = decoder->dt;
520
+ enum lc3_srate sr = decoder->sr;
521
+
522
+ float *xf = decoder->x + decoder->xs_off;
523
+ int ns = LC3_NS(dt, sr);
524
+ int ne = LC3_NE(dt, sr);
525
+
526
+ lc3_bits_t bits;
527
+ int ret = 0;
528
+
529
+ lc3_setup_bits(&bits, LC3_BITS_MODE_READ, (void *)data, nbytes);
530
+
531
+ if ((ret = lc3_bwdet_get_bw(&bits, sr, &side->bw)) < 0)
532
+ return ret;
533
+
534
+ if ((ret = lc3_spec_get_side(&bits, dt, sr, &side->spec)) < 0)
535
+ return ret;
536
+
537
+ lc3_tns_get_data(&bits, dt, side->bw, nbytes, &side->tns);
538
+
539
+ side->pitch_present = lc3_get_bit(&bits);
540
+
541
+ if ((ret = lc3_sns_get_data(&bits, &side->sns)) < 0)
542
+ return ret;
543
+
544
+ if (side->pitch_present)
545
+ lc3_ltpf_get_data(&bits, &side->ltpf);
546
+
547
+ if ((ret = lc3_spec_decode(&bits, dt, sr,
548
+ side->bw, nbytes, &side->spec, xf)) < 0)
549
+ return ret;
550
+
551
+ memset(xf + ne, 0, (ns - ne) * sizeof(float));
552
+
553
+ return lc3_check_bits(&bits);
554
+ }
555
+
556
+ /**
557
+ * Frame synthesis
558
+ * decoder Decoder state
559
+ * side Frame data, NULL performs PLC
560
+ * nbytes Size in bytes of the frame
561
+ */
562
+ static void synthesize(struct lc3_decoder *decoder,
563
+ const struct side_data *side, int nbytes)
564
+ {
565
+ enum lc3_dt dt = decoder->dt;
566
+ enum lc3_srate sr = decoder->sr;
567
+ enum lc3_srate sr_pcm = decoder->sr_pcm;
568
+
569
+ float *xf = decoder->x + decoder->xs_off;
570
+ int ns = LC3_NS(dt, sr_pcm);
571
+ int ne = LC3_NE(dt, sr);
572
+
573
+ float *xg = decoder->x + decoder->xg_off;
574
+ float *xs = xf;
575
+
576
+ float *xd = decoder->x + decoder->xd_off;
577
+ float *xh = decoder->x + decoder->xh_off;
578
+
579
+ if (side) {
580
+ enum lc3_bandwidth bw = side->bw;
581
+
582
+ lc3_plc_suspend(&decoder->plc);
583
+
584
+ lc3_tns_synthesize(dt, bw, &side->tns, xf);
585
+
586
+ lc3_sns_synthesize(dt, sr, &side->sns, xf, xg);
587
+
588
+ lc3_mdct_inverse(dt, sr_pcm, sr, xg, xd, xs);
589
+
590
+ } else {
591
+ lc3_plc_synthesize(dt, sr, &decoder->plc, xg, xf);
592
+
593
+ memset(xf + ne, 0, (ns - ne) * sizeof(float));
594
+
595
+ lc3_mdct_inverse(dt, sr_pcm, sr, xf, xd, xs);
596
+ }
597
+
598
+ lc3_ltpf_synthesize(dt, sr_pcm, nbytes, &decoder->ltpf,
599
+ side && side->pitch_present ? &side->ltpf : NULL, xh, xs);
600
+ }
601
+
602
+ /**
603
+ * Update decoder state on decoding completion
604
+ * decoder Decoder state
605
+ */
606
+ static void complete(struct lc3_decoder *decoder)
607
+ {
608
+ enum lc3_dt dt = decoder->dt;
609
+ enum lc3_srate sr_pcm = decoder->sr_pcm;
610
+ int nh = LC3_NH(dt, sr_pcm);
611
+ int ns = LC3_NS(dt, sr_pcm);
612
+
613
+ decoder->xs_off = decoder->xs_off - decoder->xh_off < nh - ns ?
614
+ decoder->xs_off + ns : decoder->xh_off;
615
+ }
616
+
617
+ /**
618
+ * Return size needed for a decoder
619
+ */
620
+ unsigned lc3_decoder_size(int dt_us, int sr_hz)
621
+ {
622
+ if (resolve_dt(dt_us) >= LC3_NUM_DT ||
623
+ resolve_sr(sr_hz) >= LC3_NUM_SRATE)
624
+ return 0;
625
+
626
+ return sizeof(struct lc3_decoder) +
627
+ (LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1) * sizeof(float);
628
+ }
629
+
630
+ /**
631
+ * Setup decoder
632
+ */
633
+ struct lc3_decoder *lc3_setup_decoder(
634
+ int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
635
+ {
636
+ if (sr_pcm_hz <= 0)
637
+ sr_pcm_hz = sr_hz;
638
+
639
+ enum lc3_dt dt = resolve_dt(dt_us);
640
+ enum lc3_srate sr = resolve_sr(sr_hz);
641
+ enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
642
+
643
+ if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
644
+ return NULL;
645
+
646
+ struct lc3_decoder *decoder = mem;
647
+ int nh = LC3_NH(dt, sr_pcm);
648
+ int ns = LC3_NS(dt, sr_pcm);
649
+ int nd = LC3_ND(dt, sr_pcm);
650
+
651
+ *decoder = (struct lc3_decoder){
652
+ .dt = dt, .sr = sr,
653
+ .sr_pcm = sr_pcm,
654
+
655
+ .xh_off = 0,
656
+ .xs_off = nh - ns,
657
+ .xd_off = nh,
658
+ .xg_off = nh + nd,
659
+ };
660
+
661
+ lc3_plc_reset(&decoder->plc);
662
+
663
+ memset(decoder->x, 0,
664
+ LC3_DECODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
665
+
666
+ return decoder;
667
+ }
668
+
669
+ /**
670
+ * Decode a frame
671
+ */
672
+ int lc3_decode(struct lc3_decoder *decoder, const void *in, int nbytes,
673
+ enum lc3_pcm_format fmt, void *pcm, int stride)
674
+ {
675
+ static void (* const store[])(struct lc3_decoder *, void *, int) = {
676
+ [LC3_PCM_FORMAT_S16 ] = store_s16,
677
+ [LC3_PCM_FORMAT_S24 ] = store_s24,
678
+ [LC3_PCM_FORMAT_S24_3LE] = store_s24_3le,
679
+ [LC3_PCM_FORMAT_FLOAT ] = store_float,
680
+ };
681
+
682
+ /* --- Check parameters --- */
683
+
684
+ if (!decoder)
685
+ return -1;
686
+
687
+ if (in && (nbytes < LC3_MIN_FRAME_BYTES ||
688
+ nbytes > LC3_MAX_FRAME_BYTES ))
689
+ return -1;
690
+
691
+ /* --- Processing --- */
692
+
693
+ struct side_data side;
694
+
695
+ int ret = !in || (decode(decoder, in, nbytes, &side) < 0);
696
+
697
+ synthesize(decoder, ret ? NULL : &side, nbytes);
698
+
699
+ store[fmt](decoder, pcm, stride);
700
+
701
+ complete(decoder);
702
+
703
+ return ret;
704
+ }