• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
IOHIDManagerRegisterDeviceMatchingCallback called twice when device pluggedin
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

IOHIDManagerRegisterDeviceMatchingCallback called twice when device pluggedin


  • Subject: IOHIDManagerRegisterDeviceMatchingCallback called twice when device pluggedin
  • From: Symadept <email@hidden>
  • Date: Tue, 22 Dec 2009 17:16:28 +0800

Hi,

I am using New IOHIDManager APIs, IOHIDManagerRegisterDeviceMatchingCallback and IOHIDManagerRegisterDeviceRemovalCallback to get notified for Pluggedin and Removed. Whenever I pluggin the device, I found that the DeviceMatchingCallback method called twice always. May I know what could be the reason?

My HIDUtilities methods goes like this. and its usage is given below.

//Usage.
- (BOOL)connectHIDDeviceWithVendorId:(long)vendorID productID:(long)productID
{
    BOOL tResult = NO;
    mHIDManagerRef = [HIDUtilities createHIDManager:Handle_IOHIDDevicePluggedInCallback inRemovalCallback:Handle_IOHIDDeviceRemovalCallback];
    if(mHIDManagerRef) {
        mDeviceRef = [HIDUtilities findDevice:mHIDManagerRef vendorId:vendorID productId:productID];
        tResult = (mDeviceRef != NULL);
    }
    return tResult;
}

+ (IOHIDManagerRef)createHIDManager:(IOHIDDeviceCallback)inPluggedInCallback inRemovalCallback:(IOHIDDeviceCallback)inRemovalCallback
{
    IOHIDManagerRef managerRef = NULL;
    IOReturn tIOReturn = kIOReturnSuccess;

    managerRef = IOHIDManagerCreate( kCFAllocatorDefault, kIOHIDOptionsTypeNone );
    IOHIDManagerScheduleWithRunLoop( managerRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode );
    IOHIDManagerRegisterDeviceMatchingCallback(managerRef, inPluggedInCallback, NULL);
    IOHIDManagerRegisterDeviceRemovalCallback(managerRef, inRemovalCallback, NULL);
   

    tIOReturn = IOHIDManagerOpen( managerRef, kIOHIDOptionsTypeNone );

    if ( kIOReturnSuccess != tIOReturn ) {
        [HIDUtilities closeHIDManager:managerRef];
        managerRef = NULL;
    }
    return managerRef;
}

+ (void)closeHIDManager:(IOHIDManagerRef)inHIDManagerRef
{
    IOHIDManagerRegisterDeviceMatchingCallback( inHIDManagerRef, NULL, NULL );
    IOHIDManagerRegisterDeviceRemovalCallback( inHIDManagerRef, NULL, NULL );
    IOHIDManagerUnscheduleFromRunLoop( inHIDManagerRef, CFRunLoopGetCurrent( ), kCFRunLoopDefaultMode );
    IOHIDManagerClose( inHIDManagerRef, kIOHIDOptionsTypeNone );
}

+ (IOHIDDeviceRef)findDevice:(IOHIDManagerRef)inHIDManagerRef vendorId:(long)vendorId productId:(long)productId
{
    IOHIDDeviceRef theDevice = NULL;
   
    // setup dictionary
    CFMutableDictionaryRef deviceIdentity = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
   
    CFNumberRef cfVendorId = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &vendorId);
    CFStringRef cfVendorSt = CFStringCreateWithCString(kCFAllocatorDefault, kIOHIDVendorIDKey, kCFStringEncodingUTF8);
    CFDictionaryAddValue(deviceIdentity, cfVendorSt, cfVendorId);
    CFRelease(cfVendorId);
    CFRelease(cfVendorSt);
   
    CFNumberRef cfProductId = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &productId);
    CFStringRef cfProductSt = CFStringCreateWithCString(kCFAllocatorDefault, kIOHIDProductIDKey, kCFStringEncodingUTF8);
    CFDictionaryAddValue(deviceIdentity, cfProductSt, cfProductId);
    CFRelease(cfProductId);
    CFRelease(cfProductSt);
   
//    CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
//    CFDictionaryAddValue(dictionary, CFSTR(kIOPropertyMatchKey), deviceIdentity);
   
   
    // look for devices matching criteria
    IOHIDManagerSetDeviceMatching(inHIDManagerRef, deviceIdentity);   
    CFSetRef foundDevices = IOHIDManagerCopyDevices(inHIDManagerRef);
    CFIndex foundCount = 0;
    if(foundDevices) {
        foundCount = CFSetGetCount(foundDevices);

        NSLog(@"FoundCount:[%d]", foundCount);
        if(foundCount > 0) {
           
            // get first matching device
            IOHIDDeviceRef *deviceRefs = malloc(sizeof(IOHIDDeviceRef *) * foundCount);
            CFSetGetValues(foundDevices, (const void **)deviceRefs);
            theDevice = deviceRefs[0];
            CFRetain(theDevice);
            free(deviceRefs);
        }
       
        CFRelease(foundDevices);
    }
    CFRelease(deviceIdentity);
   
    return theDevice;
}

Regards
Mustafa Shaik

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Prev by Date: MIDIGetDestination and unplugging physical devices
  • Next by Date: plugin development
  • Previous by thread: MIDIGetDestination and unplugging physical devices
  • Next by thread: plugin development
  • Index(es):
    • Date
    • Thread