Browse Source

进入翻译暂停音乐

weicu
fdp 1 year ago
parent
commit
75ea058e4d
  1. 2
      lib/data/services/ble_manager.dart
  2. 66
      lib/modules/translation/controllers/translation_controller.dart

2
lib/data/services/ble_manager.dart

@ -481,7 +481,7 @@ class BleManager extends GetxService {
final delays = [
Duration.zero, // 第一个命令立即执行
const Duration(milliseconds: 100), // 第二个命令延迟100ms
const Duration(milliseconds: 200), // 第三个命令延迟200ms
const Duration(milliseconds: 100), // 第三个命令延迟200ms
];
final futures = commands

66
lib/modules/translation/controllers/translation_controller.dart

@ -10,6 +10,7 @@ import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../../data/services/music_manager.dart';
import '../../../data/services/volcano_translation_service.dart';
import '../../../data/services/tts_service.dart';
import '../../../data/services/language_manager.dart';
@ -35,6 +36,8 @@ class TranslationController extends GetxController {
final GetStorage _storage = GetStorage();
// 蓝牙服务
final bleManager = Get.find<BleManager>();
//音乐播放管理
final _musiceManager = Get.find<MusicManager>();
// 音频输入源
bool _audioSourceType = false;
//是否开启播放
@ -58,6 +61,7 @@ class TranslationController extends GetxController {
RxInt activeSpeaker = 0.obs; // 0=无激活, 1=按钮1, 2=按钮2
RxInt lastActiveSpeaker = 0.obs; // 上一次状态
bool isContinuePlaying = false; // 是否继续播放
// 状态变量
final isRecognizing = false.obs;
final isTranslating = false.obs;
@ -177,7 +181,7 @@ class TranslationController extends GetxController {
// 初始化服务
_initServices();
suspendOtherServices();
// 使用微任务在布局完成后自动滚动到底部
WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollToBottom();
@ -252,6 +256,32 @@ class TranslationController extends GetxController {
}
}
// 暂停其他服务
Future<void> suspendOtherServices() async {
try {
var status = await _musiceManager.getStatus();
var isPlaying = status['isPlaying'] ?? false;
if (isPlaying == true) {
isContinuePlaying = true;
await _musiceManager.pause(); // 暂停音乐
} else {
isContinuePlaying = false;
}
} catch (e) {
Logger.error('初始化服务失败: ${e.toString()}');
}
}
// 恢复其他服务
Future<void> restoreOtherServices() async {
try {
if (isContinuePlaying) await _musiceManager.resume(); // 暂停音乐
} catch (e) {
Logger.error('初始化服务失败: ${e.toString()}');
}
}
// 初始化服务
Future<void> _initServices() async {
try {
@ -290,6 +320,7 @@ class TranslationController extends GetxController {
_voiceInteractionSubscription?.cancel();
_translationDebounceTimer?.cancel();
scrollController.dispose();
restoreOtherServices();
super.onClose();
}
@ -639,8 +670,7 @@ class TranslationController extends GetxController {
}
}
} else {
Logger.info(
'未找到匹配的历史项 $sourceText ${timestamp.toIso8601String()}');
Logger.info('未找到匹配的历史项 $sourceText ${timestamp.toIso8601String()}');
}
}
} catch (e) {
@ -873,14 +903,14 @@ class TranslationController extends GetxController {
void saveTranslationHistory() {
try {
// 只保存当前内存中的完成态记录,过滤掉中间态记录
final List<TranslationItem> finalRecords = translationHistory
.where((item) => !item.isIntermediate)
.toList();
final List<TranslationItem> finalRecords =
translationHistory.where((item) => !item.isIntermediate).toList();
// 应用存储限制,保留最新的1000条完成态记录
List<TranslationItem> historyToSave = finalRecords;
if (finalRecords.length > _maxStorageItems) {
historyToSave = finalRecords.sublist(finalRecords.length - _maxStorageItems);
historyToSave =
finalRecords.sublist(finalRecords.length - _maxStorageItems);
}
// 保存到本地存储
@ -909,7 +939,8 @@ class TranslationController extends GetxController {
historyList.map((item) => TranslationItem.fromJson(item)).toList();
for (final item in storedHistory) {
final id = '${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}';
final id =
'${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}';
if (!existingIds.contains(id)) {
existingIds.add(id);
result.add(item);
@ -920,7 +951,8 @@ class TranslationController extends GetxController {
// 添加当前内存中的完成态记录(排除中间态记录)
for (final item in translationHistory) {
if (!item.isIntermediate) {
final id = '${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}';
final id =
'${item.sessionId}_${item.timestamp.millisecondsSinceEpoch}';
if (!existingIds.contains(id)) {
existingIds.add(id);
result.add(item);
@ -974,7 +1006,8 @@ class TranslationController extends GetxController {
// 3. 刷新UI显示
translationHistory.refresh();
Logger.info('删除会话历史成功: sessionId=$sessionId, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条');
Logger.info(
'删除会话历史成功: sessionId=$sessionId, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条');
} catch (e) {
Logger.error('删除会话历史失败: ${e.toString()}');
rethrow; // 重新抛出异常,让调用方处理
@ -988,7 +1021,8 @@ class TranslationController extends GetxController {
final originalCount = translationHistory.length;
translationHistory.removeWhere((item) =>
item.sessionId == sessionId &&
item.timestamp.millisecondsSinceEpoch == timestamp.millisecondsSinceEpoch);
item.timestamp.millisecondsSinceEpoch ==
timestamp.millisecondsSinceEpoch);
final removedFromMemory = originalCount - translationHistory.length;
// 2. 从本地存储中删除指定的翻译记录
@ -1003,7 +1037,8 @@ class TranslationController extends GetxController {
final originalStoredCount = storedHistory.length;
storedHistory.removeWhere((item) =>
item.sessionId == sessionId &&
item.timestamp.millisecondsSinceEpoch == timestamp.millisecondsSinceEpoch);
item.timestamp.millisecondsSinceEpoch ==
timestamp.millisecondsSinceEpoch);
removedFromStorage = originalStoredCount - storedHistory.length;
// 重新保存更新后的存储数据
@ -1015,7 +1050,8 @@ class TranslationController extends GetxController {
// 3. 刷新UI显示
translationHistory.refresh();
Logger.info('删除单条翻译记录成功: sessionId=$sessionId, timestamp=${timestamp.toIso8601String()}, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条');
Logger.info(
'删除单条翻译记录成功: sessionId=$sessionId, timestamp=${timestamp.toIso8601String()}, 内存删除${removedFromMemory}条, 存储删除${removedFromStorage}条');
} catch (e) {
Logger.error('删除单条翻译记录失败: ${e.toString()}');
rethrow; // 重新抛出异常,让调用方处理
@ -1026,10 +1062,6 @@ class TranslationController extends GetxController {
void scrollToBottom({bool animate = true}) {
_scrollToBottom();
}
}
// 翻译项模型

Loading…
Cancel
Save