From c4e676b13871aa31c99c6e40ffd988535e9e5356 Mon Sep 17 00:00:00 2001 From: Roman Moravcik Date: Thu, 7 Jan 2010 14:23:24 +0100 Subject: [PATCH] buffer structure moved to flashlight structure. --- src/flashlight_lib.c | 58 +++++++++++++++++++++++++++----------------------- src/flashlight_lib.h | 8 +++++++ 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/flashlight_lib.c b/src/flashlight_lib.c index d7ce455..b28d1a9 100644 --- a/src/flashlight_lib.c +++ b/src/flashlight_lib.c @@ -33,13 +33,6 @@ #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; diff --git a/src/flashlight_lib.h b/src/flashlight_lib.h index 004c291..0a1f8b8 100644 --- a/src/flashlight_lib.h +++ b/src/flashlight_lib.h @@ -30,6 +30,11 @@ #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; -- 1.7.9.5