diff --git a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart index 122cbdc4..06b79ad6 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_request_handler.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/entity/scp_message.dart'; @@ -26,13 +27,13 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle @override void handleReq(ScpMessage scpMessage) async { - // 回复成功 - replySuccessMessage(scpMessage); // 判断是否登录账户 final loginData = await Storage.getLoginData(); + // 如果登录账户不为空,且不是被动接听状态,且不是接听成功状态 if (loginData != null && - (talkStatus.status != TalkStatus.passiveCallWaitingAnswer && talkStatus.status!=TalkStatus.answeredSuccessfully)) { + (talkStatus.status != TalkStatus.passiveCallWaitingAnswer || + talkStatus.status != TalkStatus.answeredSuccessfully)) { // 收到对讲请求 final TalkReq talkReq = scpMessage.Payload; startChartManage.FromPeerId = scpMessage.ToPeerId!; @@ -40,6 +41,12 @@ class UdpTalkRequestHandler extends ScpMessageBaseHandle startChartManage.lockPeerId = scpMessage.FromPeerId!; // 处理收到接听请求后的事件 _talkRequestEvent(talkObjectName: talkReq.callerName); + + // 回复成功 + replySuccessMessage(scpMessage); + } else { + // 拒绝接听,回复失败 + replyErrorMessage(scpMessage); } } diff --git a/lib/talk/starChart/handle/scp_message_base_handle.dart b/lib/talk/starChart/handle/scp_message_base_handle.dart index f4b68024..11328f46 100644 --- a/lib/talk/starChart/handle/scp_message_base_handle.dart +++ b/lib/talk/starChart/handle/scp_message_base_handle.dart @@ -71,6 +71,15 @@ class ScpMessageBaseHandle { messageId: scpMessage.MessageId!, ); } + // 回复失败消息 + void replyErrorMessage(ScpMessage scpMessage) { + startChartManage.sendGenericRespErrorMessage( + ToPeerId: scpMessage.FromPeerId!, + FromPeerId: scpMessage.ToPeerId!, + PayloadType: scpMessage.PayloadType!, + messageId: scpMessage.MessageId!, + ); + } bool checkGenericRespSuccess(GenericResp genericResp) { if (genericResp == null) return false; diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 328e80b8..7f60fc25 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -650,10 +650,15 @@ class StartChartManage { } // 回复失败消息 - void sendGenericRespErrorMessage( - {required String ToPeerId, - required String FromPeerId, - required int PayloadType}) async { + void sendGenericRespErrorMessage({ + required String ToPeerId, + required String FromPeerId, + required int PayloadType, + required int messageId, + }) async { + if (messageId == null) { + messageId = MessageCommand.getNextMessageId(ToPeerId, increment: false); + } final message = MessageCommand.genericRespErrorMessage( ToPeerId: ToPeerId, FromPeerId: FromPeerId, diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index f4de250b..523742c4 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -659,15 +659,14 @@ class TalkViewLogic extends BaseGetXController { // 音频帧处理 Future _onFrame(List frame) async { - + // 首先应用固定增益提升基础音量 + List amplifiedFrame = _applyGain(frame, 1.6); // 编码为G711数据 - List encodedData = G711Tool.encode(frame, 0); // 0表示A-law - + List encodedData = G711Tool.encode(amplifiedFrame, 0); // 0表示A-law _bufferedAudioFrames.addAll(encodedData); final int ms = DateTime.now().millisecondsSinceEpoch - state.startRecordingAudioTime.value.millisecondsSinceEpoch; - int getFrameLength = state.frameLength; if (Platform.isIOS) { getFrameLength = state.frameLength * 2; @@ -694,5 +693,27 @@ class TalkViewLogic extends BaseGetXController { AppLog.log(error.message!); } +// 添加音频增益处理方法 + List _applyGain(List pcmData, double gainFactor) { + List result = List.filled(pcmData.length, 0); + for (int i = 0; i < pcmData.length; i++) { + // PCM数据通常是有符号的16位整数 + int sample = pcmData[i]; + + // 应用增益 + double amplified = sample * gainFactor; + + // 限制在有效范围内,防止溢出 + if (amplified > 32767) { + amplified = 32767; + } else if (amplified < -32768) { + amplified = -32768; + } + + result[i] = amplified.toInt(); + } + + return result; + } }