@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.
- package/README.md +563 -0
- package/android/build.gradle +450 -0
- package/android/gradle.properties.example +9 -0
- package/android/lc3Lib/CMakeLists.txt +6 -0
- package/android/lc3Lib/build.gradle +212 -0
- package/android/lc3Lib/proguard-rules.pro +33 -0
- package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
- package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
- package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
- package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
- package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
- package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
- package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
- package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
- package/android/settings.gradle +4 -0
- package/android/silero/LICENSE.md +17 -0
- package/android/silero/build.gradle +50 -0
- package/android/silero/proguard-rules.pro +24 -0
- package/android/silero/src/androidTest/assets/hello.wav +0 -0
- package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
- package/android/silero/src/main/assets/LICENSE +21 -0
- package/android/silero/src/main/assets/silero_vad.onnx +0 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
- package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
- package/android/src/main/AndroidManifest.xml +42 -0
- package/android/src/main/assets/G2Firmware/README.md +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
- package/android/src/test/resources/avif_with_exif.avif +0 -0
- package/app.plugin.js +3 -0
- package/build/BluetoothSdk.types.d.ts +1354 -0
- package/build/BluetoothSdk.types.d.ts.map +1 -0
- package/build/BluetoothSdk.types.js +41 -0
- package/build/BluetoothSdk.types.js.map +1 -0
- package/build/_internal.d.ts +17 -0
- package/build/_internal.d.ts.map +1 -0
- package/build/_internal.js +16 -0
- package/build/_internal.js.map +1 -0
- package/build/_private/BluetoothSdkModule.d.ts +172 -0
- package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
- package/build/_private/BluetoothSdkModule.js +300 -0
- package/build/_private/BluetoothSdkModule.js.map +1 -0
- package/build/_private/LocalNetworkModule.d.ts +38 -0
- package/build/_private/LocalNetworkModule.d.ts.map +1 -0
- package/build/_private/LocalNetworkModule.js +3 -0
- package/build/_private/LocalNetworkModule.js.map +1 -0
- package/build/_private/cameraRequestPayload.d.ts +4 -0
- package/build/_private/cameraRequestPayload.d.ts.map +1 -0
- package/build/_private/cameraRequestPayload.js +32 -0
- package/build/_private/cameraRequestPayload.js.map +1 -0
- package/build/_private/photoRequestPayload.d.ts +6 -0
- package/build/_private/photoRequestPayload.d.ts.map +1 -0
- package/build/_private/photoRequestPayload.js +86 -0
- package/build/_private/photoRequestPayload.js.map +1 -0
- package/build/_private/sdkOtaManifest.d.ts +11 -0
- package/build/_private/sdkOtaManifest.d.ts.map +1 -0
- package/build/_private/sdkOtaManifest.js +15 -0
- package/build/_private/sdkOtaManifest.js.map +1 -0
- package/build/changelogs.d.ts +7 -0
- package/build/changelogs.d.ts.map +1 -0
- package/build/changelogs.js +46 -0
- package/build/changelogs.js.map +1 -0
- package/build/debug.d.ts +3 -0
- package/build/debug.d.ts.map +1 -0
- package/build/debug.js +8 -0
- package/build/debug.js.map +1 -0
- package/build/generated/changelogCatalog.d.ts +9 -0
- package/build/generated/changelogCatalog.d.ts.map +1 -0
- package/build/generated/changelogCatalog.js +12 -0
- package/build/generated/changelogCatalog.js.map +1 -0
- package/build/generated/releaseMetadata.d.ts +12 -0
- package/build/generated/releaseMetadata.d.ts.map +1 -0
- package/build/generated/releaseMetadata.js +10 -0
- package/build/generated/releaseMetadata.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +171 -0
- package/build/index.js.map +1 -0
- package/build/ota-server/OtaServer.types.d.ts +14 -0
- package/build/ota-server/OtaServer.types.d.ts.map +1 -0
- package/build/ota-server/OtaServer.types.js +2 -0
- package/build/ota-server/OtaServer.types.js.map +1 -0
- package/build/ota-server/OtaServerModule.d.ts +21 -0
- package/build/ota-server/OtaServerModule.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.js +3 -0
- package/build/ota-server/OtaServerModule.js.map +1 -0
- package/build/ota-server/OtaServerModule.web.d.ts +10 -0
- package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.web.js +12 -0
- package/build/ota-server/OtaServerModule.web.js.map +1 -0
- package/build/ota-server/index.d.ts +3 -0
- package/build/ota-server/index.d.ts.map +1 -0
- package/build/ota-server/index.js +3 -0
- package/build/ota-server/index.js.map +1 -0
- package/build/ota-transport/index.d.ts +67 -0
- package/build/ota-transport/index.d.ts.map +1 -0
- package/build/ota-transport/index.js +58 -0
- package/build/ota-transport/index.js.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.js +2 -0
- package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.js +3 -0
- package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
- package/build/photo-receiver/index.d.ts +3 -0
- package/build/photo-receiver/index.d.ts.map +1 -0
- package/build/photo-receiver/index.js +3 -0
- package/build/photo-receiver/index.js.map +1 -0
- package/build/react/index.d.ts +5 -0
- package/build/react/index.d.ts.map +1 -0
- package/build/react/index.js +4 -0
- package/build/react/index.js.map +1 -0
- package/build/react/useBluetooth.d.ts +100 -0
- package/build/react/useBluetooth.d.ts.map +1 -0
- package/build/react/useBluetooth.js +167 -0
- package/build/react/useBluetooth.js.map +1 -0
- package/build/react/useBluetoothEvent.d.ts +6 -0
- package/build/react/useBluetoothEvent.d.ts.map +1 -0
- package/build/react/useBluetoothEvent.js +21 -0
- package/build/react/useBluetoothEvent.js.map +1 -0
- package/build/react/useBluetoothScan.d.ts +22 -0
- package/build/react/useBluetoothScan.d.ts.map +1 -0
- package/build/react/useBluetoothScan.js +135 -0
- package/build/react/useBluetoothScan.js.map +1 -0
- package/build/react/useBluetoothStatus.d.ts +16 -0
- package/build/react/useBluetoothStatus.d.ts.map +1 -0
- package/build/react/useBluetoothStatus.js +137 -0
- package/build/react/useBluetoothStatus.js.map +1 -0
- package/build/react/useGlassesConnection.d.ts +29 -0
- package/build/react/useGlassesConnection.d.ts.map +1 -0
- package/build/react/useGlassesConnection.js +153 -0
- package/build/react/useGlassesConnection.js.map +1 -0
- package/build/types/index.d.ts +3 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +2 -0
- package/build/types/index.js.map +1 -0
- package/expo-module.config.json +14 -0
- package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
- package/ios/BluetoothSdkModule.swift +1034 -0
- package/ios/GlasslyBluetoothSDK.podspec +106 -0
- package/ios/LocalIPv4.swift +150 -0
- package/ios/LocalOtaServer.swift +309 -0
- package/ios/LocalPhotoUploadServer.swift +754 -0
- package/ios/OtaServerModule.swift +147 -0
- package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
- package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
- package/ios/Packages/CoreObjC/attdet.c +92 -0
- package/ios/Packages/CoreObjC/attdet.h +44 -0
- package/ios/Packages/CoreObjC/bits.c +375 -0
- package/ios/Packages/CoreObjC/bits.h +315 -0
- package/ios/Packages/CoreObjC/bwdet.c +129 -0
- package/ios/Packages/CoreObjC/bwdet.h +69 -0
- package/ios/Packages/CoreObjC/common.h +151 -0
- package/ios/Packages/CoreObjC/energy.c +70 -0
- package/ios/Packages/CoreObjC/energy.h +43 -0
- package/ios/Packages/CoreObjC/fastmath.h +158 -0
- package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/lc3.c +704 -0
- package/ios/Packages/CoreObjC/lc3.h +313 -0
- package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
- package/ios/Packages/CoreObjC/lc3_private.h +163 -0
- package/ios/Packages/CoreObjC/ltpf.c +905 -0
- package/ios/Packages/CoreObjC/ltpf.h +111 -0
- package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
- package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
- package/ios/Packages/CoreObjC/makefile.mk +35 -0
- package/ios/Packages/CoreObjC/mdct.c +469 -0
- package/ios/Packages/CoreObjC/mdct.h +57 -0
- package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
- package/ios/Packages/CoreObjC/meson.build +61 -0
- package/ios/Packages/CoreObjC/plc.c +61 -0
- package/ios/Packages/CoreObjC/plc.h +57 -0
- package/ios/Packages/CoreObjC/rnnoise.h +114 -0
- package/ios/Packages/CoreObjC/sns.c +880 -0
- package/ios/Packages/CoreObjC/sns.h +103 -0
- package/ios/Packages/CoreObjC/spec.c +907 -0
- package/ios/Packages/CoreObjC/spec.h +119 -0
- package/ios/Packages/CoreObjC/tables.c +3457 -0
- package/ios/Packages/CoreObjC/tables.h +94 -0
- package/ios/Packages/CoreObjC/tns.c +457 -0
- package/ios/Packages/CoreObjC/tns.h +99 -0
- package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
- package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
- package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
- package/ios/Packages/libbz2/module.modulemap +5 -0
- package/ios/Packages/libbz2/shim.h +1 -0
- package/ios/PhotoReceiverModule.swift +129 -0
- package/ios/Source/BluetoothSDK.swift +2303 -0
- package/ios/Source/BluetoothSDKDebug.swift +12 -0
- package/ios/Source/BluetoothSdkDefaults.swift +29 -0
- package/ios/Source/Bridge.swift +708 -0
- package/ios/Source/Bridging-Header.h +16 -0
- package/ios/Source/DeviceManager.swift +2109 -0
- package/ios/Source/DeviceStore.swift +336 -0
- package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
- package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
- package/ios/Source/ObservableStore.swift +118 -0
- package/ios/Source/OtaManifest.swift +211 -0
- package/ios/Source/PrivacyInfo.xcprivacy +23 -0
- package/ios/Source/ReleaseChangelog.swift +65 -0
- package/ios/Source/Resources/G2Firmware/README.md +10 -0
- package/ios/Source/audio/AudioModels.swift +178 -0
- package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
- package/ios/Source/camera/CameraModels.swift +866 -0
- package/ios/Source/connection/ScanSession.swift +27 -0
- package/ios/Source/controllers/ControllerManager.swift +184 -0
- package/ios/Source/controllers/R1.swift +829 -0
- package/ios/Source/errors/BluetoothSdkError.swift +19 -0
- package/ios/Source/events/BluetoothEvents.swift +342 -0
- package/ios/Source/internal/BleTraceLogger.swift +192 -0
- package/ios/Source/internal/BluetoothAvailability.swift +78 -0
- package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
- package/ios/Source/internal/ValueParsing.swift +99 -0
- package/ios/Source/requests/DisplayRequests.swift +82 -0
- package/ios/Source/services/PhoneMic.swift +662 -0
- package/ios/Source/sgcs/Ar99.swift +2451 -0
- package/ios/Source/sgcs/Frame.swift +649 -0
- package/ios/Source/sgcs/G1.swift +2554 -0
- package/ios/Source/sgcs/G2.swift +6887 -0
- package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
- package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
- package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
- package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
- package/ios/Source/sgcs/G2Flasher.swift +773 -0
- package/ios/Source/sgcs/Mach1.swift +541 -0
- package/ios/Source/sgcs/MentraLive.swift +7011 -0
- package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
- package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
- package/ios/Source/sgcs/MentraNex.swift +3221 -0
- package/ios/Source/sgcs/Nimo.swift +1886 -0
- package/ios/Source/sgcs/SGCManager.swift +608 -0
- package/ios/Source/sgcs/Simulated.swift +274 -0
- package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
- package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
- package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
- package/ios/Source/status/DeviceStatus.swift +981 -0
- package/ios/Source/status/RuntimeState.swift +359 -0
- package/ios/Source/status/WifiHotspotStatus.swift +345 -0
- package/ios/Source/streaming/StreamModels.swift +693 -0
- package/ios/Source/stt/STTTools.swift +191 -0
- package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
- package/ios/Source/tts/TTSTools.swift +171 -0
- package/ios/Source/types/DeviceModels.swift +177 -0
- package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
- package/ios/Source/utils/BinaryCodec.swift +61 -0
- package/ios/Source/utils/BleJsonCompact.swift +405 -0
- package/ios/Source/utils/BleWireProtocol.swift +92 -0
- package/ios/Source/utils/Constants.swift +78 -0
- package/ios/Source/utils/Enums.swift +95 -0
- package/ios/Source/utils/G1Text.swift +2096 -0
- package/ios/Source/utils/JSCExperiment.swift +241 -0
- package/ios/Source/utils/MemoryMonitor.swift +44 -0
- package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
- package/ios/Source/utils/MessageChunker.swift +294 -0
- package/ios/Source/utils/Models.swift +135 -0
- package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
- package/ios/Source/utils/TarBz2Extractor.swift +257 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
- package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
- package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
- package/ios/Tests/ReleaseChangelogTests.swift +13 -0
- package/package.json +129 -0
- package/plugin/build/index.d.ts +10 -0
- package/plugin/build/index.js +12 -0
- package/plugin/build/withAndroid.d.ts +3 -0
- package/plugin/build/withAndroid.js +190 -0
- package/plugin/build/withIos.d.ts +5 -0
- package/plugin/build/withIos.js +108 -0
- package/scripts/inject-ios-sdk-version.mjs +65 -0
- package/scripts/public-ota-api.test.mjs +37 -0
- package/scripts/verify-release-package.mjs +45 -0
- package/scripts/write-release-metadata.mjs +152 -0
- package/scripts/write-release-metadata.test.mjs +37 -0
- package/src/BluetoothSdk.types.ts +1623 -0
- package/src/_internal.ts +16 -0
- package/src/_private/BluetoothSdkModule.ts +684 -0
- package/src/_private/LocalNetworkModule.ts +50 -0
- package/src/_private/cameraRequestPayload.ts +34 -0
- package/src/_private/photoRequestPayload.ts +90 -0
- package/src/_private/sdkOtaManifest.ts +18 -0
- package/src/changelogs.ts +46 -0
- package/src/debug.ts +9 -0
- package/src/generated/changelogCatalog.ts +13 -0
- package/src/generated/releaseMetadata.ts +20 -0
- package/src/index.ts +321 -0
- package/src/ota-server/OtaServer.types.ts +10 -0
- package/src/ota-server/OtaServerModule.ts +23 -0
- package/src/ota-server/OtaServerModule.web.ts +17 -0
- package/src/ota-server/index.ts +2 -0
- package/src/ota-transport/index.ts +116 -0
- package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
- package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
- package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
- package/src/photo-receiver/index.ts +2 -0
- package/src/react/index.ts +21 -0
- package/src/react/useBluetooth.ts +309 -0
- package/src/react/useBluetoothEvent.ts +35 -0
- package/src/react/useBluetoothScan.ts +173 -0
- package/src/react/useBluetoothStatus.ts +180 -0
- package/src/react/useGlassesConnection.ts +202 -0
- package/src/types/index.ts +12 -0
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
package com.glassly.bluetoothsdk.stt
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.SharedPreferences
|
|
5
|
+
import android.os.Handler
|
|
6
|
+
import android.os.Looper
|
|
7
|
+
import android.util.Log
|
|
8
|
+
import com.k2fsa.sherpa.onnx.*
|
|
9
|
+
import com.glassly.bluetoothsdk.Bridge
|
|
10
|
+
import java.io.File
|
|
11
|
+
import java.nio.ByteBuffer
|
|
12
|
+
import java.nio.ByteOrder
|
|
13
|
+
import java.util.concurrent.ArrayBlockingQueue
|
|
14
|
+
import java.util.concurrent.BlockingQueue
|
|
15
|
+
import java.util.concurrent.atomic.AtomicBoolean
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* SherpaOnnxTranscriber handles real-time audio transcription using Sherpa-ONNX.
|
|
19
|
+
*
|
|
20
|
+
* It works fully offline and processes PCM audio in real-time to provide partial and final ASR
|
|
21
|
+
* results. This class runs on a background thread, processes short PCM chunks, and emits
|
|
22
|
+
* transcribed text using a listener.
|
|
23
|
+
*
|
|
24
|
+
* Ported from iOS SherpaOnnxTranscriber.swift to match iOS functionality 1:1
|
|
25
|
+
*/
|
|
26
|
+
class SherpaOnnxTranscriber(private val context: Context) {
|
|
27
|
+
companion object {
|
|
28
|
+
private const val TAG = "SherpaOnnxTranscriber"
|
|
29
|
+
private const val SAMPLE_RATE = 16000 // Sherpa-ONNX model's required sample rate
|
|
30
|
+
private const val QUEUE_CAPACITY = 100 // Max number of audio buffers to keep in queue
|
|
31
|
+
private const val PREFS_NAME = "GlasslyPrefs"
|
|
32
|
+
private const val KEY_STT_MODEL_PATH = "STTModelPath"
|
|
33
|
+
private const val KEY_STT_MODEL_LANGUAGE = "STTModelLanguageCode"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Interface to receive transcription results from Sherpa-ONNX */
|
|
37
|
+
interface TranscriptListener {
|
|
38
|
+
/** Called with live partial transcription (not final yet) */
|
|
39
|
+
fun onPartialResult(text: String, language: String)
|
|
40
|
+
|
|
41
|
+
/** Called when an utterance ends and final text is available */
|
|
42
|
+
fun onFinalResult(text: String, language: String)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private val pcmQueue: BlockingQueue<ByteArray> = ArrayBlockingQueue(QUEUE_CAPACITY)
|
|
46
|
+
private val running = AtomicBoolean(false)
|
|
47
|
+
private val mainHandler = Handler(Looper.getMainLooper())
|
|
48
|
+
|
|
49
|
+
private var workerThread: Thread? = null
|
|
50
|
+
private var recognizer: OnlineRecognizer? = null
|
|
51
|
+
private var stream: OnlineStream? = null
|
|
52
|
+
|
|
53
|
+
private var lastPartialResult = ""
|
|
54
|
+
@Volatile private var transcriptListener: TranscriptListener? = null
|
|
55
|
+
|
|
56
|
+
private val restartLock = Any()
|
|
57
|
+
private var restartRunning = false
|
|
58
|
+
|
|
59
|
+
private val prefs: SharedPreferences by lazy {
|
|
60
|
+
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get the custom model path from SharedPreferences Resolves relative paths from Documents
|
|
65
|
+
* directory
|
|
66
|
+
*/
|
|
67
|
+
private fun getCustomModelPath(): String? {
|
|
68
|
+
val storedPath = prefs.getString(KEY_STT_MODEL_PATH, null) ?: return null
|
|
69
|
+
|
|
70
|
+
// Always resolve to absolute path if it contains "Documents/"
|
|
71
|
+
// This handles app ID changes between dev builds
|
|
72
|
+
if (storedPath.contains("/Documents/")) {
|
|
73
|
+
val documentsDir =
|
|
74
|
+
context.filesDir // In Android, this is the app's private files directory
|
|
75
|
+
val relativePath = storedPath.substringAfter("/Documents/")
|
|
76
|
+
val fixedPath = File(documentsDir, relativePath).absolutePath
|
|
77
|
+
Bridge.log("Reconstructed STTModelPath: $fixedPath")
|
|
78
|
+
return fixedPath
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
Bridge.log("STTModelPath (raw): $storedPath")
|
|
82
|
+
return storedPath
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Get the model language code from SharedPreferences */
|
|
86
|
+
private fun getModelLanguage(): String {
|
|
87
|
+
return prefs.getString(KEY_STT_MODEL_LANGUAGE, "en-US") ?: "en-US"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Initialize the Sherpa-ONNX recognizer. Loads models and configuration, sets up processing
|
|
92
|
+
* thread.
|
|
93
|
+
*/
|
|
94
|
+
fun initialize() {
|
|
95
|
+
try {
|
|
96
|
+
val modelPath = getCustomModelPath()
|
|
97
|
+
|
|
98
|
+
if (modelPath == null) {
|
|
99
|
+
Bridge.log("No Sherpa ONNX model available. Transcription will be disabled.")
|
|
100
|
+
Bridge.log("Please download a model using the model downloader in settings.")
|
|
101
|
+
recognizer = null
|
|
102
|
+
stream = null
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
val modelDir = File(modelPath)
|
|
107
|
+
if (!modelDir.exists() || !modelDir.isDirectory) {
|
|
108
|
+
Bridge.log("Model path does not exist or is not a directory: $modelPath")
|
|
109
|
+
recognizer = null
|
|
110
|
+
stream = null
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
val tokensPath = File(modelDir, "tokens.txt").absolutePath
|
|
115
|
+
val tokensFile = File(tokensPath)
|
|
116
|
+
|
|
117
|
+
if (!tokensFile.exists()) {
|
|
118
|
+
throw IllegalStateException("tokens.txt not found at path: $modelPath")
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
val modelType: String
|
|
122
|
+
val modelConfig = OnlineModelConfig()
|
|
123
|
+
|
|
124
|
+
// Detect model type based on available files
|
|
125
|
+
val ctcModelFile = findReadableFile(modelDir, listOf("model.int8.onnx", "model.onnx"))
|
|
126
|
+
val transducerEncoderFile =
|
|
127
|
+
findReadableFile(modelDir, listOf("encoder.onnx", "encoder.int8.onnx"))
|
|
128
|
+
|
|
129
|
+
when {
|
|
130
|
+
ctcModelFile.exists() -> {
|
|
131
|
+
// CTC model detected
|
|
132
|
+
modelType = "ctc"
|
|
133
|
+
Bridge.log("Detected CTC model at $modelPath")
|
|
134
|
+
|
|
135
|
+
val nemoCtc = OnlineNeMoCtcModelConfig()
|
|
136
|
+
nemoCtc.model = ctcModelFile.absolutePath
|
|
137
|
+
|
|
138
|
+
modelConfig.tokens = tokensPath
|
|
139
|
+
modelConfig.numThreads = 1
|
|
140
|
+
modelConfig.neMoCtc = nemoCtc
|
|
141
|
+
}
|
|
142
|
+
transducerEncoderFile.exists() -> {
|
|
143
|
+
// Transducer model detected. NVIDIA Nemotron ships the same
|
|
144
|
+
// encoder/decoder/joiner triplet as a Zipformer transducer and is
|
|
145
|
+
// loaded through this very same config โ sherpa-onnx sniffs the ONNX
|
|
146
|
+
// metadata and dispatches to its NeMo transducer implementation on its
|
|
147
|
+
// own. We detect it only to log it distinctly and to guard the
|
|
148
|
+
// requirements below; there is no Nemotron-specific config struct.
|
|
149
|
+
//
|
|
150
|
+
// Critically, we must NOT set modelConfig.modelType for Nemotron:
|
|
151
|
+
// "transducer" would force the generic Zipformer path and mis-decode.
|
|
152
|
+
// Leaving it unset lets sherpa-onnx auto-detect.
|
|
153
|
+
val isNemotron = isNemotronModelDir(modelDir)
|
|
154
|
+
modelType = if (isNemotron) "nemotron" else "transducer"
|
|
155
|
+
Bridge.log("Detected $modelType model at $modelPath")
|
|
156
|
+
|
|
157
|
+
val decoderFile =
|
|
158
|
+
findReadableFile(modelDir, listOf("decoder.onnx", "decoder.int8.onnx"))
|
|
159
|
+
val joinerFile =
|
|
160
|
+
findReadableFile(modelDir, listOf("joiner.onnx", "joiner.int8.onnx"))
|
|
161
|
+
|
|
162
|
+
if (!decoderFile.exists() || !joinerFile.exists()) {
|
|
163
|
+
throw IllegalStateException(
|
|
164
|
+
"Transducer model files incomplete at path: $modelPath"
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
val transducer = OnlineTransducerModelConfig()
|
|
169
|
+
transducer.encoder = transducerEncoderFile.absolutePath
|
|
170
|
+
transducer.decoder = decoderFile.absolutePath
|
|
171
|
+
transducer.joiner = joinerFile.absolutePath
|
|
172
|
+
|
|
173
|
+
modelConfig.tokens = tokensPath
|
|
174
|
+
modelConfig.transducer = transducer
|
|
175
|
+
modelConfig.numThreads = 1
|
|
176
|
+
}
|
|
177
|
+
else -> {
|
|
178
|
+
throw IllegalStateException("No valid model files found at path: $modelPath")
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Configure recognizer
|
|
183
|
+
val config = OnlineRecognizerConfig()
|
|
184
|
+
config.modelConfig = modelConfig
|
|
185
|
+
config.decodingMethod = "greedy_search"
|
|
186
|
+
config.enableEndpoint = true
|
|
187
|
+
// Match iOS's tightened endpoint rules (SherpaOnnxTranscriber.swift):
|
|
188
|
+
// finalize after 1.2s silence (0.8s mid-utterance), force-finalize at 10s โ
|
|
189
|
+
// the library defaults (2.4/1.2/30) make captions feel ~2x slower.
|
|
190
|
+
config.endpointConfig =
|
|
191
|
+
EndpointConfig(
|
|
192
|
+
EndpointRule(false, 1.2f, 0f),
|
|
193
|
+
EndpointRule(true, 0.8f, 0f),
|
|
194
|
+
EndpointRule(false, 0f, 10f)
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
// Create recognizer (pass null for AssetManager since we're using file paths)
|
|
198
|
+
recognizer =
|
|
199
|
+
try {
|
|
200
|
+
OnlineRecognizer(null, config)
|
|
201
|
+
} catch (e: Exception) {
|
|
202
|
+
Log.e(
|
|
203
|
+
TAG,
|
|
204
|
+
"Failed to create OnlineRecognizer - model file may be corrupted or incomplete",
|
|
205
|
+
e
|
|
206
|
+
)
|
|
207
|
+
null
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (recognizer == null) {
|
|
211
|
+
throw IllegalStateException("Failed to create recognizer")
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
stream = recognizer?.createStream("")
|
|
215
|
+
|
|
216
|
+
startProcessingThread()
|
|
217
|
+
running.set(true)
|
|
218
|
+
|
|
219
|
+
Bridge.log("Sherpa-ONNX ASR initialized successfully with $modelType model")
|
|
220
|
+
} catch (e: Exception) {
|
|
221
|
+
Bridge.log("Failed to initialize Sherpa-ONNX: ${e.message}")
|
|
222
|
+
Log.e(TAG, "Failed to initialize Sherpa-ONNX", e)
|
|
223
|
+
|
|
224
|
+
// Clean up any partially initialized resources
|
|
225
|
+
stream?.let {
|
|
226
|
+
try {
|
|
227
|
+
it.release()
|
|
228
|
+
} catch (releaseEx: Exception) {
|
|
229
|
+
Log.e(TAG, "Error releasing stream after initialization failure", releaseEx)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
stream = null
|
|
233
|
+
|
|
234
|
+
recognizer?.let {
|
|
235
|
+
try {
|
|
236
|
+
it.release()
|
|
237
|
+
} catch (releaseEx: Exception) {
|
|
238
|
+
Log.e(TAG, "Error releasing recognizer after initialization failure", releaseEx)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
recognizer = null
|
|
242
|
+
|
|
243
|
+
running.set(false)
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private fun findReadableFile(modelDir: File, candidates: List<String>): File {
|
|
248
|
+
return candidates.map { File(modelDir, it) }.firstOrNull { file ->
|
|
249
|
+
file.exists() && file.canRead() && file.length() > 0
|
|
250
|
+
} ?: File(modelDir, candidates.first())
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Heuristically detect an NVIDIA Nemotron model directory.
|
|
255
|
+
*
|
|
256
|
+
* Nemotron is file-identical to a Zipformer transducer (encoder/decoder/joiner + tokens.txt),
|
|
257
|
+
* so filenames alone cannot distinguish the two. We check the on-disk directory name first โ
|
|
258
|
+
* STTModelManager names the folder after the model id โ and fall back to the README.md that
|
|
259
|
+
* ships inside every upstream archive.
|
|
260
|
+
*
|
|
261
|
+
* This is advisory only: sherpa-onnx does the authoritative dispatch from ONNX metadata. A
|
|
262
|
+
* false negative costs nothing but a less precise log line.
|
|
263
|
+
*/
|
|
264
|
+
private fun isNemotronModelDir(modelDir: File): Boolean {
|
|
265
|
+
if (modelDir.name.contains("nemotron", ignoreCase = true)) return true
|
|
266
|
+
|
|
267
|
+
val readme = File(modelDir, "README.md")
|
|
268
|
+
if (!readme.exists() || !readme.canRead()) return false
|
|
269
|
+
return try {
|
|
270
|
+
// Archive READMEs are small; cap the read so a malformed file can't stall startup.
|
|
271
|
+
val head = CharArray(8192)
|
|
272
|
+
val n = readme.bufferedReader(Charsets.UTF_8).use { it.read(head) }
|
|
273
|
+
n > 0 && String(head, 0, n).contains("nemotron", ignoreCase = true)
|
|
274
|
+
} catch (e: Exception) {
|
|
275
|
+
Log.w(TAG, "Could not read README.md while probing for Nemotron", e)
|
|
276
|
+
false
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Feed PCM audio data (16-bit little endian) into the transcriber. This method should be called
|
|
282
|
+
* continuously with short chunks (e.g., 100-300ms).
|
|
283
|
+
*
|
|
284
|
+
* Audio is queued directly; microphone VAD gating is not applied in the SDK.
|
|
285
|
+
*/
|
|
286
|
+
fun acceptAudio(pcm16le: ByteArray) {
|
|
287
|
+
if (!running.get()) {
|
|
288
|
+
// Bridge.log("โ ๏ธ Ignoring audio - transcriber not running")
|
|
289
|
+
return
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (!pcmQueue.offer(pcm16le.copyOf())) {
|
|
293
|
+
// Queue is full, drop oldest and try again
|
|
294
|
+
pcmQueue.poll()
|
|
295
|
+
pcmQueue.offer(pcm16le.copyOf())
|
|
296
|
+
Bridge.log("โ ๏ธ Audio queue overflow - dropped buffer")
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/** Start a background thread to continuously consume audio and decode using Sherpa */
|
|
301
|
+
private fun startProcessingThread() {
|
|
302
|
+
Bridge.log("๐ Starting Sherpa-ONNX processing thread...")
|
|
303
|
+
|
|
304
|
+
workerThread =
|
|
305
|
+
Thread({ runLoop() }, "SherpaOnnxProcessor").apply {
|
|
306
|
+
isDaemon = true
|
|
307
|
+
start()
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Main processing loop that handles transcription in real-time. Pulls audio from queue, feeds
|
|
313
|
+
* into Sherpa, emits partial/final results.
|
|
314
|
+
*/
|
|
315
|
+
private fun runLoop() {
|
|
316
|
+
Bridge.log("๐ Sherpa-ONNX processing loop started")
|
|
317
|
+
|
|
318
|
+
while (running.get()) {
|
|
319
|
+
try {
|
|
320
|
+
val currentRecognizer = recognizer
|
|
321
|
+
val currentStream = stream
|
|
322
|
+
|
|
323
|
+
if (currentRecognizer == null || currentStream == null) {
|
|
324
|
+
Bridge.log("โ ๏ธ Recognizer or stream not available, skipping audio chunk")
|
|
325
|
+
Thread.sleep(100)
|
|
326
|
+
continue
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Pull data from queue with timeout
|
|
330
|
+
val audioData = pcmQueue.poll(50, java.util.concurrent.TimeUnit.MILLISECONDS)
|
|
331
|
+
|
|
332
|
+
if (audioData != null) {
|
|
333
|
+
// Convert PCM to float [-1.0, 1.0]
|
|
334
|
+
val floatBuf = toFloatArray(audioData)
|
|
335
|
+
|
|
336
|
+
// Pass audio data to the Sherpa-ONNX stream
|
|
337
|
+
currentStream.acceptWaveform(floatBuf, SAMPLE_RATE)
|
|
338
|
+
|
|
339
|
+
// Decode continuously while model is ready
|
|
340
|
+
var decodeCount = 0
|
|
341
|
+
while (currentRecognizer.isReady(currentStream)) {
|
|
342
|
+
currentRecognizer.decode(currentStream)
|
|
343
|
+
decodeCount++
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// If utterance endpoint detected
|
|
347
|
+
if (currentRecognizer.isEndpoint(currentStream)) {
|
|
348
|
+
val result = currentRecognizer.getResult(currentStream)
|
|
349
|
+
val finalText = result.text.trim()
|
|
350
|
+
|
|
351
|
+
if (finalText.isNotEmpty()) {
|
|
352
|
+
handleTranscriptionResult(finalText, isFinal = true)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
currentRecognizer.reset(currentStream) // Start new utterance
|
|
356
|
+
lastPartialResult = ""
|
|
357
|
+
} else {
|
|
358
|
+
// Emit partial results if changed
|
|
359
|
+
val result = currentRecognizer.getResult(currentStream)
|
|
360
|
+
val partial = result.text.trim()
|
|
361
|
+
|
|
362
|
+
if (partial != lastPartialResult && partial.isNotEmpty()) {
|
|
363
|
+
handleTranscriptionResult(partial, isFinal = false)
|
|
364
|
+
lastPartialResult = partial
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
} catch (e: InterruptedException) {
|
|
369
|
+
Thread.currentThread().interrupt()
|
|
370
|
+
Bridge.log("Processing thread interrupted")
|
|
371
|
+
break
|
|
372
|
+
} catch (e: Exception) {
|
|
373
|
+
Log.e(TAG, "Error processing audio", e)
|
|
374
|
+
// Attempt stream reset to recover
|
|
375
|
+
try {
|
|
376
|
+
recognizer?.let { rec -> stream?.let { str -> rec.reset(str) } }
|
|
377
|
+
} catch (resetEx: Exception) {
|
|
378
|
+
Log.e(TAG, "Failed to reset stream after error", resetEx)
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
Bridge.log("ASR processing thread stopped")
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/** Convert 16-bit PCM byte data (little-endian) to float array [-1.0, 1.0] */
|
|
387
|
+
private fun toFloatArray(pcmData: ByteArray): FloatArray {
|
|
388
|
+
val count = pcmData.size / 2
|
|
389
|
+
val samples = FloatArray(count)
|
|
390
|
+
|
|
391
|
+
val buffer = ByteBuffer.wrap(pcmData).order(ByteOrder.LITTLE_ENDIAN)
|
|
392
|
+
|
|
393
|
+
for (i in 0 until count) {
|
|
394
|
+
samples[i] = buffer.short / 32768.0f
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return samples
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/** Handle transcription results - send to listener on main thread */
|
|
401
|
+
private fun handleTranscriptionResult(text: String, isFinal: Boolean) {
|
|
402
|
+
val language = getModelLanguage()
|
|
403
|
+
|
|
404
|
+
// Forward to listener on main thread
|
|
405
|
+
mainHandler.post {
|
|
406
|
+
transcriptListener?.let { listener ->
|
|
407
|
+
if (isFinal) {
|
|
408
|
+
listener.onFinalResult(text, language)
|
|
409
|
+
} else {
|
|
410
|
+
listener.onPartialResult(text, language)
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Stop transcription processing. This shuts down the processing thread and releases Sherpa-ONNX
|
|
418
|
+
* resources.
|
|
419
|
+
*/
|
|
420
|
+
fun shutdown() {
|
|
421
|
+
Bridge.log("๐ Shutting down SherpaOnnxTranscriber...")
|
|
422
|
+
|
|
423
|
+
running.set(false)
|
|
424
|
+
|
|
425
|
+
workerThread?.let { thread ->
|
|
426
|
+
thread.interrupt()
|
|
427
|
+
try {
|
|
428
|
+
thread.join(500)
|
|
429
|
+
} catch (e: InterruptedException) {
|
|
430
|
+
Thread.currentThread().interrupt()
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
workerThread = null
|
|
434
|
+
|
|
435
|
+
try {
|
|
436
|
+
stream?.let {
|
|
437
|
+
Bridge.log("๐งน Cleaning up Sherpa-ONNX stream")
|
|
438
|
+
it.release()
|
|
439
|
+
}
|
|
440
|
+
stream = null
|
|
441
|
+
|
|
442
|
+
recognizer?.let {
|
|
443
|
+
Bridge.log("๐งน Cleaning up Sherpa-ONNX recognizer")
|
|
444
|
+
it.release()
|
|
445
|
+
}
|
|
446
|
+
recognizer = null
|
|
447
|
+
} catch (e: Exception) {
|
|
448
|
+
Log.e(TAG, "Error releasing Sherpa resources", e)
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Clear any remaining audio buffers
|
|
452
|
+
val remainingBuffers = pcmQueue.size
|
|
453
|
+
if (remainingBuffers > 0) {
|
|
454
|
+
Bridge.log("๐๏ธ Clearing $remainingBuffers remaining audio buffers")
|
|
455
|
+
}
|
|
456
|
+
pcmQueue.clear()
|
|
457
|
+
|
|
458
|
+
Bridge.log("โ
SherpaOnnxTranscriber shutdown complete")
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Restarts the transcriber after a model change. Shuts down existing resources, clears buffers,
|
|
463
|
+
* and reinitializes the recognizer.
|
|
464
|
+
*/
|
|
465
|
+
fun restart() {
|
|
466
|
+
synchronized(restartLock) {
|
|
467
|
+
if (restartRunning) {
|
|
468
|
+
Bridge.log("Restart already in progress, skipping")
|
|
469
|
+
return
|
|
470
|
+
}
|
|
471
|
+
restartRunning = true
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
try {
|
|
475
|
+
Bridge.log("โป๏ธ Restarting SherpaOnnxTranscriber...")
|
|
476
|
+
shutdown()
|
|
477
|
+
// Small delay to ensure cleanup completes
|
|
478
|
+
Thread.sleep(100)
|
|
479
|
+
initialize()
|
|
480
|
+
} catch (e: Exception) {
|
|
481
|
+
Log.e(TAG, "Error during transcriber restart", e)
|
|
482
|
+
} finally {
|
|
483
|
+
synchronized(restartLock) { restartRunning = false }
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/** Register a listener to receive partial and final transcription updates */
|
|
488
|
+
fun setTranscriptListener(listener: TranscriptListener?) {
|
|
489
|
+
transcriptListener = listener
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** Check if the transcriber was successfully initialized */
|
|
493
|
+
fun isInitialized(): Boolean {
|
|
494
|
+
return recognizer != null && stream != null
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/** Handle microphone state changes */
|
|
498
|
+
fun microphoneStateChanged(state: Boolean) {
|
|
499
|
+
if (!state) {
|
|
500
|
+
// Microphone turned off - clear queue and reset stream
|
|
501
|
+
pcmQueue.clear()
|
|
502
|
+
|
|
503
|
+
recognizer?.let { rec ->
|
|
504
|
+
stream?.let { str ->
|
|
505
|
+
try {
|
|
506
|
+
rec.reset(str)
|
|
507
|
+
lastPartialResult = ""
|
|
508
|
+
Log.d(TAG, "Microphone off โ stream reset")
|
|
509
|
+
} catch (e: Exception) {
|
|
510
|
+
Log.e(TAG, "Error resetting stream on mic off", e)
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
} else {
|
|
515
|
+
Log.d(TAG, "Microphone on")
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|