1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00
persephone/Persephone/MPDClient/Extensions/MPDClient+Idle.swift
Dan Barber fe748e2c61
WIP: Refactor MPDClient
This should make handling the queuing side work more reliably.
2019-03-20 20:06:23 -04:00

57 lines
1.3 KiB
Swift

//
// Idle.swift
// Persephone
//
// Created by Daniel Barber on 2019/3/15.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import Foundation
import mpdclient
extension MPDClient {
func noIdle() {
if isIdle {
mpd_send_noidle(connection)
isIdle = false
}
}
func idle() {
let idleOperation = BlockOperation {
if !self.isIdle && self.commandsQueued == 0 {
mpd_send_idle(self.connection)
self.isIdle = true
let result = mpd_recv_idle(self.connection, true)
self.handleIdleResult(result)
}
}
idleOperation.queuePriority = .veryLow
commandQueue.addOperation(idleOperation)
}
func handleIdleResult(_ result: mpd_idle) {
isIdle = false
let mpdIdle = Idle(rawValue: result.rawValue)
if mpdIdle.contains(.queue) {
self.fetchQueue()
self.delegate?.didUpdateQueue(mpdClient: self, queue: self.queue)
}
if mpdIdle.contains(.player) {
self.fetchStatus()
if let status = self.status {
self.delegate?.didUpdateState(mpdClient: self, state: status.state)
self.delegate?.didUpdateTime(mpdClient: self, total: status.totalTime, elapsedMs: status.elapsedTimeMs)
self.delegate?.didUpdateQueuePos(mpdClient: self, song: status.song)
}
}
if !mpdIdle.isEmpty {
self.idle()
}
}
}