diff --git a/src/ui/flutter_app/lib/game_page/services/mill.dart b/src/ui/flutter_app/lib/game_page/services/mill.dart index 4926ae7a4..06c21d0aa 100644 --- a/src/ui/flutter_app/lib/game_page/services/mill.dart +++ b/src/ui/flutter_app/lib/game_page/services/mill.dart @@ -21,15 +21,14 @@ import 'dart:async'; import 'dart:io'; import 'dart:math'; +import 'package:audioplayers/audioplayers.dart'; import 'package:catcher_2/model/catcher_2_options.dart'; import 'package:filesystem_picker/filesystem_picker.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:kplayer/kplayer.dart' as kplayer; import 'package:path_provider/path_provider.dart'; -import 'package:soundpool/soundpool.dart'; import 'package:vibration/vibration.dart'; import '../../appearance_settings/models/color_settings.dart'; @@ -61,10 +60,10 @@ part 'engine/engine.dart'; part 'engine/ext_move.dart'; part 'engine/game.dart'; part 'engine/mills.dart'; +part 'engine/opening_book.dart'; part 'engine/position.dart'; part 'engine/types.dart'; part 'engine/zobrist.dart'; -part 'engine/opening_book.dart'; part 'import_export/import_export_service.dart'; part 'notifiers/board_semantics_notifier.dart'; part 'notifiers/game_result_notifier.dart'; diff --git a/src/ui/flutter_app/lib/game_page/services/sounds/sound_manager.dart b/src/ui/flutter_app/lib/game_page/services/sounds/sound_manager.dart index cb7086d2d..de6e4eaff 100644 --- a/src/ui/flutter_app/lib/game_page/services/sounds/sound_manager.dart +++ b/src/ui/flutter_app/lib/game_page/services/sounds/sound_manager.dart @@ -23,14 +23,10 @@ class SoundManager { factory SoundManager() => instance; SoundManager._(); - static bool booted = false; @visibleForTesting static SoundManager instance = SoundManager._(); - late Soundpool _soundpool; - int _alarmSoundStreamId = 0; - String? soundThemeName = 'ball'; final Map> _soundFiles = @@ -67,11 +63,8 @@ class SoundManager { }, }; - // Change to maintain a map of PlayerController instances for each sound. - final Map _players = - {}; - - final Map _soundIds = {}; + // Map of AudioPlayer instances for each sound. + final Map _players = {}; bool _isTemporaryMute = false; @@ -80,13 +73,6 @@ class SoundManager { static const String _logTag = "[audio]"; Future loadSounds() async { - // assert(!GameController().initialized); - - if (kIsWeb) { - logger.w("$_logTag Audio Player does not support Web."); - return; - } - soundThemeName = DB().generalSettings.soundTheme?.name ?? 'ball'; final Map? sounds = _soundFiles[soundThemeName]; @@ -95,54 +81,31 @@ class SoundManager { return; } - if (Platform.isIOS) { - if (booted == true) { - return; + try { + for (final Sound sound in sounds.keys) { + // Adjust the file path by replacing 'assets/' with ''. + final String fileName = sounds[sound]!.replaceFirst('assets/', ''); + final AudioPlayer player = AudioPlayer(); + await player.setReleaseMode(ReleaseMode.stop); + await player.setSource(AssetSource(fileName)); + _players[sound] = player; } - - kplayer.Player.boot(); - kplayer.PlayerController.enableLog = false; - - sounds.forEach((Sound sound, String fileName) { - _players[sound] = kplayer.Player.asset(fileName, autoPlay: false); - }); - - booted = true; _allSoundsLoaded = true; - } else { - _soundpool = Soundpool.fromOptions(); - - try { - for (final Sound sound in sounds.keys) { - final int soundId = - await _soundpool.load(await rootBundle.load(sounds[sound]!)); - _soundIds[sound] = soundId; - } - _allSoundsLoaded = true; - } catch (e) { - logger.e("Failed to load sound: $e"); - _allSoundsLoaded = false; - } + } catch (e) { + logger.e("Failed to load sound: $e"); + _allSoundsLoaded = false; } } - Future _stopSound() async { - if (kIsWeb || Platform.isIOS) { - return; - } - - if (_alarmSoundStreamId > 0) { - await _soundpool.stop(_alarmSoundStreamId); - } + Future _stopAllSounds() async { + final List> stopFutures = >[]; + _players.forEach((_, AudioPlayer player) { + stopFutures.add(player.stop()); + }); + await Future.wait(stopFutures); } Future playTone(Sound sound) async { - if (kIsWeb) { - return; - } - - assert(GameController().initialized); - if (_isTemporaryMute || DB().generalSettings.screenReaderSupport) { return; } @@ -160,37 +123,17 @@ class SoundManager { return; } - if (Platform.isIOS) { - await _stopAllSounds(); + await _stopAllSounds(); - final kplayer.PlayerController? player = _players[sound]; - if (player == null) { - logger.e("No player found for sound $sound in theme $soundThemeName."); - return; - } - try { - await player.play(); - } catch (e) { - logger.e("$_logTag Error playing sound: $e"); - } - } else { - await _stopSound(); - final int? soundId = _soundIds[sound]; - if (soundId == null) { - logger.e("Sound ID for $sound is not found in theme $soundThemeName."); - return; - } - _alarmSoundStreamId = await _soundpool.play(soundId); + final AudioPlayer? player = _players[sound]; + if (player == null) { + logger.e("No player found for sound $sound in theme $soundThemeName."); + return; } - } - - Future _stopAllSounds() async { - if (Platform.isIOS) { - final List> stopFutures = >[]; - _players.forEach((_, kplayer.PlayerController player) { - stopFutures.add(player.stop()); - }); - await Future.wait(stopFutures); + try { + await player.resume(); + } catch (e) { + logger.e("$_logTag Error playing sound: $e"); } } @@ -203,16 +146,9 @@ class SoundManager { } void disposePool() { - if (kIsWeb) { - return; - } - - if (Platform.isIOS) { - _players - .forEach((_, kplayer.PlayerController player) => player.dispose()); - _players.clear(); - } else { - _soundpool.dispose(); - } + _players.forEach((_, AudioPlayer player) { + player.dispose(); + }); + _players.clear(); } } diff --git a/src/ui/flutter_app/pubspec.yaml b/src/ui/flutter_app/pubspec.yaml index 8f6882535..81fde6fdc 100644 --- a/src/ui/flutter_app/pubspec.yaml +++ b/src/ui/flutter_app/pubspec.yaml @@ -8,6 +8,7 @@ environment: dependencies: animated_text_kit: 4.2.2 + audioplayers: 6.1.0 catcher_2: 2.0.2 collection: 1.18.0 crop_your_image: 1.1.0 @@ -37,7 +38,6 @@ dependencies: image_picker: 1.1.2 intl: 0.19.0 json_annotation: 4.9.0 - kplayer: 0.4.2 logger: 2.5.0 marquee: 2.3.0 native_screenshot_widget: 0.0.8 @@ -45,16 +45,6 @@ dependencies: path: 1.9.0 path_provider: 2.1.5 share_plus: 10.1.2 - soundpool: - git: - url: https://gitlab.com/calcitem/soundpool.git - ref: master - path: soundpool - soundpool_windux: - git: - url: https://gitlab.com/calcitem/soundpool.git - ref: windows_linux_support - path: soundpool_windux vibration: 2.0.1 url_launcher: 6.3.1 uuid: 4.5.1