Browse Source

feat(translation): 增加QQ音乐播放暂停支持

在切换翻译模式时,暂停QQ音乐播放并在退出时恢复播放,避免音频冲突
weicu
liwei1dao 8 months ago
parent
commit
cfd45b14b9
  1. 43
      lib/modules/translation/controllers/translation_controller.dart

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

@ -11,6 +11,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:pip/pip.dart';
import 'package:voitrans/data/services/qq_music.dart';
import '../../../data/services/ast_service.dart';
import '../../../data/services/bluetooth_manager.dart';
import '../../../data/services/music_manager.dart';
@ -54,6 +55,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
final BluetoothManager bluetoothManager = Get.find<BluetoothManager>();
final BleManager bleManager = Get.find<BleManager>();
final _musiceManager = Get.find<MusicManager>();
final _qqMusicManager = Get.find<QqMusicService>();
late final UsageStatsService _usageService;
// 安卓悬浮窗管理器
late final FloatingWindowManager _floatingWindowManager;
@ -79,6 +81,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
bool _audioSourceType = false; // 音频输入源类型
bool isPlayback = false; // 是否开启播放
bool isContinuePlaying = false; // 是否继续播放
bool _isContinueQqMusicPlaying = false; // 是否继续播放QQ音乐
// 存储相关配置
static const String _sourceLanguageKey = 'translation_source_language';
@ -330,7 +333,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
}
/// 更改翻译模式
/// [mode] 翻译模式:simultaneous(同声传译)、audioVideo(音视频)、call(通话)、faceToFace(面对面)
/// 参数:
/// - [mode] 翻译模式:simultaneous(同声传译)、audioVideo(音视频)、call(通话)、faceToFace(面对面)
/// 返回值:无
/// 异常:可能抛出底层服务调用异常
Future<void> changeTranslationMode(String mode) async {
currentMode.value = mode;
currentModeTitle.value = _getModeTitle(mode);
@ -338,6 +344,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
loadTranslationHistory();
//stopAll();
if (mode == 'faceToFace' || mode == 'call' || mode == 'simultaneous') {
await suspendOtherServices();
}
if (Platform.isAndroid && (mode == 'call' || mode == 'audioVideo')) {
try {
_floatingWindowManager.setLastTranslationMode(mode);
@ -741,16 +751,26 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
}
/// 暂停其他服务(如音乐播放)
/// 参数:无
/// 返回值:无
/// 异常:内部捕获并记录日志,不向外抛出
Future<void> suspendOtherServices() async {
try {
var status = await _musiceManager.getStatus();
var isPlaying = status['isPlaying'] ?? false;
if (!isContinuePlaying) {
final status = await _musiceManager.getStatus();
final bool isPlaying = status['isPlaying'] ?? false;
if (isPlaying == true) {
isContinuePlaying = true;
await _musiceManager.pause();
}
}
if (isPlaying == true) {
isContinuePlaying = true;
await _musiceManager.pause();
} else {
isContinuePlaying = false;
if (!_isContinueQqMusicPlaying) {
await _qqMusicManager.syncCurrentPlayInfo();
if (_qqMusicManager.isPlaying.value == true) {
_isContinueQqMusicPlaying = true;
await _qqMusicManager.pauseMusic();
}
}
} catch (e) {
Logger.error('暂停其他服务失败: ${e.toString()}');
@ -758,11 +778,18 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
}
/// 恢复其他服务(如音乐播放)
/// 参数:无
/// 返回值:无
/// 异常:内部捕获并记录日志,不向外抛出
Future<void> restoreOtherServices() async {
try {
if (isContinuePlaying) await _musiceManager.resume();
if (_isContinueQqMusicPlaying) await _qqMusicManager.resumeMusic();
} catch (e) {
Logger.error('恢复其他服务失败: ${e.toString()}');
} finally {
isContinuePlaying = false;
_isContinueQqMusicPlaying = false;
}
}

Loading…
Cancel
Save