【问题标题】:Detect headphone button presses in OS X在 OS X 中检测耳机按钮按下
【发布时间】:2011-12-08 01:09:45
【问题描述】:

您在 iPhone 上使用的许多耳机(包括 Apple 自己的耳机)都有按钮、麦克风或两者兼有。

它们与 Mac 配合得很好,iTunes 可以正确识别按钮按下。

我的问题是 - 您如何检测 Cocoa 中的这些按钮按下?我正在为您的菜单栏中的 iTunes 编写一个小的替代方案,我还想响应耳机按钮,而不仅仅是键盘的媒体键。

感谢您的回复!

【问题讨论】:

  • 您是否已经实现了对媒体键的支持?这样做可能会让您免费支持耳机控制。 (我没试过。)
  • 我确实已经实现了媒体密钥支持 - 遗憾的是它似乎没有给我免费的耳机支持。 iTunes 仍然响应耳机按钮,而我的应用没有。

标签: cocoa itunes


【解决方案1】:

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 驱动程序”。幸运的是,您会看到按下耳机遥控按钮的输入。尝试双击和三次点击中间按钮,您会看到每个都是不同的事件类型。我只在运行 Lion 10.7.3 的 2011 年中 13" Macbook air 以及运行 SL 10.6.8 的 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 驱动程序没有出现。可能是我缺乏子类化知识导致它不起作用。有没有完整的例子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2016-11-26
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多