Skip to content

Commit

Permalink
sound: Replace package to audioplayers
Browse files Browse the repository at this point in the history
  • Loading branch information
calcitem committed Nov 29, 2024
1 parent a84f528 commit 360819b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 110 deletions.
5 changes: 2 additions & 3 deletions src/ui/flutter_app/lib/game_page/services/mill.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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';
Expand Down
128 changes: 32 additions & 96 deletions src/ui/flutter_app/lib/game_page/services/sounds/sound_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Map<Sound, String>> _soundFiles =
Expand Down Expand Up @@ -67,11 +63,8 @@ class SoundManager {
},
};

// Change to maintain a map of PlayerController instances for each sound.
final Map<Sound, kplayer.PlayerController> _players =
<Sound, kplayer.PlayerController>{};

final Map<Sound, int> _soundIds = <Sound, int>{};
// Map of AudioPlayer instances for each sound.
final Map<Sound, AudioPlayer> _players = <Sound, AudioPlayer>{};

bool _isTemporaryMute = false;

Expand All @@ -80,13 +73,6 @@ class SoundManager {
static const String _logTag = "[audio]";

Future<void> 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<Sound, String>? sounds = _soundFiles[soundThemeName];
Expand All @@ -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<void> _stopSound() async {
if (kIsWeb || Platform.isIOS) {
return;
}

if (_alarmSoundStreamId > 0) {
await _soundpool.stop(_alarmSoundStreamId);
}
Future<void> _stopAllSounds() async {
final List<Future<void>> stopFutures = <Future<void>>[];
_players.forEach((_, AudioPlayer player) {
stopFutures.add(player.stop());
});
await Future.wait(stopFutures);
}

Future<void> playTone(Sound sound) async {
if (kIsWeb) {
return;
}

assert(GameController().initialized);

if (_isTemporaryMute || DB().generalSettings.screenReaderSupport) {
return;
}
Expand All @@ -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<void> _stopAllSounds() async {
if (Platform.isIOS) {
final List<Future<void>> stopFutures = <Future<void>>[];
_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");
}
}

Expand All @@ -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();
}
}
12 changes: 1 addition & 11 deletions src/ui/flutter_app/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -37,24 +38,13 @@ 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
package_info_plus: 8.1.1
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
Expand Down

0 comments on commit 360819b

Please sign in to comment.