mac/remote: use EventHelper for event handling

This commit is contained in:
der richter 2024-03-24 00:04:53 +01:00
parent 4107d29c90
commit 3e6c931d90
2 changed files with 37 additions and 50 deletions

View File

@ -29,6 +29,10 @@ class AppHub: NSObject {
private override init() {
input = InputHelper()
super.init()
#if HAVE_MACOS_MEDIA_PLAYER
remote = RemoteCommandCenter(self)
#endif
}
@objc func initMpv(_ mpv: OpaquePointer) {
@ -37,11 +41,10 @@ class AppHub: NSObject {
mpv_observe_property(mpv, 0, "time-pos", MPV_FORMAT_DOUBLE)
mpv_observe_property(mpv, 0, "speed", MPV_FORMAT_DOUBLE)
mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_FLAG)
mpv_observe_property(mpv, 0, "media-title", MPV_FORMAT_STRING)
mpv_observe_property(mpv, 0, "chapter-metadata/title", MPV_FORMAT_STRING)
mpv_observe_property(mpv, 0, "metadata/by-key/album", MPV_FORMAT_STRING)
mpv_observe_property(mpv, 0, "metadata/by-key/artist", MPV_FORMAT_STRING)
event = EventHelper(mpv)
#if HAVE_MACOS_MEDIA_PLAYER
remote?.registerEvents()
#endif
}
@objc func initInput(_ input: OpaquePointer?) {
@ -55,7 +58,6 @@ class AppHub: NSObject {
@objc func startRemote() {
#if HAVE_MACOS_MEDIA_PLAYER
if remote == nil { remote = RemoteCommandCenter() }
remote?.start()
#endif
}
@ -83,12 +85,6 @@ class AppHub: NSObject {
app.processEvent(event)
}
#if HAVE_MACOS_MEDIA_PLAYER
if let remote = remote {
remote.processEvent(event)
}
#endif
switch event.pointee.event_id {
case MPV_EVENT_SHUTDOWN:
mpv_destroy(mpv)

View File

@ -39,7 +39,9 @@ extension RemoteCommandCenter {
}
}
class RemoteCommandCenter: NSObject {
class RemoteCommandCenter: EventSubscriber {
unowned let appHub: AppHub
var event: EventHelper? { get { return appHub.event } }
var configs: [MPRemoteCommand:Config] = [:]
var disabledCommands: [MPRemoteCommand] = []
var isPaused: Bool = false { didSet { updateInfoCenter() } }
@ -55,8 +57,8 @@ class RemoteCommandCenter: NSObject {
var infoCenter: MPNowPlayingInfoCenter { get { return MPNowPlayingInfoCenter.default() } }
var commandCenter: MPRemoteCommandCenter { get { return MPRemoteCommandCenter.shared() } }
@objc override init() {
super.init()
init(_ appHub: AppHub) {
self.appHub = appHub
configs = [
commandCenter.pauseCommand: Config(key: MP_KEY_PAUSEONLY, handler: keyHandler),
@ -91,7 +93,18 @@ class RemoteCommandCenter: NSObject {
}
}
@objc func start() {
func registerEvents() {
event?.subscribe(self, event: .init(name: "duration", format: MPV_FORMAT_DOUBLE))
event?.subscribe(self, event: .init(name: "time-pos", format: MPV_FORMAT_DOUBLE))
event?.subscribe(self, event: .init(name: "speed", format: MPV_FORMAT_DOUBLE))
event?.subscribe(self, event: .init(name: "pause", format: MPV_FORMAT_FLAG))
event?.subscribe(self, event: .init(name: "media-title", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "chapter-metadata/title", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "metadata/by-key/album", format: MPV_FORMAT_STRING))
event?.subscribe(self, event: .init(name: "metadata/by-key/artist", format: MPV_FORMAT_STRING))
}
func start() {
for (cmd, config) in configs {
cmd.isEnabled = true
cmd.addTarget(handler: config.handler)
@ -107,7 +120,7 @@ class RemoteCommandCenter: NSObject {
)
}
@objc func stop() {
func stop() {
for (cmd, _) in configs {
cmd.isEnabled = false
cmd.removeTarget(nil)
@ -169,43 +182,21 @@ class RemoteCommandCenter: NSObject {
return AppHub.shared.input.command(cmd) ? .success : .commandFailed
}
@objc func processEvent(_ event: UnsafeMutablePointer<mpv_event>) {
switch event.pointee.event_id {
case MPV_EVENT_PROPERTY_CHANGE:
handlePropertyChange(event)
default:
break
}
}
func handlePropertyChange(_ event: UnsafeMutablePointer<mpv_event>) {
let pData = OpaquePointer(event.pointee.data)
guard let property = UnsafePointer<mpv_event_property>(pData)?.pointee else {
return
}
switch String(cString: property.name) {
case "pause" where property.format == MPV_FORMAT_FLAG:
isPaused = TypeHelper.toBool(property.data) ?? false
case "time-pos" where property.format == MPV_FORMAT_DOUBLE:
let newPosition = max(TypeHelper.toDouble(property.data) ?? 0, 0)
func handle(event: EventHelper.Event) {
switch event.name {
case "time-pos":
let newPosition = max(event.double ?? 0, 0)
if Int((floor(newPosition) - floor(position)) / rate) != 0 {
position = newPosition
}
case "duration" where property.format == MPV_FORMAT_DOUBLE:
duration = TypeHelper.toDouble(property.data) ?? 0
case "speed" where property.format == MPV_FORMAT_DOUBLE:
rate = TypeHelper.toDouble(property.data) ?? 1
case "media-title" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format):
title = TypeHelper.toString(property.data) ?? ""
case "chapter-metadata/title" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format):
chapter = TypeHelper.toString(property.data)
case "metadata/by-key/album" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format):
album = TypeHelper.toString(property.data)
case "metadata/by-key/artist" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format):
artist = TypeHelper.toString(property.data)
default:
break
case "pause": isPaused = event.bool ?? false
case "duration": duration = event.double ?? 0
case "speed": rate = event.double ?? 1
case "media-title": title = event.string ?? ""
case "chapter-metadata/title": chapter = event.string
case "metadata/by-key/album": album = event.string
case "metadata/by-key/artist": artist = event.string
default: break
}
}
}