예제 #1
0
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;
}
예제 #2
0
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);
	}
}