2011-10-14 15 views
10

Muchos auriculares que usa en su iPhone (incluido el de Apple) tienen botones, un micrófono o ambos.Botón de detección de auricular presiona en OS X

Funcionan muy bien con la Mac, y iTunes reconoce que el botón se presiona correctamente.

Mi pregunta es esta: ¿cómo detectaría estas pulsaciones de botón en Cocoa? Estoy escribiendo una pequeña alternativa a iTunes que vive en la barra de menú, y me gustaría también responder a los botones de los auriculares, no solo a las teclas multimedia del teclado.

¡Gracias por cualquier respuesta!

+0

¿Ya ha implementado su soporte para las claves de medios? Si lo hace, puede obtener soporte para los controles de auriculares de forma gratuita. (No he probado esto.) –

+0

Ya implementé la compatibilidad con la clave de medios: por desgracia, no parece brindarme asistencia gratuita para auriculares. iTunes todavía responde al botón de auriculares, mientras que mi aplicación no. –

+0

esto no funciona - ver http://stackoverflow.com/questions/15398237/detect-hardware-headphone-presses-in-mac –

Respuesta

2

Consulte DDHidLib en http://code.google.com/p/ddribin/. Para una prueba rápida, puede subclase DDHidKeyboard y anular los 3 métodos siguientes. Luego, en el KeyboardPaneController.m - (void) awakeFromNib; proporcionado por HIDDeviceTest, reemplace NSArray * keyboards = [DDHidKeyboard allKeyboards]; con NSArray * keyboards = [<YourSubclass> allKeyboards]; o lo que sea que haya llamado su subclase. Ahora, cuando ejecute el objetivo HIDDeviceTest, debería ver "Apple Mikey HID Driver" en la pestaña "Keyboards". Con suerte, verá la entrada al presionar los botones del control remoto de los auriculares. Intente presionar dos veces y tocar tres veces el botón del medio y verá que cada uno es un tipo de evento diferente. Solo he probado esto en un Macbook de 13 "Mid 2011 que corre con Lion 10.7.3 y con un Macbook Pro de 17" de mediados de 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

Estoy realmente intrigado por este código (he estado buscando una solución por horas ahora) pero casi puedo hacer que funcione pero no del todo. Subclasé otra clase y seguí las instrucciones, pero Apple Mikey HID Driver no aparece. Podría ser mi falta de conocimiento de subclases lo que está causando que no funcione. ¿Hay un ejemplo completo de esto? – alexy13

+1

esto no funciona. ver http://stackoverflow.com/questions/15398237/detect-hardware-headphone-presses-in-mac –