在OS X中检测耳机按钮按下

10
许多在iPhone上使用的耳机(包括苹果的)都配备了按钮、麦克风或两者兼备。它们与Mac的兼容性很好,iTunes能够正确识别按钮按下的操作。
我的问题是这个 - 如何在Cocoa中检测这些按钮按下的操作呢?我正在编写一个小型的iTunes替代品,将其放置在菜单栏中,希望能够响应耳机按钮,而不仅仅是键盘的媒体键。
感谢任何回复!

你是否已经实现了媒体键的支持?这样做可能会免费为你提供耳机控制支持。(我还没有尝试过这个。) - Peter Hosey
我已经实现了媒体键支持,但不幸的是它似乎不能为我提供免费的耳机支持。iTunes仍然响应耳机按钮,而我的应用程序则不会。 - Tristan
这个不起作用--请参见https://dev59.com/fWUp5IYBdhLWcg3wRF6c - Daij-Djan
1个回答

2

请查看http://code.google.com/p/ddribin/的DDHidLib。为了进行快速测试,您可以子类化DDHidKeyboard并覆盖以下3个方法。然后,在提供的HIDDeviceTest目标的KeyboardPaneController.m的- (void) awakeFromNib;中,将NSArray * keyboards = [DDHidKeyboard allKeyboards];替换为NSArray * keyboards = [<YourSubclass> allKeyboards];或者您命名的任何子类。现在,当您运行HIDDeviceTest目标时,您应该会在“键盘”选项卡下看到“Apple Mikey HID Driver”列出。如果幸运的话,您将看到按下耳机遥控器按钮的输入。尝试双击和三击中间按钮,您将看到每个按钮都是不同的事件类型。我只在运行Lion 10.7.3的Mid 2011 13英寸Macbook Air和运行SL 10.6.8的Mid 2010 17英寸Macbook Pro上进行了测试。

#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];
    }
}

我对这段代码非常感兴趣(我已经寻找解决方案几个小时了),但我几乎可以让它工作,但还差一点。我创建了一个子类并按照说明进行操作,但Apple Mikey HID Driver没有显示出来。可能是我的子类知识不足导致它无法正常工作。是否有完整的示例? - alexyorke
1
这个不起作用。请参见https://dev59.com/fWUp5IYBdhLWcg3wRF6c - Daij-Djan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接