Обнаружение нажатия кнопки наушников в OS X

многие наушники, которые вы используете на своем iPhone (включая собственные Apple), имеют кнопки, микрофон или оба.

Они хорошо работают с Mac и iTunes распознает кнопки правильно давит.

мой вопрос в том , как бы вы обнаружили эти нажатия кнопок в какао? Я пишу небольшую альтернативу iTunes, которая живет в строке меню, и я хотел бы также реагировать на кнопки гарнитуры, а не только на клавиши мультимедиа клавиатуры.

спасибо для любых ответов!

1 ответов


Проверьте DDHidLib в http://code.google.com/p/ddribin/. Для быстрого теста можно подкласс DDHidKeyboard и переопределить 3 следующих метода. Затем в предоставленном HIDDeviceTest объекте KeyboardPaneController.м - (void) awakeFromNib; заменить NSArray * keyboards = [DDHidKeyboard allKeyboards]; С NSArray * keyboards = [<YourSubclass> allKeyboards]; или как вы назвали своего подкласса. Теперь, когда вы запускаете цель HIDDeviceTest, вы должны увидеть "драйвер Apple Mikey HID", указанный на вкладке "клавиатуры". Если повезет, вы увидите вход от нажатия на гарнитуру кнопки дистанционного управления. Попробуйте двойное нажатие и тройное нажатие средней кнопки, и вы увидите, что каждый из них является другим типом события. Я тестировал это только в середине 2011 года 13 "Macbook air работает Lion 10.7.3, а также В середине 2010 года 17" Macbook Pro работает 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];
    }
}