fix:调整定时器超时逻辑

This commit is contained in:
liyi 2024-12-30 17:26:30 +08:00
parent 63501088e1
commit 13e3839d67
15 changed files with 245 additions and 121 deletions

View File

@ -0,0 +1,7 @@
class TalkConstant {
// TalkPing (s)
static const int talkePingOverTime = 6;
static const int talkeDataOverTime = 6;
// TalkRequest (s)
static const int talkeRequestOverTime = 30;
}

View File

@ -5,6 +5,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; import 'package:flutter_pcm_sound/flutter_pcm_sound.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_base_handle.dart';
import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart'; import 'package:star_lock/talk/startChart/handle/scp_message_handle.dart';
@ -24,24 +25,26 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
@override @override
void handleResp(ScpMessage scpMessage) { void handleResp(ScpMessage scpMessage) {
if (talkStatus.status != TalkStatus.waitingAnswer) {
//
return;
}
// //
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
Future.delayed(Duration(seconds: 1), () { //
// _handleStartTalkPing();
_handleStartTalkPing(); //
// _handleStartSendTalkExpectDataRequest();
_handleStartSendTalkExpectDataRequest(); //
// // _handleCheckTalkDataTimer();
_handleCheckTalkDataTimer();
});
// //
stopRingtone(); stopRingtone();
// //
talkStatus.setAnsweredSuccessfully(); talkStatus.setAnsweredSuccessfully();
// // //
talkeRequestOverTimeTimerManager.receiveMessage(); // talkeRequestOverTimeTimerManager.renewTimer();
talkeRequestOverTimeTimerManager.dispose(); // talkeRequestOverTimeTimerManager.dispose();
} }
} }
@ -80,30 +83,13 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
// //
startChartManage.startTalkPingMessageTimer(); startChartManage.startTalkPingMessageTimer();
// x秒内没有收到通话保持则执行的操作 // x秒内没有收到通话保持则执行的操作
talkePingOverTimeTimerManager.startTimer(); talkePingOverTimeTimerManager.start();
//
talkePingOverTimeTimerManager.setOnTimeout(() {
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
//
startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkPing();
talkStatus.setEnd();
});
} }
/// x秒内是否收到通话数据 /// x秒内是否收到通话数据
void _handleCheckTalkDataTimer() { void _handleCheckTalkDataTimer() {
// // x秒内没有收到通话保持则执行的操作
talkDataOverTimeTimerManager.startTimer(); talkDataOverTimeTimerManager.start();
//
talkDataOverTimeTimerManager.setOnTimeout(() {
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
startChartManage.stopTalkPingMessageTimer();
startChartManage.stopTalkExpectMessageTimer();
talkStatus.setNotTalkData();
talkStatus.setEnd();
});
} }
/// ///

View File

