summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2024-03-24 00:04:53 +0100
committerder richter <der.richter@gmx.de>2024-03-24 23:03:48 +0100
commit3e6c931d90c065eed6be12e2a1dab863566a7f82 (patch)
tree95c06cdab01f53fb24812479de521f77db64c077
parent4107d29c90bd97a0e8a647923c173ee77de6b3dc (diff)
downloadmpv-3e6c931d90c065eed6be12e2a1dab863566a7f82.tar.bz2
mpv-3e6c931d90c065eed6be12e2a1dab863566a7f82.tar.xz
mac/remote: use EventHelper for event handling
-rw-r--r--osdep/mac/app_hub.swift18
-rw-r--r--osdep/mac/remote_command_center.swift69
2 files changed, 37 insertions, 50 deletions
diff --git a/osdep/mac/app_hub.swift b/osdep/mac/app_hub.swift
index 6166ea4c94..42577433e0 100644
--- a/osdep/mac/app_hub.swift
+++ b/osdep/mac/app_hub.swift
@@ -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)
diff --git a/osdep/mac/remote_command_center.swift b/osdep/mac/remote_command_center.swift
index 085689c005..08bc6e01a2 100644
--- a/osdep/mac/remote_command_center.swift
+++ b/osdep/mac/remote_command_center.swift
@@ -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
}
}
}