1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

Compare commits

...

3 Commits

Author SHA1 Message Date
2186cd69e3 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.
2020-01-13 22:00:47 -05:00
9a69734c23 Fix queuepos out of bounds error
Sometimes the status gets updated before the queue has been retrieved.
In these cases we want to skip setting the current song until it has
been.
2020-01-13 21:59:30 -05:00
8e81636500 Use the search query UI state 2020-01-13 21:59:06 -05:00
9 changed files with 72 additions and 49 deletions

View File

@ -23,9 +23,6 @@ class AppDelegate: NSObject,
@IBOutlet weak var addSelectedSongToQueueMenuItem: NSMenuItem! @IBOutlet weak var addSelectedSongToQueueMenuItem: NSMenuItem!
func applicationDidFinishLaunching(_ aNotification: Notification) { func applicationDidFinishLaunching(_ aNotification: Notification) {
connectToMPDServer()
instantiateControllers()
mediaKeyTap = MediaKeyTap(delegate: self) mediaKeyTap = MediaKeyTap(delegate: self)
mediaKeyTap?.start() mediaKeyTap?.start()
@ -34,22 +31,16 @@ class AppDelegate: NSObject,
$0.uiState $0.uiState
} }
} }
instantiateControllers()
connectToMPDServer()
} }
func connectToMPDServer() { func connectToMPDServer() {
let mpdServer = App.store.state.preferencesState.mpdServer App.mpdServerController.connect()
App.mpdClient = MPDClient(
host: mpdServer.hostOrDefault,
port: mpdServer.portOrDefault,
withDelegate: App.mpdServerDelegate
)
App.mpdClient.connect()
} }
func instantiateControllers() { func instantiateControllers() {
_ = App.mpdServerController
_ = App.userNotificationsController _ = App.userNotificationsController
} }

View File

@ -11,9 +11,24 @@ import ReSwift
class MPDServerController { class MPDServerController {
init() { init() {
// App.store.subscribe(self) { App.mpdClient = MPDClient(withDelegate: App.mpdServerDelegate)
// $0.select { $0.preferencesState.mpdServer }
// } 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 typealias StoreSubscriberStateType = MPDServer
func newState(state: MPDServer) { func newState(state: MPDServer) {
App.mpdClient.disconnect() guard App.mpdClient != nil else { return }
App.mpdClient.connect()
disconnect()
connect()
} }
} }

View File

@ -163,8 +163,7 @@ class WindowController: NSWindowController {
} }
@IBAction func handleSearchQuery(_ sender: NSSearchField) { @IBAction func handleSearchQuery(_ sender: NSSearchField) {
//App.store.dispatch(SetSearchQuery(searchQuery: sender.stringValue)) App.store.dispatch(SetSearchQuery(searchQuery: sender.stringValue))
App.mpdClient.fetchAlbums(filter: sender.stringValue)
} }
} }

View File

@ -15,6 +15,14 @@ extension MPDClient {
) { ) {
switch command { 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 // Transport commands
case .prevTrack: case .prevTrack:
sendPreviousTrack() sendPreviousTrack()

View File

@ -10,8 +10,7 @@ import Foundation
import mpdclient import mpdclient
extension MPDClient { extension MPDClient {
func makeConnectionOperation(host: String, port: Int) -> BlockOperation { func createConnection(host: String, port: Int) {
BlockOperation { [unowned self] in
guard let connection = mpd_connection_new(host, UInt32(port), 10000), guard let connection = mpd_connection_new(host, UInt32(port), 10000),
mpd_connection_get_error(connection) == MPD_ERROR_SUCCESS mpd_connection_get_error(connection) == MPD_ERROR_SUCCESS
else { return } else { return }
@ -26,24 +25,27 @@ extension MPDClient {
self.delegate?.didConnect(mpdClient: self) self.delegate?.didConnect(mpdClient: self)
self.delegate?.didUpdateStatus(mpdClient: self, status: self.status!) self.delegate?.didUpdateStatus(mpdClient: self, status: self.status!)
self.idle()
}
} }
func connect() { func freeConnection() {
commandQueue.addOperation(connectionOperation)
}
func disconnect() {
guard isConnected else { return } guard isConnected else { return }
noIdle()
commandQueue.addOperation { [unowned self] in
self.delegate?.willDisconnect(mpdClient: self) self.delegate?.willDisconnect(mpdClient: self)
mpd_connection_free(self.connection) mpd_connection_free(self.connection)
self.isConnected = false 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)
} }
} }

View File

@ -22,9 +22,8 @@ class MPDClient {
let commandQueue = OperationQueue() let commandQueue = OperationQueue()
init(host: String, port: Int, withDelegate delegate: MPDClientDelegate?) { init(withDelegate delegate: MPDClientDelegate?) {
commandQueue.maxConcurrentOperationCount = 1 commandQueue.maxConcurrentOperationCount = 1
self.delegate = delegate self.delegate = delegate
self.connectionOperation = makeConnectionOperation(host: host, port: port)
} }
} }

View File

@ -10,6 +10,9 @@ import Foundation
extension MPDClient { extension MPDClient {
enum MPDCommand { enum MPDCommand {
case connect
case disconnect
// Transport commands // Transport commands
case prevTrack case prevTrack
case nextTrack case nextTrack

View File

@ -36,7 +36,7 @@ func queueReducer(action: Action, state: QueueState?) -> QueueState {
if oldSongRowPos >= 0 { if oldSongRowPos >= 0 {
state.queue[oldSongRowPos].isPlaying = false state.queue[oldSongRowPos].isPlaying = false
} }
if newSongRowPos >= 0 { if newSongRowPos >= 0 && state.queue.count > newSongRowPos {
state.queue[newSongRowPos].isPlaying = true state.queue[newSongRowPos].isPlaying = true
DispatchQueue.main.async { DispatchQueue.main.async {

View File

@ -6,6 +6,7 @@
// Copyright © 2019 Dan Barber. All rights reserved. // Copyright © 2019 Dan Barber. All rights reserved.
// //
import AppKit
import ReSwift import ReSwift
func uiReducer(action: Action, state: UIState?) -> UIState { func uiReducer(action: Action, state: UIState?) -> UIState {
@ -35,6 +36,9 @@ func uiReducer(action: Action, state: UIState?) -> UIState {
case let action as SetSearchQuery: case let action as SetSearchQuery:
state.searchQuery = action.searchQuery state.searchQuery = action.searchQuery
DispatchQueue.main.async {
App.mpdClient.fetchAlbums(filter: state.searchQuery)
}
default: default:
break break