@ -30,7 +30,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
@override @override
void handleRealTimeData(ScpMessage scpMessage) { void handleRealTimeData(ScpMessage scpMessage) {
// //
talkDataOverTimeTimerManager.receiveMessage(); // talkDataOverTimeTimerManager.renew();
if (scpMessage.Payload != null) { if (scpMessage.Payload != null) {
final TalkData talkData = scpMessage.Payload; final TalkData talkData = scpMessage.Payload;
// //

View File

@ -41,8 +41,8 @@ class UdpTalkHangUpHandler extends ScpMessageBaseHandle
stopRingtone(); stopRingtone();
// //
talkeRequestOverTimeTimerManager.receiveMessage(); // talkeRequestOverTimeTimerManager.renewTimer();
talkeRequestOverTimeTimerManager.dispose(); // talkeRequestOverTimeTimerManager.dispose();
} }
@override @override

View File

@ -13,17 +13,18 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
implements ScpMessageHandler { implements ScpMessageHandler {
@override @override
void handleReq(ScpMessage scpMessage) { void handleReq(ScpMessage scpMessage) {
// TODO: // ,
replySuccessMessage(scpMessage); replySuccessMessage(scpMessage);
} }
@override @override
void handleResp(ScpMessage scpMessage) { void handleResp(ScpMessage scpMessage) {
// //
// print('收到通话保持回复');
final GenericResp genericResp = scpMessage.Payload; final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) { if (checkGenericRespSuccess(genericResp)) {
// //
talkePingOverTimeTimerManager.receiveMessage(); talkePingOverTimeTimerManager.renew();
} }
} }
@ -37,7 +38,7 @@ class UdpTalkPingHandler extends ScpMessageBaseHandle
deserializePayload( deserializePayload(
{required int payloadType, {required int payloadType,
required int messageType, required int messageType,
required List<int> byte, required List<int> byte,
int? offset, int? offset,
int? PayloadLength, int? PayloadLength,
int? spTotal, int? spTotal,

View File

@ -35,8 +35,8 @@ class UdpTalkRejectHandler extends ScpMessageBaseHandle
// //
talkeRequestOverTimeTimerManager.receiveMessage(); // talkeRequestOverTimeTimerManager.renewTimer();
talkeRequestOverTimeTimerManager.dispose(); // talkeRequestOverTimeTimerManager.dispose();
} }
@override @override

View File

@ -36,14 +36,14 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle
_talkRequestEvent(talkObjectName: talkReq.callerName); _talkRequestEvent(talkObjectName: talkReq.callerName);
// //
talkeRequestOverTimeTimerManager.startTimer(); // talkeRequestOverTimeTimerManager.startTimer();
talkeRequestOverTimeTimerManager.setOnTimeout(() { // talkeRequestOverTimeTimerManager.setOnTimeout(() {
if (talkStatus.status == TalkStatus.waitingAnswer) { // if (talkStatus.status == TalkStatus.waitingAnswer) {
// // //
startChartManage.sendTalkRejectMessage(); // startChartManage.sendTalkRejectMessage();
Get.back(); // Get.back();
} // }
}); // });
} }
@override @override

View File

@ -1,49 +0,0 @@
import 'dart:async';
typedef TimeoutCallback = void Function();
class OverTimeTimerManager {
//
OverTimeTimerManager({required this.timeoutInSeconds});
// Timer
Timer? _timer;
// final
final int timeoutInSeconds;
//
TimeoutCallback? _onTimeout;
//
void startTimer() {
_cancelTimer(); //
_timer = Timer(Duration(seconds: timeoutInSeconds), () {
//
_onTimeout?.call();
//
_cancelTimer();
});
}
//
void receiveMessage() {
startTimer();
}
//
void setOnTimeout(TimeoutCallback? callback) {
_onTimeout = callback;
}
//
void _cancelTimer() {
_timer?.cancel();
_timer = null;
}
//
void dispose() {
_cancelTimer();
}
}

View File

@ -0,0 +1,54 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkDataOverTimeTimerManager {
//
static final TalkDataOverTimeTimerManager _instance =
TalkDataOverTimeTimerManager._internal();
factory TalkDataOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkDataOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkeDataOverTime),
onTimeout = _handleTalkeDataOverTime;
//
static void _handleTalkeDataOverTime() {
EasyLoading.showToast('通话连接失败', duration: 2000.milliseconds);
StartChartManage().stopTalkPingMessageTimer();
StartChartManage().stopTalkExpectMessageTimer();
talkStatus.setNotTalkData();
talkStatus.setEnd();
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -0,0 +1,59 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkePingOverTimeTimerManager {
//
static final TalkePingOverTimeTimerManager _instance =
TalkePingOverTimeTimerManager._internal();
factory TalkePingOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkePingOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkePingOverTime),
onTimeout = _handleTalkePingOverTime;
//
static void _handleTalkePingOverTime() {
if (talkStatus.status == TalkStatus.duringCall) {
EasyLoading.showToast('通话异常中断', duration: 2000.milliseconds);
//
StartChartManage().stopTalkPingMessageTimer();
StartChartManage().stopTalkExpectMessageTimer();
//
StartChartManage().sendTalkHangupMessage();
talkStatus.setNotTalkPing();
talkStatus.setEnd();
}
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -0,0 +1,54 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:star_lock/talk/startChart/constant/talk_constant.dart';
import 'package:star_lock/talk/startChart/constant/talk_status.dart';
import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class TalkeRequestOverTimeTimerManager {
//
static final TalkeRequestOverTimeTimerManager _instance =
TalkeRequestOverTimeTimerManager._internal();
factory TalkeRequestOverTimeTimerManager() => _instance;
// StartChartTalkStatus
static StartChartTalkStatus talkStatus = StartChartTalkStatus.instance;
final Duration timeout;
final void Function() onTimeout;
Timer? _timer;
//
TalkeRequestOverTimeTimerManager._internal()
: timeout = const Duration(seconds: TalkConstant.talkeRequestOverTime),
onTimeout = _handleTalkeRequestOverTime;
//
static void _handleTalkeRequestOverTime() {
if (talkStatus.status == TalkStatus.waitingAnswer) {
//
StartChartManage().sendTalkRejectMessage();
Get.back();
}
}
//
void start() {
_timer = Timer(timeout, onTimeout);
}
//
void renew() {
_timer?.cancel();
_timer = null;
start();
}
//
void cancel() {
_timer?.cancel();
_timer = null;
}
}

View File

@ -3,15 +3,21 @@ import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/other/audio_player_manager.dart'; import 'package:star_lock/talk/other/audio_player_manager.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart'; import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/udp_constant.dart'; import 'package:star_lock/talk/startChart/constant/udp_constant.dart';
import 'package:star_lock/talk/startChart/entity/scp_message.dart'; import 'package:star_lock/talk/startChart/entity/scp_message.dart';
import 'package:star_lock/talk/startChart/handle/other/overtime_timer_manger.dart';
import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart'; import 'package:star_lock/talk/startChart/handle/other/talk_data_repository.dart';
import 'package:star_lock/talk/startChart/handle/other/talke_data_over_time_timer_manager.dart';
import 'package:star_lock/talk/startChart/handle/other/talke_ping_over_time_timer_manager.dart';
import 'package:star_lock/talk/startChart/handle/other/talke_request_over_time_timer_manager.dart';
import 'package:star_lock/talk/startChart/proto/generic.pb.dart'; import 'package:star_lock/talk/startChart/proto/generic.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart'; import 'package:star_lock/talk/startChart/proto/talk_data.pb.dart';
@ -19,8 +25,16 @@ import 'package:star_lock/talk/startChart/start_chart_manage.dart';
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart'; import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
class ScpMessageBaseHandle { class ScpMessageBaseHandle {
/// 使 TimerManager
///
final TalkeRequestOverTimeTimerManager talkeRequestOverTimeTimerManager =
TalkeRequestOverTimeTimerManager();
final TalkePingOverTimeTimerManager talkePingOverTimeTimerManager =
TalkePingOverTimeTimerManager();
final TalkDataOverTimeTimerManager talkDataOverTimeTimerManager =
TalkDataOverTimeTimerManager();
final startChartManage = StartChartManage(); final startChartManage = StartChartManage();
final List<int> _buffer = [];
/// ///
// messageId // messageId
@ -36,21 +50,6 @@ class ScpMessageBaseHandle {
final audioManager = AudioPlayerManager(); final audioManager = AudioPlayerManager();
//
final talkeRequestOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 8,
);
//
final talkePingOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 5,
);
//
final talkDataOverTimeTimerManager = OverTimeTimerManager(
timeoutInSeconds: 30,
);
// //
void replySuccessMessage(ScpMessage scpMessage) { void replySuccessMessage(ScpMessage scpMessage) {
startChartManage.sendGenericRespSuccessMessage( startChartManage.sendGenericRespSuccessMessage(
@ -142,4 +141,11 @@ class ScpMessageBaseHandle {
_packetBuffer.remove(key); _packetBuffer.remove(key);
_packetTimers.remove(key)?.cancel(); _packetTimers.remove(key)?.cancel();
} }
//
void _handleTalkeRequestOverTime() {}
void _handleTalkePingOverTime() {}
void _handleTalkDataOverTime() {}
} }

View File

@ -451,7 +451,7 @@ class StartChartManage {
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true), MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
); );
await _sendMessage(message: message); await _sendMessage(message: message);
_log(text: '发送通话保持'); // _log(text: '发送通话保持');
} }
// //

View File

@ -30,13 +30,14 @@ import '../../../../tools/baseGetXController.dart';
class TalkViewLogic extends BaseGetXController { class TalkViewLogic extends BaseGetXController {
final TalkViewState state = TalkViewState(); final TalkViewState state = TalkViewState();
Timer? _syncTimer; Timer? _syncTimer; //
int _startTime = 0; int _startTime = 0; //
final int bufferSize = 20; // final int bufferSize = 8; //
final List<int> frameTimestamps = []; // FPS final List<int> frameTimestamps = []; // FPS
int frameIntervalMs = 45; // 4522FPS int frameIntervalMs = 45; // 4522FPS
int minFrameIntervalMs = 30; // 33 FPS int minFrameIntervalMs = 30; // 33 FPS
int maxFrameIntervalMs = 100; // 10 FPS int maxFrameIntervalMs = 500; // 2 FPS
// int maxFrameIntervalMs = 100; // 10 FPS
/// ///
void _initFlutterPcmSound() { void _initFlutterPcmSound() {
@ -82,7 +83,7 @@ class TalkViewLogic extends BaseGetXController {
// //
void _startListenTalkData() { void _startListenTalkData() {
state.talkDataRepository.talkDataStream.listen((talkData) { state.talkDataRepository.talkDataStream.listen((TalkData talkData) {
final contentType = talkData.contentType; final contentType = talkData.contentType;
final currentTimestamp = DateTime.now().millisecondsSinceEpoch; final currentTimestamp = DateTime.now().millisecondsSinceEpoch;
@ -97,11 +98,14 @@ class TalkViewLogic extends BaseGetXController {
if (state.audioBuffer.length < bufferSize) { if (state.audioBuffer.length < bufferSize) {
state.audioBuffer.add(talkData); state.audioBuffer.add(talkData);
} }
// print('收到音频数据');
break; break;
case TalkData_ContentTypeE.Image: case TalkData_ContentTypeE.Image:
if (state.videoBuffer.length < bufferSize) { if (state.videoBuffer.length < bufferSize) {
state.videoBuffer.add(talkData); state.videoBuffer.add(talkData);
} }
print('talkData durationMs-->:${talkData.durationMs}');
/// ///
updateNetworkStatus(currentTimestamp); updateNetworkStatus(currentTimestamp);
@ -257,7 +261,6 @@ class TalkViewLogic extends BaseGetXController {
} else { } else {
state.networkStatus.value = NetworkStatus.normal; state.networkStatus.value = NetworkStatus.normal;
state.alertCount.value = 0; // state.alertCount.value = 0; //
EasyLoading.dismiss(); //
} }
} }
state.lastFrameTimestamp.value = currentTimestamp; state.lastFrameTimestamp.value = currentTimestamp;
@ -340,6 +343,7 @@ class TalkViewLogic extends BaseGetXController {
_stopPlayG711Data(); _stopPlayG711Data();
state.listData.value = Uint8List(0); state.listData.value = Uint8List(0);
_syncTimer?.cancel(); _syncTimer?.cancel();
_syncTimer = null;
} }
/// ///

View File

@ -199,8 +199,10 @@ class _TalkViewPageState extends State<TalkViewPage>
if (state.talkStatus.value == TalkStatus.duringCall) { if (state.talkStatus.value == TalkStatus.duringCall) {
if (state.isRecordingScreen.value) { if (state.isRecordingScreen.value) {
await logic.stopRecording(); await logic.stopRecording();
print('停止录屏');
} else { } else {
await logic.startRecording(); await logic.startRecording();
print('开始录屏');
} }
} }
}, },