summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2024-02-08 00:29:37 +0100
committerder richter <der.richter@gmx.de>2024-02-15 00:11:55 +0100
commite23e158481f98a8f0897fa4a9acdca31bc2d3a6e (patch)
treeae8c8c65bdfc0d3d0c6b1d164be4f071668863a8
parent07a3bf0365b2246bd593ce965cd52d02b63fb66a (diff)
downloadmpv-e23e158481f98a8f0897fa4a9acdca31bc2d3a6e.tar.bz2
mpv-e23e158481f98a8f0897fa4a9acdca31bc2d3a6e.tar.xz
mac/remote: add duration and current position info
Fixes #11233
-rw-r--r--osdep/macos/libmpv_helper.swift5
-rw-r--r--osdep/macos/remote_command_center.swift29
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
}