Use MPRemoteCommandCenter without avaliability checks.
parent
9840d87127
commit
d0ee3622ed
|
@ -19,16 +19,6 @@
|
||||||
|
|
||||||
@implementation MediaKeysApplication
|
@implementation MediaKeysApplication
|
||||||
|
|
||||||
+(void)initialize;
|
|
||||||
{
|
|
||||||
if([self class] != [MediaKeysApplication class]) return;
|
|
||||||
|
|
||||||
// Register defaults for the whitelist of apps that want to use media keys
|
|
||||||
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
[SPMediaKeyTap defaultMediaKeyUserBundleIdentifiers], kMediaKeyUsingBundleIdentifiersDefaultsKey,
|
|
||||||
nil]];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)finishLaunching {
|
- (void)finishLaunching {
|
||||||
[super finishLaunching];
|
[super finishLaunching];
|
||||||
|
|
||||||
|
@ -36,35 +26,24 @@
|
||||||
forKeyPath:@"allowLastfmMediaKeys"
|
forKeyPath:@"allowLastfmMediaKeys"
|
||||||
options:NSKeyValueObservingOptionNew
|
options:NSKeyValueObservingOptionNew
|
||||||
context:nil];
|
context:nil];
|
||||||
|
|
||||||
if (@available(macOS 10.14, *)) {
|
MPRemoteCommandCenter *remoteCommandCenter = [MPRemoteCommandCenter sharedCommandCenter];
|
||||||
MPRemoteCommandCenter *remoteCommandCenter = [MPRemoteCommandCenter sharedCommandCenter];
|
|
||||||
|
[remoteCommandCenter.playCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.playCommand setEnabled:YES];
|
[remoteCommandCenter.pauseCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.pauseCommand setEnabled:YES];
|
[remoteCommandCenter.togglePlayPauseCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.togglePlayPauseCommand setEnabled:YES];
|
[remoteCommandCenter.stopCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.stopCommand setEnabled:YES];
|
[remoteCommandCenter.changePlaybackPositionCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.changePlaybackPositionCommand setEnabled:YES];
|
[remoteCommandCenter.nextTrackCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.nextTrackCommand setEnabled:YES];
|
[remoteCommandCenter.previousTrackCommand setEnabled:YES];
|
||||||
[remoteCommandCenter.previousTrackCommand setEnabled:YES];
|
|
||||||
|
[[remoteCommandCenter playCommand] addTarget:self action:@selector(clickPlay)];
|
||||||
[[remoteCommandCenter playCommand] addTarget:self action:@selector(clickPlay)];
|
[[remoteCommandCenter pauseCommand] addTarget:self action:@selector(clickPause)];
|
||||||
[[remoteCommandCenter pauseCommand] addTarget:self action:@selector(clickPause)];
|
[[remoteCommandCenter togglePlayPauseCommand] addTarget:self action:@selector(clickPlay)];
|
||||||
[[remoteCommandCenter togglePlayPauseCommand] addTarget:self action:@selector(clickPlay)];
|
[[remoteCommandCenter stopCommand] addTarget:self action:@selector(clickStop)];
|
||||||
[[remoteCommandCenter stopCommand] addTarget:self action:@selector(clickStop)];
|
[[remoteCommandCenter changePlaybackPositionCommand] addTarget:self action:@selector(clickSeek:)];
|
||||||
[[remoteCommandCenter changePlaybackPositionCommand] addTarget:self action:@selector(clickSeek:)];
|
[[remoteCommandCenter nextTrackCommand] addTarget:self action:@selector(clickNext)];
|
||||||
[[remoteCommandCenter nextTrackCommand] addTarget:self action:@selector(clickNext)];
|
[[remoteCommandCenter previousTrackCommand] addTarget:self action:@selector(clickPrev)];
|
||||||
[[remoteCommandCenter previousTrackCommand] addTarget:self action:@selector(clickPrev)];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
keyTap = [[SPMediaKeyTap alloc] initWithDelegate:self];
|
|
||||||
if([SPMediaKeyTap usesGlobalMediaKeyTap]) {
|
|
||||||
[keyTap startWatchingMediaKeys];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ALog(@"Media key monitoring disabled");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (MPRemoteCommandHandlerStatus)clickPlay {
|
- (MPRemoteCommandHandlerStatus)clickPlay {
|
||||||
|
@ -97,72 +76,5 @@
|
||||||
return MPRemoteCommandHandlerStatusSuccess;
|
return MPRemoteCommandHandlerStatusSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)sendEvent: (NSEvent*)event
|
|
||||||
{
|
|
||||||
BOOL shouldHandleMediaKeyEventLocally = ![SPMediaKeyTap usesGlobalMediaKeyTap];
|
|
||||||
|
|
||||||
if(shouldHandleMediaKeyEventLocally && [event type] == NSEventTypeSystemDefined && [event subtype] == 8 )
|
|
||||||
{
|
|
||||||
[self mediaKeyTap:nil receivedMediaKeyEvent:event];
|
|
||||||
}
|
|
||||||
|
|
||||||
[super sendEvent: event];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event;
|
|
||||||
{
|
|
||||||
NSAssert([event type] == NSEventTypeSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys, @"Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:");
|
|
||||||
|
|
||||||
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
|
|
||||||
int keyFlags = ([event data1] & 0x0000FFFF);
|
|
||||||
BOOL keyIsPressed = (((keyFlags & 0xFF00) >> 8)) == 0xA;
|
|
||||||
|
|
||||||
if (!keyIsPressed) // pressed and released
|
|
||||||
{
|
|
||||||
switch( keyCode )
|
|
||||||
{
|
|
||||||
case NX_KEYTYPE_PLAY:
|
|
||||||
[self clickPlay];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NX_KEYTYPE_NEXT:
|
|
||||||
case NX_KEYTYPE_FAST:
|
|
||||||
[self clickNext];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NX_KEYTYPE_PREVIOUS:
|
|
||||||
case NX_KEYTYPE_REWIND:
|
|
||||||
[self clickPrev];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
|
||||||
if ([keyPath isEqualToString:@"allowLastfmMediaKeys"])
|
|
||||||
{
|
|
||||||
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
|
||||||
BOOL allowLastfmMediaKeys = [defs boolForKey:@"allowLastfmMediaKeys"];
|
|
||||||
NSArray *old = [defs arrayForKey:kMediaKeyUsingBundleIdentifiersDefaultsKey];
|
|
||||||
|
|
||||||
NSMutableArray *new = [old mutableCopy];
|
|
||||||
NSArray *lastfmIds = [NSArray arrayWithObjects:@"fm.last.Last.fm", @"fm.last.Scrobbler", nil];
|
|
||||||
if (allowLastfmMediaKeys)
|
|
||||||
{
|
|
||||||
[new addObjectsFromArray:lastfmIds];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[new removeObjectsInArray:lastfmIds];
|
|
||||||
}
|
|
||||||
|
|
||||||
[defs setObject:new forKey:kMediaKeyUsingBundleIdentifiersDefaultsKey];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -630,39 +630,37 @@ NSDictionary * makeRGInfo(PlaylistEntry *pe)
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)sendMetaData {
|
- (void)sendMetaData {
|
||||||
if (NSClassFromString(@"MPNowPlayingInfoCenter")) {
|
MPNowPlayingInfoCenter * defaultCenter = [MPNowPlayingInfoCenter defaultCenter];
|
||||||
MPNowPlayingInfoCenter * defaultCenter = [MPNowPlayingInfoCenter defaultCenter];
|
|
||||||
|
|
||||||
PlaylistEntry * entry = [playlistController currentEntry];
|
PlaylistEntry * entry = [playlistController currentEntry];
|
||||||
NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
|
NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
|
||||||
|
|
||||||
if (entry) {
|
if (entry) {
|
||||||
if ([entry title])
|
if ([entry title])
|
||||||
[songInfo setObject:[entry title] forKey:MPMediaItemPropertyTitle];
|
[songInfo setObject:[entry title] forKey:MPMediaItemPropertyTitle];
|
||||||
if ([entry artist])
|
if ([entry artist])
|
||||||
[songInfo setObject:[entry artist] forKey:MPMediaItemPropertyArtist];
|
[songInfo setObject:[entry artist] forKey:MPMediaItemPropertyArtist];
|
||||||
if ([entry album])
|
if ([entry album])
|
||||||
[songInfo setObject:[entry album] forKey:MPMediaItemPropertyAlbumTitle];
|
[songInfo setObject:[entry album] forKey:MPMediaItemPropertyAlbumTitle];
|
||||||
[songInfo setObject:[NSNumber numberWithFloat:[entry currentPosition]] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
|
[songInfo setObject:[NSNumber numberWithFloat:[entry currentPosition]] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
|
||||||
[songInfo setObject:[entry length] forKey:MPMediaItemPropertyPlaybackDuration];
|
[songInfo setObject:[entry length] forKey:MPMediaItemPropertyPlaybackDuration];
|
||||||
[songInfo setObject:[NSNumber numberWithFloat:[entry index]] forKey:MPMediaItemPropertyPersistentID];
|
[songInfo setObject:[NSNumber numberWithFloat:[entry index]] forKey:MPMediaItemPropertyPersistentID];
|
||||||
}
|
|
||||||
|
|
||||||
switch (playbackStatus) {
|
|
||||||
case CogStatusPlaying:
|
|
||||||
defaultCenter.playbackState = MPNowPlayingPlaybackStatePlaying;
|
|
||||||
break;
|
|
||||||
case CogStatusPaused:
|
|
||||||
defaultCenter.playbackState = MPNowPlayingPlaybackStatePaused;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
defaultCenter.playbackState = MPNowPlayingPlaybackStateStopped;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
[defaultCenter setNowPlayingInfo:songInfo];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (playbackStatus) {
|
||||||
|
case CogStatusPlaying:
|
||||||
|
defaultCenter.playbackState = MPNowPlayingPlaybackStatePlaying;
|
||||||
|
break;
|
||||||
|
case CogStatusPaused:
|
||||||
|
defaultCenter.playbackState = MPNowPlayingPlaybackStatePaused;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
defaultCenter.playbackState = MPNowPlayingPlaybackStateStopped;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
[defaultCenter setNowPlayingInfo:songInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue