diff --git a/Persephone/Controllers/QueueViewController.swift b/Persephone/Controllers/QueueViewController.swift index bf26dfd..b8b9d9f 100644 --- a/Persephone/Controllers/QueueViewController.swift +++ b/Persephone/Controllers/QueueViewController.swift @@ -36,7 +36,7 @@ class QueueViewController: NSViewController, let newQueuePos = queueView.selectedRow - 1 if newQueuePos >= 0 { - AppDelegate.mpdClient.playTrack(queuePos: newQueuePos) + AppDelegate.mpdClient.playTrack(at: newQueuePos) } } diff --git a/Persephone/MPDClient/Extensions/MPDClient+Command.swift b/Persephone/MPDClient/Extensions/MPDClient+Command.swift index 2fdbb49..f328c2e 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Command.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Command.swift @@ -24,12 +24,22 @@ extension MPDClient { sendStop() case .playPause: sendPlay() + case .seekCurrentSong: + guard let timeInSeconds = userData["timeInSeconds"] as? Float + else { return } + sendSeekCurrentSong(timeInSeconds: timeInSeconds) // Status commands case .fetchStatus: sendRunStatus() + + // Queue commands case .fetchQueue: sendFetchQueue() + case .playTrack: + guard let queuePos = userData["queuePos"] as? Int + else { return } + sendPlayTrack(at: queuePos) // Album commands case .fetchAllAlbums: diff --git a/Persephone/MPDClient/Extensions/MPDClient+Queue.swift b/Persephone/MPDClient/Extensions/MPDClient+Queue.swift index 9224395..8dec10c 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Queue.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Queue.swift @@ -14,16 +14,12 @@ extension MPDClient { sendCommand(command: .fetchQueue) } - func playTrack(queuePos: Int) { - guard isConnected else { return } + func playTrack(at queuePos: Int) { + queueCommand(command: .playTrack, userData: ["queuePos": queuePos]) + } - noIdle() - let commandOperation = BlockOperation { [unowned self] in - mpd_run_play_pos(self.connection, UInt32(queuePos)) - } - commandOperation.queuePriority = .veryHigh - commandQueue.addOperation(commandOperation) - idle() + func sendPlayTrack(at queuePos: Int) { + mpd_run_play_pos(self.connection, UInt32(queuePos)) } func sendFetchQueue() { diff --git a/Persephone/MPDClient/Extensions/MPDClient+Transport.swift b/Persephone/MPDClient/Extensions/MPDClient+Transport.swift index c9d95e7..1711407 100644 --- a/Persephone/MPDClient/Extensions/MPDClient+Transport.swift +++ b/Persephone/MPDClient/Extensions/MPDClient+Transport.swift @@ -27,11 +27,10 @@ extension MPDClient { } func seekCurrentSong(timeInSeconds: Float) { - noIdle() - commandQueue.addOperation { [unowned self] in - mpd_run_seek_current(self.connection, timeInSeconds, false) - } - idle() + queueCommand( + command: .seekCurrentSong, + userData: ["timeInSeconds": timeInSeconds] + ) } func sendNextTrack() { @@ -62,4 +61,7 @@ extension MPDClient { } } + func sendSeekCurrentSong(timeInSeconds: Float) { + mpd_run_seek_current(self.connection, timeInSeconds, false) + } } diff --git a/Persephone/MPDClient/MPDClient.swift b/Persephone/MPDClient/MPDClient.swift index 611dab8..ce2b929 100644 --- a/Persephone/MPDClient/MPDClient.swift +++ b/Persephone/MPDClient/MPDClient.swift @@ -22,8 +22,8 @@ class MPDClient { var commandsQueued: UInt = 0 enum Command { - case prevTrack, nextTrack, playPause, stop, - fetchStatus, fetchQueue, fetchAllAlbums, + case prevTrack, nextTrack, playPause, stop, seekCurrentSong, + fetchStatus, fetchQueue, playTrack, fetchAllAlbums, playAlbum, getAlbumURI }