cam: Allow time for CA to initialize
authorEdward Hervey <edward.hervey@collabora.co.uk>
Fri, 29 Jun 2012 16:04:04 +0000 (18:04 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 14 Aug 2012 17:06:30 +0000 (19:06 +0200)
Some devices take some time to initialize, and until they are they
will error out when trying to get information about the CA device.

sys/dvb/camdevice.c

index d38d625aead0d1d66a5b0ea28545d473e8d63054..0a160ceb17a71054aa58cbae5c028548a73a7942 100644 (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);