From 695d850412144629827bdea146e6bf4bbeba39ed Mon Sep 17 00:00:00 2001 From: der richter Date: Tue, 21 Jan 2020 19:14:00 +0100 Subject: 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. --- osdep/macos/remote_command_center.swift | 53 ++++++++++++++++++++++++++------- osdep/macosx_application.m | 6 ++++ 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) { + switch event.pointee.event_id { + case MPV_EVENT_PROPERTY_CHANGE: + handlePropertyChange(event) + default: + break + } + } + + func handlePropertyChange(_ event: UnsafeMutablePointer) { + let pData = OpaquePointer(event.pointee.data) + guard let property = UnsafePointer(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 @@ -173,6 +173,12 @@ static const char macosx_icon[] = #if HAVE_MACOS_TOUCHBAR 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]; -- cgit v1.2.3