diff options
author | Scott Murray <scott.murray@konsulko.com> | 2024-01-03 18:14:12 -0500 |
---|---|---|
committer | Scott Murray <scott.murray@konsulko.com> | 2024-01-03 18:23:55 -0500 |
commit | 2d395f4431ba4aa5055d02437463588f4d4c8127 (patch) | |
tree | 977be67fcfab0edac1e6e03f77af6e7be0dc8931 /lib/data/models | |
parent | 4742fde5c48726357cc8db06d237e9db6c3df608 (diff) |
Initial mediaplayer implementation
Notable changes:
- Added dart_mpd package as a dependency.
- Added MPD client class and associated provider.
- Added MPD client configuration to the configuration file for
potential usecases where MPD may not be available locally.
- Added playlist, play state, art, etc. providers for use in the
mediaplayer front end UI.
- Reworked MediaPlayer classes to wire up MPD client backend.
- Removed volume slider from the bottom of the media pages to
make more room for playlist / preset tables, as only being
able to show 3 entries in each was not usable in practice.
- Reworked media player mocked up position indicator into an
actual slider control, and reworked the radio slider styling
to match for better UI consistency.
- Reworked media player and radio playlist / preset tables to
attempt to have them layout at the same location and add an
always visible scroll bar. The scroll bars currently have a
layout issue with respect to scroll track size that does not
seem to have an obvious fix. They are usable for now, and
further investigation will be done when time permits.
- Wired up play/pause button on the side volume control via a
new set of play state and controller providers.
Bug-AGL: SPEC-5028, SPEC-5029
Change-Id: I87efecc58b4e185443942eb32ff8148ebcd675c3
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Diffstat (limited to 'lib/data/models')
-rw-r--r-- | lib/data/models/audio_state.dart | 30 | ||||
-rw-r--r-- | lib/data/models/mediaplayer_state.dart | 49 | ||||
-rw-r--r-- | lib/data/models/radio_state.dart | 32 |
3 files changed, 49 insertions, 62 deletions
diff --git a/lib/data/models/audio_state.dart b/lib/data/models/audio_state.dart index cfa550b..60720a8 100644 --- a/lib/data/models/audio_state.dart +++ b/lib/data/models/audio_state.dart @@ -40,36 +40,6 @@ class AudioState { ); } - Map<String, dynamic> toMap() { - return { - 'volume': volume, - 'balance': balance, - 'fade': fade, - 'treble': treble, - 'bass': bass, - }; - } - - factory AudioState.fromMap(Map<String, dynamic> map) { - return AudioState( - volume: map['volume']?.toDouble() ?? 0.0, - balance: map['balance']?.toDouble() ?? 0.0, - fade: map['fade']?.toDouble() ?? 0.0, - treble: map['treble']?.toDouble() ?? 0.0, - bass: map['bass']?.toDouble() ?? 0.0, - ); - } - - String toJson() => json.encode(toMap()); - - factory AudioState.fromJson(String source) => - AudioState.fromMap(json.decode(source)); - - @override - String toString() { - return 'AudioState(volume: $volume, balance: $balance, fade: $fade, treble: $treble, bass: $bass)'; - } - @override bool operator ==(Object other) { if (identical(this, other)) return true; diff --git a/lib/data/models/mediaplayer_state.dart b/lib/data/models/mediaplayer_state.dart new file mode 100644 index 0000000..f880a1e --- /dev/null +++ b/lib/data/models/mediaplayer_state.dart @@ -0,0 +1,49 @@ +import 'package:flutter_ics_homescreen/export.dart'; +import 'package:flutter_ics_homescreen/data/data_providers/playlist_notifier.dart'; + +enum PlayState { stopped, playing, paused } + +@immutable +class MediaPlayerState { + final int playlistPosition; + final PlayState playState; + final PlaylistEntry? song; + + const MediaPlayerState( + {required this.playlistPosition, + required this.playState, + required this.song}); + + const MediaPlayerState.initial() + : playlistPosition = -1, + playState = PlayState.stopped, + song = null; + + MediaPlayerState copyWith( + {int? playlistPosition, + PlayState? playState, + PlaylistEntry? song, + Duration? songPosition, + Duration? songLength}) { + return MediaPlayerState( + playlistPosition: playlistPosition ?? this.playlistPosition, + playState: playState ?? this.playState, + song: song ?? this.song, + ); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is MediaPlayerState && + other.playlistPosition == playlistPosition && + other.playState == playState && + other.song == song; + } + + @override + int get hashCode { + return playlistPosition.hashCode ^ playState.hashCode ^ song.hashCode; + } +} diff --git a/lib/data/models/radio_state.dart b/lib/data/models/radio_state.dart index dd307d9..da972fd 100644 --- a/lib/data/models/radio_state.dart +++ b/lib/data/models/radio_state.dart @@ -43,38 +43,6 @@ class RadioState { ); } - Map<String, dynamic> toMap() { - return { - 'freqMin': freqMin, - 'freqMax': freqMax, - 'freqStep': freqStep, - 'freqCurrent': freqCurrent, - 'playing': playing, - 'scanning': scanning, - }; - } - - factory RadioState.fromMap(Map<String, dynamic> map) { - return RadioState( - freqMin: map['freqMin']?.toInt().toUnsigned() ?? 0, - freqMax: map['freqMax']?.toInt().toUnsigned() ?? 0, - freqStep: map['freqStep']?.toInt().toUnsigned() ?? 0, - freqCurrent: map['freqCurrent']?.toInt().toUnsigned() ?? 0, - playing: map['playing']?.toBool() ?? false, - scanning: map['scanning']?.toBool() ?? false, - ); - } - - String toJson() => json.encode(toMap()); - - factory RadioState.fromJson(String source) => - RadioState.fromMap(json.decode(source)); - - @override - String toString() { - return 'RadioState(freqMin: $freqMin, freqMax: $freqMax, freqStep: $freqStep, freqCurrent: $freqCurrent, playing: $playing, scanning: $scanning)'; - } - @override bool operator ==(Object other) { if (identical(this, other)) return true; |