buffer structure moved to flashlight structure.
authorRoman Moravcik <roman.moravcik@gmail.com>
Thu, 7 Jan 2010 13:23:24 +0000 (14:23 +0100)
committerRoman Moravcik <roman.moravcik@gmail.com>
Thu, 7 Jan 2010 13:23:24 +0000 (14:23 +0100)
src/flashlight_lib.c
src/flashlight_lib.h

index d7ce455..b28d1a9 100644 (file)
 
 #include "flashlight_lib.h"
 
-struct buffer {
-       void *start;
-       size_t length;
-};
-
-struct buffer *buffers = NULL;
-static unsigned int n_buffers = 0;
 
 int flashlight_get_status (FlashlightContext_t *flashlight, int *status)
 {
@@ -143,7 +136,7 @@ int flashlight_set_intensity (FlashlightContext_t *flashlight, int intensity)
           WORKAROUND: start/stop i/o streaming to block camera application
         */
        if (intensity > 0) {
-               for (i = 0; i < n_buffers; ++i) {
+               for (i = 0; i < flashlight->n_buffers; ++i) {
                        struct v4l2_buffer buf;
 
                        buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@@ -295,34 +288,34 @@ int flashlight_open (FlashlightContext_t *flashlight, const char *device_name)
                return EGENERROR;
        }
 
-       buffers = calloc (req.count, sizeof (*buffers));
-       if (!buffers) {
+       flashlight->buffers = calloc (req.count, sizeof (*flashlight->buffers));
+       if (!flashlight->buffers) {
                printf ("flashlight_open: unable to allocate memory\n");
                return EGENERROR;
        }
 
-       for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {
+       for (flashlight->n_buffers = 0; flashlight->n_buffers < req.count; ++flashlight->n_buffers) {
                struct v4l2_buffer buf;
 
                buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
                buf.memory      = V4L2_MEMORY_MMAP;
-               buf.index       = n_buffers;
+               buf.index       = flashlight->n_buffers;
 
                if (ioctl (flashlight->fd, VIDIOC_QUERYBUF, &buf) == -1) {
                        printf ("flashlight_open: unable to query the status of a buffer %d (%s)\n",
-                               n_buffers, strerror (errno));
+                               flashlight->n_buffers, strerror (errno));
                        return EGENERROR;
                }
 
-               buffers[n_buffers].length = buf.length;
-               buffers[n_buffers].start = mmap (NULL /* start anywhere */,
-                                                buf.length,
-                                                PROT_READ | PROT_WRITE /* required */,
-                                                MAP_SHARED /* recommended */,
-                                                flashlight->fd,
-                                                buf.m.offset);
+               flashlight->buffers[flashlight->n_buffers].length = buf.length;
+               flashlight->buffers[flashlight->n_buffers].start = mmap (NULL /* start anywhere */,
+                                                                        buf.length,
+                                                                        PROT_READ | PROT_WRITE /* required */,
+                                                                        MAP_SHARED /* recommended */,
+                                                                        flashlight->fd,
+                                                                        buf.m.offset);
 
-               if (buffers[n_buffers].start == MAP_FAILED) {
+               if (flashlight->buffers[flashlight->n_buffers].start == MAP_FAILED) {
                        printf ("flashlight_open: unable to map memory (%s)\n", strerror (errno));
                        return EGENERROR;
                }
@@ -343,22 +336,30 @@ int flashlight_close (FlashlightContext_t *flashlight)
        }
 
        /* unmap memory mapped buffers */
-       for (i = 0; i < n_buffers; ++i) {
-               if (munmap (buffers[i].start, buffers[i].length) == -1) {
-                       printf ("flashlight_close: unable to unmap memory (%s)\n", strerror (errno));
-                       return EGENERROR;
+       for (i = 0; i < flashlight->n_buffers; ++i) {
+               if (flashlight->buffers[flashlight->n_buffers].start != MAP_FAILED) {
+                       if (munmap (flashlight->buffers[i].start, flashlight->buffers[i].length) == -1) {
+                               printf ("flashlight_close: unable to unmap memory (%s)\n", strerror (errno));
+                               return EGENERROR;
+                       }
                }
        }
-       free (buffers);
+       flashlight->n_buffers = 0;
 
+       /* free buffers */
+       if (flashlight->buffers)
+               free (flashlight->buffers);
+       flashlight->buffers = NULL;
+
+       /* close camera device */
        if (flashlight->fd != -1) {
                if (close (flashlight->fd) == -1) {
                        printf ("flashlight_close: cannot close device '%s' (%s)\n", flashlight->device_name, strerror (errno));
                        return ENODEVICE;
                }
        }
-
        flashlight->fd = -1;
+
        return ENOERROR;
 }
 
@@ -386,6 +387,9 @@ int flashlight_init (FlashlightContext_t **pRefContext)
        memset (flashlight, 0x00, sizeof (FlashlightContext_t));
        flashlight->fd = -1;
 
+       flashlight->n_buffers = 0;
+       flashlight->buffers = NULL;
+
        /* from adp1653.c */
        flashlight->min_intensity = 0;
        flashlight->max_intensity = 11;
index 004c291..0a1f8b8 100644 (file)
 #define ENOCONTEXT     -2
 #define ENODEVICE      -3
 
+struct buffer {
+       void *start;
+       size_t length;
+};
+
 struct FlashlightContext {
        /* device name */
        char device_name[15];
@@ -39,6 +44,9 @@ struct FlashlightContext {
 
        int min_intensity;
        int max_intensity;
+
+       unsigned int n_buffers;
+       struct buffer *buffers;
 };
 
 typedef struct FlashlightContext FlashlightContext_t;