aboutsummaryrefslogtreecommitdiff
path: root/VKPC/CatchMediaButtons.m
diff options
context:
space:
mode:
Diffstat (limited to 'VKPC/CatchMediaButtons.m')
-rw-r--r--VKPC/CatchMediaButtons.m146
1 files changed, 146 insertions, 0 deletions
diff --git a/VKPC/CatchMediaButtons.m b/VKPC/CatchMediaButtons.m
new file mode 100644
index 0000000..34db688
--- /dev/null
+++ b/VKPC/CatchMediaButtons.m
@@ -0,0 +1,146 @@
+//
+// CatchMediaButtons.m
+// VKPC
+//
+// Created by Eugene on 10/22/14.
+// Copyright (c) 2014 Eugene Z. All rights reserved.
+
+#import "CatchMediaButtons.h"
+#import "MultiClickRemoteBehavior.h"
+#import "SPMediaKeyTap.h"
+#import "Controller.h"
+
+static SPMediaKeyTap *keyTap;
+static MultiClickRemoteBehavior *remoteBehavior;
+static RemoteControl *remoteControl;
+static BOOL started = NO;
+static BOOL initialized = NO;
+
+@implementation CatchMediaButtons
+
++ (void)initialize {
+ if (initialized) {
+ return;
+ }
+
+ keyTap = nil;
+ [[NSUserDefaults standardUserDefaults] addObserver:(id)[self class]
+ forKeyPath:VKPCPreferencesCatchMediaButtons
+ options:NSKeyValueObservingOptionNew
+ context:NULL];
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:VKPCPreferencesCatchMediaButtons]) {
+ [CatchMediaButtons start];
+ }
+
+ initialized = YES;
+}
+
++ (void)start {
+ NSLog(@"[CatchMediaButtons] start");
+
+ if (started) {
+ NSLog(@"[CatchMediaButtons] start: already started, calling stop first");
+ [self stop];
+ }
+
+ if (keyTap == nil) {
+ NSLog(@"[CatchMediaButtons] start: keyTap == nil, creating instance");
+
+ keyTap = [[SPMediaKeyTap alloc] initWithDelegate:self];
+
+ remoteControl = [[AppleRemote alloc] initWithDelegate:self];
+ [remoteControl setDelegate:self];
+
+ remoteBehavior = [MultiClickRemoteBehavior new];
+ [remoteBehavior setDelegate:self];
+ [remoteControl setDelegate:remoteBehavior];
+ }
+
+ [keyTap startWatchingMediaKeys];
+ [remoteControl startListening:self];
+
+ NSLog(@"[CatchMediaButtons] started");
+ started = YES;
+}
+
++ (void)stop {
+ NSLog(@"[CatchMediaButtons] stop");
+
+ if (!started) {
+ NSLog(@"[CatchMediaButtons] stop: not started");
+ return;
+ }
+
+ [keyTap stopWatchingMediaKeys];
+ [remoteControl stopListening:self];
+
+ NSLog(@"[CatchMediaButtons] stopped");
+ started = NO;
+}
+
++ (void)remoteButton:(RemoteControlEventIdentifier)buttonIdentifier pressedDown:(BOOL)pressedDown clickCount:(unsigned int)clickCount {
+ if (!pressedDown) {
+ return;
+ }
+
+ switch(buttonIdentifier) {
+ case kRemoteButtonPlay:
+// [self forAllPlay];
+ break;
+
+ case kRemoteButtonRight:
+// [self forAllNext];
+ break;
+
+ case kRemoteButtonLeft:
+// [self forAllPrev];
+ break;
+
+ default:
+ break;
+ }
+}
+
++ (void)mediaKeyTap:(SPMediaKeyTap *)keyTap receivedMediaKeyEvent:(NSEvent *)event; {
+ NSAssert(event.type == NSSystemDefined && [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) {
+ switch (keyCode) {
+ case NX_KEYTYPE_PLAY:
+ [Controller playpause];
+ break;
+
+ case NX_KEYTYPE_FAST:
+ [Controller next];
+ break;
+
+ case NX_KEYTYPE_REWIND:
+ [Controller prev];
+ break;
+
+ default:
+ // More cases defined in hidsystem/ev_keymap.h
+ break;
+ }
+ }
+}
+
+// KVO
++ (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
+ if ([keyPath isEqualToString:VKPCPreferencesCatchMediaButtons]) {
+ NSNumber *new = change[NSKeyValueChangeKindKey];
+ if ([new integerValue] == NSKeyValueChangeSetting) {
+ BOOL value = [(NSNumber *)change[NSKeyValueChangeNewKey] boolValue];
+ if (!value) {
+ [CatchMediaButtons stop];
+ } else {
+ [CatchMediaButtons start];
+ }
+ }
+ }
+}
+
+@end