mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 12:17:12 +00:00
mac/remote: use EventHelper for event handling
This commit is contained in:
parent
4107d29c90
commit
3e6c931d90
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user