AppleRemote.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * AppleRemote.h
  3.  * AppleRemote
  4.  * $Id: 7e9c84cd9773690d497a1df4af7e9ef780d482c0 $
  5.  *
  6.  * Created by Martin Kahr on 11.03.06 under a MIT-style license.
  7.  * Copyright (c) 2006 martinkahr.com. All rights reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  22.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25.  * THE SOFTWARE.
  26.  *
  27.  *****************************************************************************
  28.  *
  29.  * Note that changes made by any members or contributors of the VideoLAN team
  30.  * (i.e. changes that were checked in exclusively into one of VideoLAN's source code
  31.  * repositories) are licensed under the GNU General Public License version 2,
  32.  * or (at your option) any later version.
  33.  * Thus, the following statements apply to our changes:
  34.  *
  35.  * Copyright (C) 2006-2007 the VideoLAN team
  36.  * Authors: Eric Petit <titer@m0k.org>
  37.  *          Felix Kühne <fkuehne at videolan dot org>
  38.  *
  39.  * This program is free software; you can redistribute it and/or modify
  40.  * it under the terms of the GNU General Public License as published by
  41.  * the Free Software Foundation; either version 2 of the License, or
  42.  * (at your option) any later version.
  43.  *
  44.  * This program is distributed in the hope that it will be useful,
  45.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  46.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  47.  * GNU General Public License for more details.
  48.  *
  49.  * You should have received a copy of the GNU General Public License
  50.  * along with this program; if not, write to the Free Software
  51.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  52.  *****************************************************************************/
  53. #import <Cocoa/Cocoa.h>
  54. #import <mach/mach.h>
  55. #import <mach/mach_error.h>
  56. #import <IOKit/IOKitLib.h>
  57. #import <IOKit/IOCFPlugIn.h>
  58. #import <IOKit/hid/IOHIDLib.h>
  59. #import <IOKit/hid/IOHIDKeys.h>
  60. enum AppleRemoteEventIdentifier
  61. {
  62.     kRemoteButtonVolume_Plus        =1<<1,
  63.     kRemoteButtonVolume_Minus       =1<<2,
  64.     kRemoteButtonMenu               =1<<3,
  65.     kRemoteButtonPlay               =1<<4,
  66.     kRemoteButtonRight              =1<<5,
  67.     kRemoteButtonLeft               =1<<6,
  68.     kRemoteButtonRight_Hold         =1<<7,
  69.     kRemoteButtonLeft_Hold          =1<<8,
  70.     kRemoteButtonMenu_Hold          =1<<9,
  71.     kRemoteButtonPlay_Sleep         =1<<10,
  72.     kRemoteControl_Switched         =1<<11,
  73.     kRemoteButtonVolume_Plus_Hold   =1<<12,
  74.     kRemoteButtonVolume_Minus_Hold  =1<<13,
  75.     k2009RemoteButtonPlay =1<<14,
  76.     k2009RemoteButtonMiddlePlay =1<<15
  77. };
  78. typedef enum AppleRemoteEventIdentifier AppleRemoteEventIdentifier;
  79. /*  Encapsulates usage of the apple remote control
  80. This class is implemented as a singleton as there is exactly one remote per machine (until now)
  81. The class is not thread safe
  82. */
  83. @interface AppleRemote : NSObject {
  84.     IOHIDDeviceInterface** hidDeviceInterface;
  85.     IOHIDQueueInterface**  queue;
  86.     NSMutableArray*        allCookies;
  87.     NSMutableDictionary*   cookieToButtonMapping;
  88.     CFRunLoopSourceRef     eventSource;
  89.     BOOL openInExclusiveMode;
  90.     BOOL simulatePlusMinusHold;
  91.     BOOL processesBacklog;
  92.     /* state for simulating plus/minus hold */
  93.     BOOL lastEventSimulatedHold;
  94.     AppleRemoteEventIdentifier lastPlusMinusEvent;
  95.     NSTimeInterval lastPlusMinusEventTime;
  96.     int remoteId;
  97.     unsigned int clickCountEnabledButtons;
  98.     NSTimeInterval maxClickTimeDifference;
  99.     NSTimeInterval lastClickCountEventTime;
  100.     AppleRemoteEventIdentifier lastClickCountEvent;
  101.     unsigned int eventClickCount;
  102.     IBOutlet id delegate;
  103. }
  104. - (int) remoteId;
  105. - (BOOL) isRemoteAvailable;
  106. - (BOOL) isListeningToRemote;
  107. - (void) setListeningToRemote: (BOOL) value;
  108. - (BOOL) isOpenInExclusiveMode;
  109. - (void) setOpenInExclusiveMode: (BOOL) value;
  110. /* click counting makes it possible to recognize if the user has pressed a button repeatedly
  111.  * click counting does delay each event as it has to wait if there is another event (second click)
  112.  * therefore there is a slight time difference (maximumClickCountTimeDifference) between a single click
  113.  * of the user and the call of your delegate method
  114.  * click counting can be enabled individually for specific buttons. Use the property clickCountEnableButtons
  115.  * to set the buttons for which click counting shall be enabled */
  116. - (BOOL) clickCountingEnabled;
  117. - (void) setClickCountingEnabled: (BOOL) value;
  118. - (unsigned int) clickCountEnabledButtons;
  119. - (void) setClickCountEnabledButtons: (unsigned int)value;
  120. /* the maximum time difference till which clicks are recognized as multi clicks */
  121. - (NSTimeInterval) maximumClickCountTimeDifference;
  122. - (void) setMaximumClickCountTimeDifference: (NSTimeInterval) timeDiff;
  123. /* When your application needs to much time on the main thread when processing an event other events
  124.  * may already be received which are put on a backlog. As soon as your main thread
  125.  * has some spare time this backlog is processed and may flood your delegate with calls.
  126.  * Backlog processing is turned off by default. */
  127. - (BOOL) processesBacklog;
  128. - (void) setProcessesBacklog: (BOOL) value;
  129. /* Sets an NSApplication delegate which starts listening when application is becoming active
  130.  * and stops listening when application resigns being active.
  131.  * If an NSApplication delegate has been already set all method calls will be forwarded to this delegate, too. */
  132. - (BOOL) listeningOnAppActivate;
  133. - (void) setListeningOnAppActivate: (BOOL) value;
  134. /* Simulating plus/minus hold does deactivate sending of individual requests for plus/minus pressed down/released.
  135.  * Instead special hold events are being triggered when the user is pressing and holding plus/minus for a small period.
  136.  * With simulating enabled the plus/minus buttons do behave as the left/right buttons */
  137. - (BOOL) simulatesPlusMinusHold;
  138. - (void) setSimulatesPlusMinusHold: (BOOL) value;
  139. /* Delegates are not retained */
  140. - (void) setDelegate: (id) delegate;
  141. - (id) delegate;
  142. - (IBAction) startListening: (id) sender;
  143. - (IBAction) stopListening: (id) sender;
  144. @end
  145. @interface AppleRemote (Singleton)
  146. + (AppleRemote*) sharedRemote;
  147. @end
  148. /*  Method definitions for the delegate of the AppleRemote class */
  149. @interface NSObject(NSAppleRemoteDelegate)
  150. - (void) appleRemoteButton: (AppleRemoteEventIdentifier)buttonIdentifier pressedDown: (BOOL) pressedDown clickCount: (unsigned int) count;
  151. @end
  152. @interface AppleRemote (PrivateMethods)
  153. - (void) setRemoteId: (int) aValue;
  154. - (NSDictionary*) cookieToButtonMapping;
  155. - (IOHIDQueueInterface**) queue;
  156. - (IOHIDDeviceInterface**) hidDeviceInterface;
  157. - (void) handleEventWithCookieString: (NSString*) cookieString sumOfValues: (SInt32) sumOfValues;
  158. @end
  159. @interface AppleRemote (IOKitMethods)
  160. - (io_object_t) findAppleRemoteDevice;
  161. - (IOHIDDeviceInterface**) createInterfaceForDevice: (io_object_t) hidDevice;
  162. - (BOOL) initializeCookies;
  163. - (BOOL) openDevice;
  164. @end
  165. /* A NSApplication delegate which is used to activate and deactivate listening to the remote control
  166.  * dependent on the activation state of your application.
  167.  * All events are delegated to the original NSApplication delegate if necessary */
  168. @interface AppleRemoteApplicationDelegate : NSObject {
  169.     id applicationDelegate;
  170. }
  171. - (id) initWithApplicationDelegate: (id) delegate;
  172. - (id) applicationDelegate;
  173. @end