2011-10-14 7 views
10

Molte cuffie che si utilizzano sul proprio iPhone (incluso quello della stessa Apple) hanno pulsanti, un microfono o entrambi.Rileva il pulsante della cuffia che preme in OS X

Funzionano bene con il Mac e iTunes riconosce che il pulsante viene premuto correttamente.

La mia domanda è questa: come riconosceresti questi pulsanti in Cocoa? Sto scrivendo una piccola alternativa ad iTunes che vive nella barra dei menu, e vorrei anche rispondere ai pulsanti dell'auricolare, non solo i tasti multimediali della tastiera.

Grazie per eventuali risposte!

+0

Avete già implementato il supporto per i tasti multimediali? In questo modo potresti ottenere gratuitamente il supporto per i controlli delle cuffie. (Non ho provato questo.) –

+0

Ho già implementato il supporto per la chiave multimediale - purtroppo non sembra darmi supporto per le cuffie gratuite. iTunes risponde ancora al pulsante delle cuffie, mentre la mia app no. –

+0

questo non funziona - vedi http://stackoverflow.com/questions/15398237/detect-hardware-pressphone-presses-in-mac –

risposta

2

Verificare DDHidLib a http://code.google.com/p/ddribin/. Per un test rapido, è possibile sottoclasse DDHidKeyboard e sovrascrivere i 3 seguenti metodi. Quindi, nell'oggetto HIDDeviceTest di destinazione KeyboardPaneController.m - (void) awakeFromNib;, sostituire NSArray * keyboards = [DDHidKeyboard allKeyboards]; con NSArray * keyboards = [<YourSubclass> allKeyboards]; o qualsiasi altra cosa abbia chiamato la sottoclasse. Ora quando esegui il target HIDDeviceTest, dovresti vedere "Apple Mikey HID Driver" elencato nella scheda "Tastiere". Con un po 'di fortuna, vedrai l'input premendo i pulsanti del telecomando dell'auricolare. Prova a doppio tocco e tocca tre volte il pulsante centrale e vedrai che ognuno è un tipo di evento diverso. L'ho provato solo su un MacBook Air da 13 "del Mid 2011 che eseguiva Lion 10.7.3 e un Macbook Pro da 17" Mid 2010 con SL 10.6.8.

#import "DDHidLib.h" 

@implementation <YourSubclass> 

+ (NSArray *) allKeyboards; 
{ 
    NSArray *array = [DDHidDevice allDevicesMatchingUsagePage: kHIDPage_Consumer 
                 usageId: kHIDUsage_GD_Pointer 
                withClass: self 
              skipZeroLocations: NO]; 

    //Only return "Apple Mikey HID Driver", if not found, return nil. 
    for (DDHidDevice *device in array) { 
     if ([[device productName] isEqualToString:@"Apple Mikey HID Driver"]) { 
      return [NSArray arrayWithObject:device]; 
     } 
    } 
    return nil; 
} 

- (void) initKeyboardElements: (NSArray *) elements; 
{ 
    NSEnumerator * e = [elements objectEnumerator]; 
    DDHidElement * element; 
    while (element = [e nextObject]) 
    { 
     unsigned usagePage = [[element usage] usagePage]; 
     unsigned usageId = [[element usage] usageId]; 
     if (usagePage == kHIDPage_GenericDesktop) 
     { 
      if ((usageId >= 0x89) && (usageId <= 0x8D)) 
      { 
       [mKeyElements addObject: element]; 
      } 
     } 
     NSArray * subElements = [element elements]; 
     if (subElements != nil) 
      [self initKeyboardElements: subElements]; 
    } 
} 

- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; 
{ 
    DDHidEvent * event; 
    while ((event = [hidQueue nextEvent])) 
    { 
     DDHidElement * element = [self elementForCookie: [event elementCookie]]; 
     unsigned usageId = [[element usage] usageId]; 
     SInt32 value = [event value]; 
     if (value == 1) 
      [self ddhidKeyboard: self keyDown: usageId]; 
    } 
} 
+0

Sono davvero incuriosito da questo codice (stavo cercando una soluzione per ore ora) ma posso quasi farlo funzionare ma non del tutto. Ho sottoclassato un'altra classe e ho seguito le istruzioni, ma Apple Mikey HID Driver non si presenta. Potrebbe essere la mia mancanza di conoscenza di sottoclassi che sta facendo sì che non funzioni. Esiste un esempio completo di questo? – alexy13

+1

questo non funziona. vedi http://stackoverflow.com/questions/15398237/detect-hardware-headphone-presses-in-mac –