static int fill_cam_struct(IOUSBDeviceInterface197 **devIf, uvccCam *cam) { IOReturn ior; if((ior = (*devIf)->GetLocationID(devIf, &(cam->idLocation))) != kIOReturnSuccess) { uvcc_err("fill_cam_struct: GetLocationID", ior); return -1; } if((get_dev_desc(devIf, &(cam->devDesc))) != 0) { if(!logger) perror("uvcc error! fill_cam_struct: Could not retrieve device descriptor"); else asl_log(logger, NULL, ASL_LEVEL_ERR, "fill_cam_struct: Could not retrieve device descriptor: %s", strerror(errno)); return -1; } cam->mID = (struct uvccModelID *)&(cam->devDesc.hwIdVendor); cam->devIf = devIf; if((cam->ctrlIf = get_ctrl_if(devIf)) == NULL) { (*(cam->devIf))->Release(cam->devIf); CFRelease(cam->regName); if(!logger) perror("uvcc error! fill_cam_struct: Could not retrieve control interface"); else asl_log(logger, NULL, ASL_LEVEL_ERR, "fill_cam_struct: Could not retrieve control interface: %s", strerror(errno)); return -1; } if((ior = (*(cam->ctrlIf))->GetInterfaceNumber(cam->ctrlIf, &(cam->ifNo))) != kIOReturnSuccess) { (*(cam->devIf))->Release(cam->devIf); (*(cam->ctrlIf))->Release(cam->ctrlIf); uvcc_err("fill_cam_struct: GetInterfaceNumber", ior); return -1; } return 0; }
error handle::get_desc(uint16_t desc, void *buf, size_t& buf_sz) { std::unique_lock<std::recursive_mutex> lock(m_mutex); /* get a pointer so that it's not destroyed during the runtime of the function, * the pointer will be released at the end of the function */ std::shared_ptr<context> ctx = m_dev->get_context(); if(!ctx) return error::NO_CONTEXT; /* ensure valid status */ error err = status(); if(err != error::SUCCESS) return err; return get_dev_desc(desc, buf, buf_sz); }
error handle::get_dev_desc(uint16_t desc, void *buf, size_t& buf_sz) { auto p = m_hwdev.lock(); return p ? p->get_dev_desc(desc, buf, buf_sz) : error::DISCONNECTED; }