objective c - Detectar hardware presiona auriculares en mac
objective-c cocoa (1)
Una prueba muestra que ya no se implementa como un teclado:
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);
Tampoco puede tratarlo como un HIDKeyboard (probado, no envía pulsaciones de teclas), ni HIDMouse o HID Joystick.
Busqué en la clase HIDQueue y verifiqué si el mikey dispara algún evento de bajo nivel y si dispara eventos de bajo nivel. Se llama a queueCallbackFunction
para las imprentas (si no filtra la cola para eventos específicos. Para filtrarla, vea initWithKeyboardEvents
en DDHidKeyboard.
Ahora todo lo que tiene que hacer es asignar los eventos de bajo nivel a los botones correctos y listo. Tal vez envolver todo en una clase agradable también. Aquí hay una muestra de la clase y el código relevante en GitHub .
Esta pregunta está relacionada con el código de esta pregunta: detectar pulsaciones de botón de auriculares en OS X
Su respuesta fue marcada como correcta, sin embargo, no pude hacer que su código funcionara (esto puede deberse a mi falta de conocimiento del objetivo-c). Seguí sus instrucciones, y modifiqué tres archivos. Esto es lo que he intentado (también he consultado la documentación IOKit de Apple y no pude encontrar ninguna documentación de botón de hardware de auriculares):
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
... así como la modificación de una línea en KeyboardPaneController.m (que se mostró en las instrucciones). Debido a la falta de documentación en el marco, es realmente difícil encontrar una respuesta (el póster ha estado fuera de línea durante más de un año, por lo que supongo que es probable que no reciba una respuesta). El código fue probado en león, y tengo un león de montaña, así que ese podría ser el problema.
Sé que esto es definitivamente posible de implementar porque iTunes responde muy bien a las presiones de los botones de mis auriculares (lo cual es un poco de un matiz). Me gustaría poder controlar Spotify con los botones de mis auriculares, en lugar de con iTunes.