Skip to content

Commit

Permalink
feature: Added PlaybackState with additional states for better UX (#70)
Browse files Browse the repository at this point in the history
  • Loading branch information
onl1ner authored Apr 22, 2024
1 parent a3e2da5 commit cb05528
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 25 deletions.
27 changes: 18 additions & 9 deletions mupl/Common/Components/Playbar/PlaybarSongControls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,26 @@ extension Playbar {
self.musicPlayer.skip(.backward)
}

Image(systemName: self.musicPlayer.playbackStatus == .playing ? "pause.fill" : "play.fill")
.foregroundStyle(Color.secondaryText)
.tappable {
Task {
if self.musicPlayer.playbackStatus == .playing {
self.musicPlayer.pause()
} else {
await self.musicPlayer.play()
Group {
if self.musicPlayer.playbackState == .loading {
Image(systemName: "ellipsis")
.foregroundStyle(Color.secondaryText)
.symbolEffect(.variableColor.iterative.dimInactiveLayers, options: .repeating)
} else {
Image(systemName: self.musicPlayer.playbackState == .playing ? "pause.fill" : "play.fill")
.foregroundStyle(Color.secondaryText)
.tappable {
Task {
if self.musicPlayer.playbackState == .playing {
self.musicPlayer.pause()
} else {
await self.musicPlayer.play()
}
}
}
}
}
}
.frame(width: 20.0)

Image(systemName: "forward.fill")
.foregroundStyle(Color.secondaryText)
Expand Down
4 changes: 2 additions & 2 deletions mupl/Common/Components/SongItem/SongItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ struct SongItem<S: SongItemStyle>: View {
)
.onAppear {
self.isCurrent = self.musicPlayer.currentSong?.id == self.song.id
self.isCurrentlyPlaying = self.isCurrent && self.musicPlayer.playbackStatus == .playing
self.isCurrentlyPlaying = self.isCurrent && self.musicPlayer.playbackState == .playing
}
.onChange(of: self.musicPlayer.currentSong) { _, value in
self.isCurrent = value?.id == self.song.id
}
.onChange(of: self.musicPlayer.playbackStatus) { _, value in
.onChange(of: self.musicPlayer.playbackState) { _, value in
self.isCurrentlyPlaying = self.isCurrent && value == .playing
}
.onHover { hovering in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ struct GroupedSongItemStyle: SongItemStyle {
Text(duration)
.font(.system(size: 14.0, weight: .medium))
.foregroundStyle(Color.secondaryText)
.frame(width: 40.0)
.frame(width: 40.0, alignment: .leading)
}
}
.padding(.all, 16.0)
Expand Down
11 changes: 5 additions & 6 deletions mupl/Common/Components/SongItem/Styles/PlainSongItemStyle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,11 @@ struct PlainSongItemStyle: SongItemStyle {

Spacer()

HStack {
if let duration = song.duration?.minutesAndSeconds {
Text(duration)
.font(.system(size: 12.0, weight: .medium))
.foregroundStyle(Color.secondaryText)
}
if let duration = song.duration?.minutesAndSeconds {
Text(duration)
.font(.system(size: 12.0, weight: .medium))
.foregroundStyle(Color.secondaryText)
.frame(width: 40.0, alignment: .leading)
}
}
.animation(.easeIn(duration: 0.2), value: context.isHovered)
Expand Down
34 changes: 27 additions & 7 deletions mupl/Common/Models/Services/Music/Base/Player/MusicPlayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,22 @@ final class MusicPlayer: ObservableObject {
case backward
}

enum PlaybackState {
case playing
case loading
case paused
case stopped

init(playbackStatus: PlaybackStatus) {
self = switch playbackStatus {
case .playing: .playing
case .paused: .paused
case .stopped: .stopped
default: .stopped
}
}
}

private let manager: MusicManager = .shared
private let player: ApplicationMusicPlayer = .shared
private let audio: Audio = .init()
Expand Down Expand Up @@ -48,7 +64,7 @@ final class MusicPlayer: ObservableObject {
}
}

@Published private(set) var playbackStatus: PlaybackStatus = .stopped {
@Published private(set) var playbackState: PlaybackState = .stopped {
didSet {
self.updatePlaybackTimeObservation()
}
Expand Down Expand Up @@ -93,8 +109,12 @@ final class MusicPlayer: ObservableObject {
self.shuffleMode = shuffleMode
}

self.playbackState = .loading

try? await self.player.prepareToPlay()
try? await self.player.play()

self.playbackState = .playing
}

func play(item: PlayableMusicItem, shuffleMode: ShuffleMode? = nil) async {
Expand Down Expand Up @@ -134,12 +154,12 @@ final class MusicPlayer: ObservableObject {
}

func pause() {
guard self.playbackStatus != .paused else { return }
guard self.playbackState != .paused else { return }
self.player.pause()
}

func stop() {
guard self.playbackStatus != .stopped else { return }
guard self.playbackState != .stopped else { return }
self.player.stop()
}

Expand Down Expand Up @@ -192,20 +212,20 @@ final class MusicPlayer: ObservableObject {
}

private func updatePlaybackTimeObservation() {
switch self.playbackStatus {
switch self.playbackState {
case .playing:
self.runPlaybackTimeObservation()
case .paused, .interrupted, .seekingForward, .seekingBackward:
case .paused:
self.pausePlaybackTimeObservation()
case .stopped:
self.stopPlaybackTimeObservation()
@unknown default:
default:
break
}
}

private func updateState() {
self.playbackStatus = self.player.state.playbackStatus
self.playbackState = .init(playbackStatus: self.player.state.playbackStatus)
self.shuffleMode = self.player.state.shuffleMode ?? .off
self.repeatMode = self.player.state.repeatMode ?? .none
}
Expand Down

0 comments on commit cb05528

Please sign in to comment.