diff options
author | der richter <der.richter@gmx.de> | 2024-03-24 00:04:53 +0100 |
---|---|---|
committer | der richter <der.richter@gmx.de> | 2024-03-24 23:03:48 +0100 |
commit | 3e6c931d90c065eed6be12e2a1dab863566a7f82 (patch) | |
tree | 95c06cdab01f53fb24812479de521f77db64c077 | |
parent | 4107d29c90bd97a0e8a647923c173ee77de6b3dc (diff) | |
download | mpv-3e6c931d90c065eed6be12e2a1dab863566a7f82.tar.bz2 mpv-3e6c931d90c065eed6be12e2a1dab863566a7f82.tar.xz |
mac/remote: use EventHelper for event handling
-rw-r--r-- | osdep/mac/app_hub.swift | 18 | ||||
-rw-r--r-- | osdep/mac/remote_command_center.swift | 69 |
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 } } } |