mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
Refactor connection logic
The app would crash when connection settings were changed. This refactors the connection logic to be consistent with the rest of the mpdclient command structure. This ultimately fixes the bug.
This commit is contained in:
parent
d075a06c41
commit
b581f297c9
@ -23,9 +23,6 @@ class AppDelegate: NSObject,
|
||||
@IBOutlet weak var addSelectedSongToQueueMenuItem: NSMenuItem!
|
||||
|
||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||
connectToMPDServer()
|
||||
instantiateControllers()
|
||||
|
||||
mediaKeyTap = MediaKeyTap(delegate: self)
|
||||
mediaKeyTap?.start()
|
||||
|
||||
@ -34,22 +31,16 @@ class AppDelegate: NSObject,
|
||||
$0.uiState
|
||||
}
|
||||
}
|
||||
|
||||
instantiateControllers()
|
||||
connectToMPDServer()
|
||||
}
|
||||
|
||||
func connectToMPDServer() {
|
||||
let mpdServer = App.store.state.preferencesState.mpdServer
|
||||
|
||||
App.mpdClient = MPDClient(
|
||||
host: mpdServer.hostOrDefault,
|
||||
port: mpdServer.portOrDefault,
|
||||
withDelegate: App.mpdServerDelegate
|
||||
)
|
||||
|
||||
App.mpdClient.connect()
|
||||
App.mpdServerController.connect()
|
||||
}
|
||||
|
||||
func instantiateControllers() {
|
||||
_ = App.mpdServerController
|
||||
_ = App.userNotificationsController
|
||||
}
|
||||
|
||||
|
||||
@ -11,9 +11,24 @@ import ReSwift
|
||||
|
||||
class MPDServerController {
|
||||
init() {
|
||||
// App.store.subscribe(self) {
|
||||
// $0.select { $0.preferencesState.mpdServer }
|
||||
// }
|
||||
App.mpdClient = MPDClient(withDelegate: App.mpdServerDelegate)
|
||||
|
||||
App.store.subscribe(self) {
|
||||
$0.select { $0.preferencesState.mpdServer }
|
||||
}
|
||||
}
|
||||
|
||||
func connect() {
|
||||
let mpdServer = App.store.state.preferencesState.mpdServer
|
||||
|
||||
App.mpdClient.connect(
|
||||
host: mpdServer.hostOrDefault,
|
||||
port: mpdServer.portOrDefault
|
||||
)
|
||||
}
|
||||
|
||||
func disconnect() {
|
||||
App.mpdClient.disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,7 +36,9 @@ extension MPDServerController: StoreSubscriber {
|
||||
typealias StoreSubscriberStateType = MPDServer
|
||||
|
||||
func newState(state: MPDServer) {
|
||||
App.mpdClient.disconnect()
|
||||
App.mpdClient.connect()
|
||||
guard App.mpdClient != nil else { return }
|
||||
|
||||
disconnect()
|
||||
connect()
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,6 +15,14 @@ extension MPDClient {
|
||||
) {
|
||||
switch command {
|
||||
|
||||
case .connect:
|
||||
guard let host = userData["host"] as? String,
|
||||
let port = userData["port"] as? Int
|
||||
else { return }
|
||||
createConnection(host: host, port: port)
|
||||
case .disconnect:
|
||||
freeConnection()
|
||||
|
||||
// Transport commands
|
||||
case .prevTrack:
|
||||
sendPreviousTrack()
|
||||
|
||||
@ -10,8 +10,7 @@ import Foundation
|
||||
import mpdclient
|
||||
|
||||
extension MPDClient {
|
||||
func makeConnectionOperation(host: String, port: Int) -> BlockOperation {
|
||||
BlockOperation { [unowned self] in
|
||||
func createConnection(host: String, port: Int) {
|
||||
guard let connection = mpd_connection_new(host, UInt32(port), 10000),
|
||||
mpd_connection_get_error(connection) == MPD_ERROR_SUCCESS
|
||||
else { return }
|
||||
@ -26,24 +25,27 @@ extension MPDClient {
|
||||
|
||||
self.delegate?.didConnect(mpdClient: self)
|
||||
self.delegate?.didUpdateStatus(mpdClient: self, status: self.status!)
|
||||
|
||||
self.idle()
|
||||
}
|
||||
}
|
||||
|
||||
func connect() {
|
||||
commandQueue.addOperation(connectionOperation)
|
||||
}
|
||||
|
||||
func disconnect() {
|
||||
func freeConnection() {
|
||||
guard isConnected else { return }
|
||||
|
||||
noIdle()
|
||||
commandQueue.addOperation { [unowned self] in
|
||||
self.delegate?.willDisconnect(mpdClient: self)
|
||||
|
||||
mpd_connection_free(self.connection)
|
||||
self.isConnected = false
|
||||
}
|
||||
|
||||
func connect(host: String, port: Int) {
|
||||
let commandOperation = BlockOperation() { [unowned self] in
|
||||
self.sendCommand(command: .connect, userData: ["host": host, "port": port])
|
||||
|
||||
self.idle()
|
||||
}
|
||||
commandQueue.addOperation(commandOperation)
|
||||
}
|
||||
|
||||
func disconnect() {
|
||||
enqueueCommand(command: .disconnect)
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,9 +22,8 @@ class MPDClient {
|
||||
|
||||
let commandQueue = OperationQueue()
|
||||
|
||||
init(host: String, port: Int, withDelegate delegate: MPDClientDelegate?) {
|
||||
init(withDelegate delegate: MPDClientDelegate?) {
|
||||
commandQueue.maxConcurrentOperationCount = 1
|
||||
self.delegate = delegate
|
||||
self.connectionOperation = makeConnectionOperation(host: host, port: port)
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,9 @@ import Foundation
|
||||
|
||||
extension MPDClient {
|
||||
enum MPDCommand {
|
||||
case connect
|
||||
case disconnect
|
||||
|
||||
// Transport commands
|
||||
case prevTrack
|
||||
case nextTrack
|
||||
|
||||
Loading…
Reference in New Issue
Block a user