2013-03-13 9 views
17

Questa domanda riguarda il codice da questa domanda: Detect headphone button presses in OS XRileva presse hardware cuffie in Mac

La loro risposta è stata segnata corretta, tuttavia, non ho potuto ottenere il loro codice a lavorare (questo può essere a causa della mia mancanza di conoscenza di obiettivo-c). Ho seguito le loro istruzioni e ho modificato tre file. Questo è quello che ho provato (Ho anche guardato la documentazione IOKit di Apple e non sono riuscito a trovare alcuna documentazione pulsante hardware cuffia):

AwesomeClass.h

#import <Cocoa/Cocoa.h> 
#include "KeyboardPaneController.h" 

@interface AwesomeClass : KeyboardPaneController 
+ (NSArray *) allKeyboards; 
- (void) initKeyboardElements: (NSArray *) elements; 
- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; 
@end 

AwesomeClass.m

#import "AwesomeClass.h" 
#import "DDHidLib.h" 

@implementation AwesomeClass 

+ (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]; 
    } 
} 
@end 

... così come modificare una riga in KeyboardPaneController.m (che è stata mostrata nelle istruzioni). A causa della mancanza di documentazione sul framework, è davvero difficile trovare una risposta (il poster è stato offline per più di un anno, quindi presumo che probabilmente non otterrò una risposta). Il codice è stato testato su leone e ho il leone di montagna, quindi potrebbe essere il problema.

So che questo è sicuramente possibile implementare perché iTunes è molto reattivo alle mie pressioni dei pulsanti delle cuffie (che è un po 'una sfumatura). Mi piacerebbe essere in grado di controllare Spotify con i pulsanti delle mie cuffie, piuttosto che con iTunes.

+0

'+ allKeyboards' restituisce' nil' o ha trovato qualcosa? Hai provato a registrare il prodotto del dispositivo nomi per vedere se forse c'è un nome che sembra promettente ma diverso da quello previsto da quel codice? (In generale, è necessario essere più chiari su come questo codice non funziona.) –

+0

So che allKeyboards non ha restituito le cuffie o la scheda audio. Tuttavia, vedrò esattamente cosa restituisce allKeyboards e pubblica i risultati. – alexy13

risposta

8

Un test dimostra che non è implementata come una tastiera più:

id array = [[DDHidDevice allDevices] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"productName == \"Apple Mikey HID Driver\""]]; 
    DDHidDevice *mic = [array count] ? [array objectAtIndex:0] : nil; 
    // it isn't a keyboard 
    NSLog(@"%@", mic.primaryUsage); 
    assert(mic.usage==1 && mic.usagePage==12); 

Non si può trattare come un HIDKeyboard o (provato, non invia pressione di un tasto), né una HIDMouse o HID Joystick.

Ho scavato nella classe HIDQueue e controllato se il mikey spara qualsiasi evento di basso livello e fa scattare eventi di basso livello! Il queueCallbackFunction si chiama per presse (se non filtrare la coda per eventi specifici. Per filtrare, vedi initWithKeyboardEvents in DDHidKeyboard.

Ora tutto quello che dovete fare è mappare gli eventi di basso livello per i tasti corretti e si Ecco fatto, magari includi tutto in una bella lezione Ecco un esempio della classe e del codice relativo su GitHub.

+0

non è specifico per una cuffia, ma ora c'è APPLE_MIC_ONLY 1 definito. perché? perché IOKit non si distingue molto tra un telecomando Apple o un microfono o persino un trackpad –

+0

uno potrebbe migliorare questo algoritmo di rilevamento ma ho solo il microfono Apple da testare - comunque è tutto nel metodo 'allMikeys' –

Problemi correlati