diff options
author | der richter <der.richter@gmx.de> | 2024-02-08 00:29:37 +0100 |
---|---|---|
committer | der richter <der.richter@gmx.de> | 2024-02-15 00:11:55 +0100 |
commit | e23e158481f98a8f0897fa4a9acdca31bc2d3a6e (patch) | |
tree | ae8c8c65bdfc0d3d0c6b1d164be4f071668863a8 | |
parent | 07a3bf0365b2246bd593ce965cd52d02b63fb66a (diff) | |
download | mpv-e23e158481f98a8f0897fa4a9acdca31bc2d3a6e.tar.bz2 mpv-e23e158481f98a8f0897fa4a9acdca31bc2d3a6e.tar.xz |
mac/remote: add duration and current position info
Fixes #11233
-rw-r--r-- | osdep/macos/libmpv_helper.swift | 5 | ||||
-rw-r--r-- | osdep/macos/remote_command_center.swift | 29 |
2 files changed, 26 insertions, 8 deletions
diff --git a/osdep/macos/libmpv_helper.swift b/osdep/macos/libmpv_helper.swift index 572b250980..6beed835ca 100644 --- a/osdep/macos/libmpv_helper.swift +++ b/osdep/macos/libmpv_helper.swift @@ -245,4 +245,9 @@ class LibmpvHelper { class func mpvFlagToBool(_ obj: UnsafeMutableRawPointer) -> Bool? { return UnsafePointer<Bool>(OpaquePointer(obj))?.pointee } + + // MPV_FORMAT_DOUBLE + class func mpvDoubleToDouble(_ obj: UnsafeMutableRawPointer) -> Double? { + return UnsafePointer<Double>(OpaquePointer(obj))?.pointee + } } diff --git a/osdep/macos/remote_command_center.swift b/osdep/macos/remote_command_center.swift index 26faea1b13..e3060516ed 100644 --- a/osdep/macos/remote_command_center.swift +++ b/osdep/macos/remote_command_center.swift @@ -43,7 +43,9 @@ class RemoteCommandCenter: NSObject { var nowPlayingInfo: [String:Any] = [:] var configs: [MPRemoteCommand:Config] = [:] var disabledCommands: [MPRemoteCommand] = [] - var isPaused: Bool = false { didSet { updatePlaybackState() } } + var isPaused: Bool = false { didSet { updateInfoCenter() } } + var duration: Double = 0 { didSet { updateInfoCenter() } } + var position: Double = 0 { didSet { updateInfoCenter() } } var infoCenter: MPNowPlayingInfoCenter { get { return MPNowPlayingInfoCenter.default() } } var commandCenter: MPRemoteCommandCenter { get { return MPRemoteCommandCenter.shared() } } @@ -53,9 +55,7 @@ class RemoteCommandCenter: NSObject { nowPlayingInfo = [ MPNowPlayingInfoPropertyMediaType: NSNumber(value: MPNowPlayingInfoMediaType.video.rawValue), - MPNowPlayingInfoPropertyDefaultPlaybackRate: NSNumber(value: 1), MPNowPlayingInfoPropertyPlaybackProgress: NSNumber(value: 0.0), - MPMediaItemPropertyPlaybackDuration: NSNumber(value: 0), MPMediaItemPropertyTitle: "mpv", MPMediaItemPropertyAlbumTitle: "mpv", MPMediaItemPropertyArtist: "mpv", @@ -69,7 +69,7 @@ class RemoteCommandCenter: NSObject { commandCenter.previousTrackCommand: Config(key: MP_KEY_PREV, handler: keyHandler), commandCenter.togglePlayPauseCommand: Config(key: MP_KEY_PLAY, handler: keyHandler), commandCenter.seekForwardCommand: Config(key: MP_KEY_FORWARD, type: .repeatable, handler: keyHandler), - commandCenter.seekBackwardCommand: Config(key: MP_KEY_REWIND, type: .repeatable, handler: keyHandler) + commandCenter.seekBackwardCommand: Config(key: MP_KEY_REWIND, type: .repeatable, handler: keyHandler), ] disabledCommands = [ @@ -105,8 +105,7 @@ class RemoteCommandCenter: NSObject { cmd.addTarget(handler: config.handler) } - infoCenter.nowPlayingInfo = nowPlayingInfo - infoCenter.playbackState = .playing + updateInfoCenter() NotificationCenter.default.addObserver( self, @@ -135,10 +134,17 @@ class RemoteCommandCenter: NSObject { @objc func makeCurrent(notification: NSNotification) { infoCenter.playbackState = .paused infoCenter.playbackState = .playing - updatePlaybackState() + updateInfoCenter() } - func updatePlaybackState() { + func updateInfoCenter() { + nowPlayingInfo.merge([ + MPNowPlayingInfoPropertyPlaybackRate: NSNumber(value: !isPaused), + MPNowPlayingInfoPropertyElapsedPlaybackTime: NSNumber(value: position), + MPMediaItemPropertyPlaybackDuration: NSNumber(value: duration), + ]) { (_, new) in new } + + infoCenter.nowPlayingInfo = nowPlayingInfo infoCenter.playbackState = isPaused ? .paused : .playing } @@ -176,6 +182,13 @@ class RemoteCommandCenter: NSObject { switch String(cString: property.name) { case "pause" where property.format == MPV_FORMAT_FLAG: isPaused = LibmpvHelper.mpvFlagToBool(property.data) ?? false + case "time-pos" where property.format == MPV_FORMAT_DOUBLE: + let newPosition = max(LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0, 0) + if Int(floor(newPosition) - floor(position)) != 0 { + position = newPosition + } + case "duration" where property.format == MPV_FORMAT_DOUBLE: + duration = LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0 default: break } |