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.
This commit is contained in:
der richter 2020-01-21 19:14:00 +01:00
parent 3d16ab1a31
commit 695d850412
2 changed files with 48 additions and 11 deletions

View File

@ -87,7 +87,10 @@ class RemoteCommandCenter: NSObject {
MPRemoteCommandCenter.shared().bookmarkCommand, 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) { @objc init(app: Application) {
application = app application = app
@ -99,11 +102,6 @@ class RemoteCommandCenter: NSObject {
} }
} }
@objc func makeCurrent() {
MPNowPlayingInfoCenter.default().playbackState = .paused
MPNowPlayingInfoCenter.default().playbackState = .playing
}
@objc func start() { @objc func start() {
for (cmd, _) in config { for (cmd, _) in config {
cmd.isEnabled = true cmd.isEnabled = true
@ -119,8 +117,8 @@ class RemoteCommandCenter: NSObject {
nowPlayingInfo[MPMediaItemPropertyArtwork] = albumArt nowPlayingInfo[MPMediaItemPropertyArtwork] = albumArt
} }
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo mpInfoCenter.nowPlayingInfo = nowPlayingInfo
MPNowPlayingInfoCenter.default().playbackState = .playing mpInfoCenter.playbackState = .playing
} }
@objc func stop() { @objc func stop() {
@ -129,8 +127,18 @@ class RemoteCommandCenter: NSObject {
cmd.removeTarget(nil) cmd.removeTarget(nil)
} }
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil mpInfoCenter.nowPlayingInfo = nil
MPNowPlayingInfoCenter.default().playbackState = .unknown 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 { func cmdHandler(_ event: MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus {
@ -156,4 +164,27 @@ class RemoteCommandCenter: NSObject {
return .success return .success
} }
}
@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
}
}
}

View File

@ -173,6 +173,12 @@ static const char macosx_icon[] =
#if HAVE_MACOS_TOUCHBAR #if HAVE_MACOS_TOUCHBAR
if ([self respondsToSelector:@selector(touchBar)]) if ([self respondsToSelector:@selector(touchBar)])
[(TouchBar *)self.touchBar processEvent:event]; [(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 #endif
if (_cocoa_cb) { if (_cocoa_cb) {
[_cocoa_cb processEvent:event]; [_cocoa_cb processEvent:event];