Пример #1
0
FREENECTAPI int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index)
{
	int res;
	freenect_device *pdev = (freenect_device*)malloc(sizeof(freenect_device));
	if (!pdev)
		return -1;

	memset(pdev, 0, sizeof(*pdev));

	pdev->parent = ctx;

	res = fnusb_open_subdevices(pdev, index);
	if (res < 0) {
		free(pdev);
		return res;
	}

	if (!ctx->first) {
		ctx->first = pdev;
	} else {
		freenect_device *prev = ctx->first;
		while (prev->next)
			prev = prev->next;
		prev->next = pdev;
	}

	*dev = pdev;

	// Do device-specific initialization
	if (pdev->usb_cam.dev) {
		if (freenect_camera_init(pdev) < 0) {
			return -1;
		}
	}

	return 0;
}
FREENECTAPI int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index)
{
	int res;
	freenect_device *pdev = (freenect_device*)malloc(sizeof(freenect_device));
	if (!pdev)
		return -1;

	memset(pdev, 0, sizeof(*pdev));

	pdev->parent = ctx;

	res = fnusb_open_subdevices(pdev, index);
	if (res < 0) {
		free(pdev);
		return res;
	}
#ifdef BUILD_AUDIO
	if (pdev->usb_audio.dev) {
		res = fnusb_num_interfaces(&pdev->usb_audio);
		if (res == 1) {
			// Upload audio firmware, release devices, and reopen them
			res = upload_firmware(&pdev->usb_audio);
			if (res < 0) {
				FN_ERROR("upload_firmware failed: %d\n", res);
				free(pdev);
				return res;
			}

			res = fnusb_close_subdevices(pdev);
			if (res < 0) {
				FN_ERROR("fnusb_close_subdevices failed: %d\n", res);
				free(pdev);
				return res;
			}
			sleep(1); // Give time for the device to reenumerate before trying to open it
			res = fnusb_open_subdevices(pdev, index);
			if (res < 0) {
				free(pdev);
				return res;
			}
		}
	}
#endif

	if (!ctx->first) {
		ctx->first = pdev;
	} else {
		freenect_device *prev = ctx->first;
		while (prev->next)
			prev = prev->next;
		prev->next = pdev;
	}

	*dev = pdev;

	// Do device-specific initialization
	if (pdev->usb_cam.dev) {
		if (freenect_camera_init(pdev) < 0) {
			return -1;
		}
	}

	return 0;
}