static io_service_t GetUsbDevice(io_service_t service) { IOReturn status; io_iterator_t iterator = 0; io_service_t device = 0; if (!service) { return device; } status = IORegistryEntryCreateIterator(service, kIOServicePlane, (kIORegistryIterateParents | kIORegistryIterateRecursively), &iterator); if (status == kIOReturnSuccess) { io_service_t currentService; while ((currentService = IOIteratorNext(iterator)) && device == 0) { io_name_t serviceName; status = IORegistryEntryGetNameInPlane(currentService, kIOServicePlane, serviceName); if (status == kIOReturnSuccess && IOObjectConformsTo(currentService, kIOUSBDeviceClassName)) { device = currentService; } else { // Release the service object which is no longer needed (void) IOObjectRelease(currentService); } } // Release the iterator (void) IOObjectRelease(iterator); } return device; }
static void set_cam_reg_name(io_service_t srv, uvccCam *cam) { io_name_t cls; IOReturn ior; cam->regName = IORegistryEntryCreateCFProperty(srv, CFSTR(kUSBProductString), kCFAllocatorDefault, 0); if(cam == NULL) { /* get it "manually" */ ior = IORegistryEntryGetNameInPlane(srv, kIOServicePlane, cls); if(ior != kIOReturnSuccess) { uvcc_err("set_cam_reg_name: IORegistryEntryGetNameInPlane", ior); cam->regName = CFSTR(UVCC_UNKNOWN_CAM_REG_NAME); } else cam->regName = CFStringCreateWithCString(kCFAllocatorDefault, cls, kCFStringEncodingUTF8); } }