cam: Allow time for CA to initialize

Some devices take some time to initialize, and until they are they
will error out when trying to get information about the CA device.
This commit is contained in:
Edward Hervey 2012-06-29 18:04:04 +02:00
parent 25cb359ddb
commit 7a72c961de

View file

@ -104,6 +104,7 @@ cam_device_open (CamDevice * device, const char *filename)
ca_caps_t ca_caps;
int ret;
int i;
int count = 10;
g_return_val_if_fail (device != NULL, FALSE);
g_return_val_if_fail (device->state == CAM_DEVICE_STATE_CLOSED, FALSE);
@ -117,17 +118,31 @@ cam_device_open (CamDevice * device, const char *filename)
return FALSE;
}
GST_DEBUG ("Successfully opened device %s", filename);
device->fd = ret;
ret = ioctl (device->fd, CA_RESET);
sleep (1);
/* get the capabilities of the CA */
ret = ioctl (device->fd, CA_GET_CAP, &ca_caps);
if (ret == -1) {
GST_ERROR ("CA_GET_CAP ioctl failed: %s", strerror (errno));
reset_state (device);
return FALSE;
g_usleep (G_USEC_PER_SEC / 10);
while (TRUE) {
/* get the capabilities of the CA */
ret = ioctl (device->fd, CA_GET_CAP, &ca_caps);
if (ret == -1) {
GST_ERROR ("CA_GET_CAP ioctl failed: %s", strerror (errno));
reset_state (device);
return FALSE;
}
if (ca_caps.slot_num > 0)
break;
if (!count) {
GST_ERROR ("CA_GET_CAP succeeded but not slots");
reset_state (device);
return FALSE;
}
count--;
g_usleep (G_USEC_PER_SEC / 5);
}
device->tl = cam_tl_new (device->fd);