#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)
{
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;
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;
}
}
/* 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;
}
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;