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];