diff --git a/src/assets/icons/loopmode_stop_black_24dp.svg b/src/assets/icons/loopmode_stop_black_24dp.svg new file mode 100644 index 0000000..fa4915d --- /dev/null +++ b/src/assets/icons/loopmode_stop_black_24dp.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/src/fonts/MuckeIcons.ttf b/src/fonts/MuckeIcons.ttf index 4c19c2e..295a0a8 100644 Binary files a/src/fonts/MuckeIcons.ttf and b/src/fonts/MuckeIcons.ttf differ diff --git a/src/lib/presentation/mucke_icons.dart b/src/lib/presentation/mucke_icons.dart index 6504d98..89016da 100644 --- a/src/lib/presentation/mucke_icons.dart +++ b/src/lib/presentation/mucke_icons.dart @@ -1,6 +1,18 @@ /// Flutter icons MuckeIcons /// Copyright (C) 2023 by original authors @ fluttericon.com, fontello.com /// This font was generated by FlutterIcon.com, which is derived from Fontello. +/// +/// To use this font, place it in your fonts/ directory and include the +/// following in your pubspec.yaml +/// +/// flutter: +/// fonts: +/// - family: MuckeIcons +/// fonts: +/// - asset: fonts/MuckeIcons.ttf +/// +/// +/// import 'package:flutter/widgets.dart'; class MuckeIcons { @@ -9,22 +21,15 @@ class MuckeIcons { static const _kFontFam = 'MuckeIcons'; static const String? _kFontPkg = null; - static const IconData exclude_always = - IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData exclude_never = - IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData exclude_shuffle = - IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData exclude_shuffle_all = - IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData favorite_1_3 = - IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData favorite_2_3 = - IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData shuffle_heart = - IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData shuffle_none = - IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData exclude_always = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData exclude_never = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData exclude_shuffle = IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData exclude_shuffle_all = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData favorite_1_3 = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData favorite_2_3 = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData loopmode_stop = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData shuffle_heart = IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData shuffle_none = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData link_both = IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData link_next = IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData link_prev = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg); diff --git a/src/lib/presentation/widgets/loop_button.dart b/src/lib/presentation/widgets/loop_button.dart index 857b8c8..d0a7ccc 100644 --- a/src/lib/presentation/widgets/loop_button.dart +++ b/src/lib/presentation/widgets/loop_button.dart @@ -3,6 +3,7 @@ import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:get_it/get_it.dart'; import '../../domain/entities/loop_mode.dart'; +import '../mucke_icons.dart'; import '../state/audio_store.dart'; class LoopButton extends StatelessWidget { @@ -59,7 +60,7 @@ class LoopButton extends StatelessWidget { case LoopMode.stop: return IconButton( icon: const Icon( - Icons.arrow_right_alt, + MuckeIcons.loopmode_stop, color: Colors.white, ), iconSize: iconSize, diff --git a/src/lib/system/datasources/audio_player_data_source_impl.dart b/src/lib/system/datasources/audio_player_data_source_impl.dart index 814fa0f..88da47c 100644 --- a/src/lib/system/datasources/audio_player_data_source_impl.dart +++ b/src/lib/system/datasources/audio_player_data_source_impl.dart @@ -26,7 +26,13 @@ class AudioPlayerDataSourceImpl implements AudioPlayerDataSource { _audioPlayer.playingStream.listen((event) => _playingSubject.add(event)); - _audioPlayer.positionStream.listen((event) => _positionSubject.add(event)); + _audioPlayer + .createPositionStream( + steps: 800, + minPeriod: const Duration(milliseconds: 16), + maxPeriod: const Duration(milliseconds: 100), + ) + .listen((event) => _positionSubject.add(event)); _audioPlayer.playbackEventStream.listen((event) { if (event.processingState == ja.ProcessingState.completed && _audioPlayer.playing) { @@ -497,7 +503,7 @@ class AudioPlayerDataSourceImpl implements AudioPlayerDataSource { await _audioPlayer.seek(duration * position); } } - + @override int calcNewCurrentIndexOnMove(int currentIndex, int oldIndex, int newIndex) { int newCurrentIndex = currentIndex; diff --git a/src/lib/system/repositories/audio_player_repository_impl.dart b/src/lib/system/repositories/audio_player_repository_impl.dart index a48d503..dc7277e 100644 --- a/src/lib/system/repositories/audio_player_repository_impl.dart +++ b/src/lib/system/repositories/audio_player_repository_impl.dart @@ -39,15 +39,15 @@ class AudioPlayerRepositoryImpl implements AudioPlayerRepository { } }); positionStream.listen((position) async { - final durationMs = _audioPlayerDataSource.durationStream.value?.inMilliseconds; + final durationMs = _audioPlayerDataSource.durationStream.valueOrNull?.inMilliseconds; final positionMs = position.inMilliseconds; - - if ( - loopModeStream.value == LoopMode.stop && - durationMs != null && - positionMs.compareTo(durationMs - 250) > 0 && // less than 250 milliseconds in the song remaining - _audioPlayerDataSource.playingStream.value // don't skip to next if we aren't playing - ) { + + if (loopModeStream.value == LoopMode.stop && + durationMs != null && + // less than 101 milliseconds in the song remaining + positionMs > durationMs - 101 && + // don't skip to next if we aren't playing + _audioPlayerDataSource.playingStream.value) { await pause(); await seekToNext(); }