summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2020-01-21 19:14:00 +0100
committerder richter <der.richter@gmx.de>2020-01-26 12:09:55 +0100
commit695d850412144629827bdea146e6bf4bbeba39ed (patch)
tree119dec09e5401548e059f5898868d1fed56bcfb7
parent3d16ab1a311d16cd5a07feca916494869a80d264 (diff)
downloadmpv-695d850412144629827bdea146e6bf4bbeba39ed.tar.bz2
mpv-695d850412144629827bdea146e6bf4bbeba39ed.tar.xz
mac: report playback state to the MediaPlayer Command Center
some system logic for the global media key events depends on the right playback state. set the state properly to prevent more breakages in the future.
-rw-r--r--osdep/macos/remote_command_center.swift53
-rw-r--r--osdep/macosx_application.m6
2 files changed, 48 insertions, 11 deletions
diff --git a/osdep/macos/remote_command_center.swift b/osdep/macos/remote_command_center.swift
index 7d6e51081c..b08a726183 100644
--- a/osdep/macos/remote_command_center.swift
+++ b/osdep/macos/remote_command_center.swift
@@ -87,7 +87,10 @@ class RemoteCommandCenter: NSObject {
MPRemoteCommandCenter.shared().bookmarkCommand,
]
- let application: Application;
+ let application: Application
+
+ var mpInfoCenter: MPNowPlayingInfoCenter { get { return MPNowPlayingInfoCenter.default() } }
+ var isPaused: Bool = false { didSet { updatePlaybackState() } }
@objc init(app: Application) {
application = app
@@ -99,11 +102,6 @@ class RemoteCommandCenter: NSObject {
}
}
- @objc func makeCurrent() {
- MPNowPlayingInfoCenter.default().playbackState = .paused
- MPNowPlayingInfoCenter.default().playbackState = .playing
- }
-
@objc func start() {
for (cmd, _) in config {
cmd.isEnabled = true
@@ -119,8 +117,8 @@ class RemoteCommandCenter: NSObject {
nowPlayingInfo[MPMediaItemPropertyArtwork] = albumArt
}
- MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
- MPNowPlayingInfoCenter.default().playbackState = .playing
+ mpInfoCenter.nowPlayingInfo = nowPlayingInfo
+ mpInfoCenter.playbackState = .playing
}
@objc func stop() {
@@ -129,8 +127,18 @@ class RemoteCommandCenter: NSObject {
cmd.removeTarget(nil)
}
- MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
- MPNowPlayingInfoCenter.default().playbackState = .unknown
+ mpInfoCenter.nowPlayingInfo = nil
+ mpInfoCenter.playbackState = .unknown
+ }
+
+ @objc func makeCurrent() {
+ mpInfoCenter.playbackState = .paused
+ mpInfoCenter.playbackState = .playing
+ updatePlaybackState()
+ }
+
+ func updatePlaybackState() {
+ mpInfoCenter.playbackState = isPaused ? .paused : .playing
}
func cmdHandler(_ event: MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus {
@@ -156,4 +164,27 @@ class RemoteCommandCenter: NSObject {
return .success
}
-} \ No newline at end of file
+
+ @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 = LibmpvHelper.mpvFlagToBool(property.data) ?? false
+ default:
+ break
+ }
+ }
+}
diff --git a/osdep/macosx_application.m b/osdep/macosx_application.m
index 43f3bb4a4f..d553c69158 100644
--- a/osdep/macosx_application.m
+++ b/osdep/macosx_application.m
@@ -174,6 +174,12 @@ static const char macosx_icon[] =
if ([self respondsToSelector:@selector(touchBar)])
[(TouchBar *)self.touchBar processEvent:event];
#endif
+#if HAVE_MACOS_MEDIA_PLAYER
+ // 10.12.2 runtime availability check
+ if ([self respondsToSelector:@selector(touchBar)]) {
+ [_remoteCommandCenter processEvent:event];
+ }
+#endif
if (_cocoa_cb) {
[_cocoa_cb processEvent:event];
}