diff --git a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart index 96d03afe..0bf874fd 100644 --- a/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart +++ b/lib/talk/starChart/views/imageTransmission/image_transmission_logic.dart @@ -602,12 +602,23 @@ class ImageTransmissionLogic extends BaseGetXController { } on PlatformException catch (ex) { // state.errorMessage.value = 'Failed to stop recorder: $ex'; } finally { + // 延迟关闭定时器,确保剩余数据能发送出去 + if (_startProcessingAudioTimer != null) { + // 插入5个320长度的全0数据包 + for (int i = 0; i < 5; i++) { + _bufferedAudioFrames.addAll(List.filled(chunkSize, 0)); + } + Future.delayed(const Duration(milliseconds: 300), () { + _startProcessingAudioTimer?.cancel(); + _startProcessingAudioTimer = null; + _bufferedAudioFrames.clear(); + }); + } else { + _bufferedAudioFrames.clear(); + } final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isRecordingAudio.value = isRecording!; } - _startProcessingAudioTimer?.cancel(); - _startProcessingAudioTimer = null; - _bufferedAudioFrames.clear(); } static const int chunkSize = 320; // 每次发送320字节(10ms G.711) @@ -656,27 +667,11 @@ class ImageTransmissionLogic 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; + return pcmData.map((sample) { + // 增益并裁剪 + int amplified = (sample * gainFactor).round(); + return amplified.clamp(-32768, 32767); + }).toList(); } } diff --git a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart index 931317ba..50eda207 100644 --- a/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart +++ b/lib/talk/starChart/views/native/talk_view_native_decode_logic.dart @@ -782,12 +782,23 @@ class TalkViewNativeDecodeLogic extends BaseGetXController { } on PlatformException catch (ex) { // state.errorMessage.value = 'Failed to stop recorder: $ex'; } finally { + // 延迟关闭定时器,确保剩余数据能发送出去 + if (_startProcessingAudioTimer != null) { + // 插入5个320长度的全0数据包 + for (int i = 0; i < 5; i++) { + _bufferedAudioFrames.addAll(List.filled(chunkSize, 0)); + } + Future.delayed(const Duration(milliseconds: 300), () { + _startProcessingAudioTimer?.cancel(); + _startProcessingAudioTimer = null; + _bufferedAudioFrames.clear(); + }); + } else { + _bufferedAudioFrames.clear(); + } final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isRecordingAudio.value = isRecording!; } - _startProcessingAudioTimer?.cancel(); - _startProcessingAudioTimer = null; - _bufferedAudioFrames.clear(); } // 添加音频增益处理方法 diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index d58e5093..c46db104 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -599,12 +599,23 @@ class TalkViewLogic extends BaseGetXController { } on PlatformException catch (ex) { // state.errorMessage.value = 'Failed to stop recorder: $ex'; } finally { + // 延迟关闭定时器,确保剩余数据能发送出去 + if (_startProcessingAudioTimer != null) { + // 插入5个320长度的全0数据包 + for (int i = 0; i < 5; i++) { + _bufferedAudioFrames.addAll(List.filled(chunkSize, 0)); + } + Future.delayed(const Duration(milliseconds: 300), () { + _startProcessingAudioTimer?.cancel(); + _startProcessingAudioTimer = null; + _bufferedAudioFrames.clear(); + }); + } else { + _bufferedAudioFrames.clear(); + } final bool? isRecording = await state.voiceProcessor?.isRecording(); state.isRecordingAudio.value = isRecording!; } - _startProcessingAudioTimer?.cancel(); - _startProcessingAudioTimer = null; - _bufferedAudioFrames.clear(); } static const int chunkSize = 320; // 每次发送320字节(10ms G.711) @@ -656,25 +667,10 @@ class TalkViewLogic extends BaseGetXController { // 添加音频增益处理方法 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; + return pcmData.map((sample) { + // 增益并裁剪 + int amplified = (sample * gainFactor).round(); + return amplified.clamp(-32768, 32767); + }).toList(); } }