import 'dart:async'; import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:get/get.dart'; import 'package:get/get_rx/get_rx.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/state_manager.dart'; import 'package:network_info_plus/network_info_plus.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/handle/other/talk_data_repository.dart'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/starChart/status/star_chart_talk_status.dart'; import 'package:star_lock/translations/current_locale_tool.dart'; import '../../../../tools/storage.dart'; enum NetworkStatus { normal, // 0 lagging, // 1 delayed, // 2 packetLoss // 3 } class TalkViewState { int udpSendDataFrameNumber = 0; // 帧序号 // var isSenderAudioData = false.obs;// 是否要发送音频数据 Future userMobileIP = NetworkInfo().getWifiIP(); Future userUid = Storage.getUid(); RxInt udpStatus = 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话 TextEditingController passwordTF = TextEditingController(); Rx listData = Uint8List(0).obs; //得到的视频流字节数据 RxList listAudioData = [].obs; //得到的音频流字节数据 GlobalKey globalKey = GlobalKey(); Timer? oneMinuteTimeTimer; // 定时器超过60秒关闭当前界面 RxInt oneMinuteTime = 0.obs; // 定时器秒数 // 定时器如果发送了接听的命令 而没收到回复就每秒重复发送10次 late Timer answerTimer; late Timer hangUpTimer; late Timer openDoorTimer; Timer? fpsTimer; late AnimationController animationController; late Timer autoBackTimer = Timer(const Duration(seconds: 1), () {}); //发送30秒监视后自动返回 late Timer realTimePicTimer = Timer(const Duration(seconds: 1), () {}); //监视命令定时器 RxInt elapsedSeconds = 0.obs; // 星图对讲相关状态 List audioBuffer = [].obs; List activeAudioBuffer = [].obs; List activeVideoBuffer = [].obs; List videoBuffer = [].obs; List videoBuffer2 = [].obs; RxBool isPlaying = false.obs; // 是否开始播放 Rx talkStatus = TalkStatus.none.obs; //星图对讲状态 // 获取 startChartTalkStatus 的唯一实例 final StartChartTalkStatus startChartTalkStatus = StartChartTalkStatus.instance; // 通话数据流的单例流数据处理类 final TalkDataRepository talkDataRepository = TalkDataRepository.instance; RxInt lastFrameTimestamp = 0.obs; // 上一帧的时间戳,用来判断网络环境 Rx networkStatus = NetworkStatus.normal.obs; // 网络状态:0-正常 1-网络卡顿 2-网络延迟 3-网络丢包 RxInt alertCount = 0.obs; // 网络状态提示计数器 RxInt maxAlertNumber = 3.obs; // 网络状态提示最大提示次数 RxBool isOpenVoice = true.obs; // 是否打开声音 RxBool isRecordingScreen = false.obs; // 是否录屏中 RxBool isRecordingAudio = false.obs; // 是否录音中 Rx startRecordingAudioTime = DateTime.now().obs; // 开始录音时间 Rx endRecordingAudioTime = DateTime.now().obs; // 结束录音时间 RxInt recordingAudioTime = 0.obs; // 录音时间持续时间 RxInt fps = 0.obs; // 添加 FPS 计数 late VoiceProcessor? voiceProcessor; // 音频处理器、录音 final int frameLength = 320; //录音视频帧长度为640 final int sampleRate = 8000; //录音频采样率为8000 List recordingAudioAllFrames = []; // 录制音频的所有帧 List lockRecordingAudioAllFrames = []; // 录制音频的所有帧 RxInt rotateAngle = 0.obs; // 旋转角度(以弧度为单位) RxBool isLongPressing = false.obs; // 旋转角度(以弧度为单位) RxBool hasAudioData = false.obs; // 是否有音频数据 RxInt lastAudioTimestamp = 0.obs; // 最后接收到的音频数据的时间戳 Rx currentImage = Rx(null); RxString currentLanguage = CurrentLocaleTool.getCurrentLocaleString().obs; // 当前选择语言 }