From 441c5ab9132f33d59d6c0a52445a1d882546088b Mon Sep 17 00:00:00 2001 From: Gabriel Lefloch Date: Mon, 20 Jan 2025 16:02:37 +0100 Subject: [PATCH 1/4] Mordernized entire library to use modern macros Consequences: all plugins will need to also updates their syntax. Advantages: safer automatic type checking, less possible user introduced errors, allows for the usage of `g_autoptr`. --- plugins/file/uca-file-camera.c | 152 +++++++++--------- plugins/file/uca-file-camera.h | 34 +--- plugins/mock/uca-mock-camera.c | 273 ++++++++++++++++----------------- plugins/mock/uca-mock-camera.h | 34 +--- src/uca-camera.c | 196 +++++++++++------------ src/uca-camera.h | 20 +-- 6 files changed, 312 insertions(+), 397 deletions(-) diff --git a/plugins/file/uca-file-camera.c b/plugins/file/uca-file-camera.c index bec24225..92df84b5 100644 --- a/plugins/file/uca-file-camera.c +++ b/plugins/file/uca-file-camera.c @@ -21,13 +21,28 @@ #include #include "uca-file-camera.h" -#define UCA_FILE_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_FILE_CAMERA, UcaFileCameraPrivate)) - static void uca_file_initable_iface_init (GInitableIface *iface); -G_DEFINE_TYPE_WITH_CODE (UcaFileCamera, uca_file_camera, UCA_TYPE_CAMERA, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, - uca_file_initable_iface_init)) +/** + * UcaFileCamera: + * + * Creates #UcaFileCamera instances by loading corresponding shared objects. The + * contents of the #UcaFileCamera structure are private and should only be + * accessed via the provided API. + */ +struct _UcaFileCamera { + UcaCamera parent; + + gchar *path; + guint width; + guint height; + guint bitdepth; + GList *fnames; + GList *current; +}; + +G_DEFINE_FINAL_TYPE_WITH_CODE (UcaFileCamera, uca_file_camera, UCA_TYPE_CAMERA, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, uca_file_initable_iface_init)) enum { PROP_PATH = N_BASE_PROPERTIES, @@ -51,28 +66,17 @@ static const gint file_overrideables[] = { static GParamSpec *file_properties[N_PROPERTIES] = { NULL, }; -struct _UcaFileCameraPrivate { - gchar *path; - guint width; - guint height; - guint bitdepth; - GList *fnames; - GList *current; -}; - static gboolean -read_tiff_meta_data (UcaFileCameraPrivate *priv, const gchar *fname) +read_tiff_meta_data (UcaFileCamera *self, const gchar *fname) { - TIFF *file; - - file = TIFFOpen (fname, "r"); + TIFF *file = TIFFOpen (fname, "r"); if (!file) { return FALSE; } - TIFFGetField (file, TIFFTAG_BITSPERSAMPLE, &priv->bitdepth); - TIFFGetField (file, TIFFTAG_IMAGEWIDTH, &priv->width); - TIFFGetField (file, TIFFTAG_IMAGELENGTH, &priv->height); + TIFFGetField (file, TIFFTAG_BITSPERSAMPLE, &self->bitdepth); + TIFFGetField (file, TIFFTAG_IMAGEWIDTH, &self->width); + TIFFGetField (file, TIFFTAG_IMAGELENGTH, &self->height); TIFFClose (file); @@ -80,7 +84,7 @@ read_tiff_meta_data (UcaFileCameraPrivate *priv, const gchar *fname) } static gboolean -read_tiff_data (UcaFileCameraPrivate *priv, const gchar *fname, gpointer buffer) +read_tiff_data (UcaFileCamera *self, const gchar *fname, gpointer buffer) { TIFF *file; guint16 bitdepth; @@ -88,7 +92,7 @@ read_tiff_data (UcaFileCameraPrivate *priv, const gchar *fname, gpointer buffer) guint height; tsize_t result; int offset = 0; - int step = priv->width; + int step = self->width; file = TIFFOpen (fname, "r"); if (!file) { @@ -99,16 +103,16 @@ read_tiff_data (UcaFileCameraPrivate *priv, const gchar *fname, gpointer buffer) TIFFGetField (file, TIFFTAG_IMAGEWIDTH, &width); TIFFGetField (file, TIFFTAG_IMAGELENGTH, &height); - if (priv->bitdepth != bitdepth || priv->width != width || priv->height != height) { + if (self->bitdepth != bitdepth || self->width != width || self->height != height) { g_warning ("Data format not compatible: %ux%u@%u [expected %ux%u@%u]", - width, height, bitdepth, priv->width, priv->height, priv->bitdepth); + width, height, bitdepth, self->width, self->height, self->bitdepth); TIFFClose (file); return FALSE; } - step *= priv->bitdepth / 8; + step *= self->bitdepth / 8; - for (guint32 i = 0; i < priv->height; i++) { + for (guint32 i = 0; i < self->height; i++) { result = TIFFReadScanline (file, ((gchar *) buffer) + offset, i, 0); if (result == -1) @@ -122,16 +126,16 @@ read_tiff_data (UcaFileCameraPrivate *priv, const gchar *fname, gpointer buffer) } static gboolean -update_fnames (UcaFileCameraPrivate *priv) +update_fnames (UcaFileCamera *self) { GDir *dir; const gchar *fname; GError *error = NULL; - g_list_free_full (priv->fnames, g_free); - priv->fnames = NULL; + g_list_free_full (self->fnames, g_free); + self->fnames = NULL; - dir = g_dir_open (priv->path, 0, &error); + dir = g_dir_open (self->path, 0, &error); if (dir == NULL) { g_warning ("%s", error->message); @@ -145,22 +149,22 @@ update_fnames (UcaFileCameraPrivate *priv) break; if (g_str_has_suffix (fname, ".tiff") || g_str_has_suffix (fname, ".tif")) - priv->fnames = g_list_append (priv->fnames, g_build_filename (priv->path, fname, NULL)); + self->fnames = g_list_append (self->fnames, g_build_filename (self->path, fname, NULL)); } - priv->fnames = g_list_sort (priv->fnames, (GCompareFunc) g_strcmp0); - priv->current = priv->fnames; + self->fnames = g_list_sort (self->fnames, (GCompareFunc) g_strcmp0); + self->current = self->fnames; - if (priv->current != NULL) { + if (self->current != NULL) { while (TRUE) { - fname = (const gchar *) priv->current->data; - if (read_tiff_meta_data (priv, fname)) { + fname = (const gchar *) self->current->data; + if (read_tiff_meta_data (self, fname)) { break; } else { g_warning ("Cannot read %s", fname); } - priv->current = g_list_next (priv->current); - if (!priv->current) { + self->current = g_list_next (self->current); + if (!self->current) { g_error ("No valid tif files found"); } } @@ -173,17 +177,14 @@ update_fnames (UcaFileCameraPrivate *priv) static void uca_file_camera_start_recording(UcaCamera *camera, GError **error) { - UcaFileCameraPrivate *priv; - g_return_if_fail (UCA_IS_FILE_CAMERA (camera)); - - priv = UCA_FILE_CAMERA_GET_PRIVATE (camera); + UcaFileCamera *self = UCA_FILE_CAMERA (camera); - if (priv->fnames == NULL) { + if (self->fnames == NULL) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_END_OF_STREAM, "No files found"); } - priv->current = priv->fnames; + self->current = self->fnames; } static void @@ -199,24 +200,23 @@ uca_file_camera_trigger (UcaCamera *camera, GError **error) static gboolean uca_file_camera_grab (UcaCamera *camera, gpointer data, GError **error) { - UcaFileCameraPrivate *priv; g_return_val_if_fail (UCA_IS_FILE_CAMERA (camera), FALSE); - priv = UCA_FILE_CAMERA_GET_PRIVATE (camera); + UcaFileCamera *self = UCA_FILE_CAMERA (camera); - if (priv->current == NULL) { + if (self->current == NULL) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_END_OF_STREAM, "End of stream"); return FALSE; } - if (!read_tiff_data (priv, (const gchar *) priv->current->data, data)) { + if (!read_tiff_data (self, (const gchar *) self->current->data, data)) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_END_OF_STREAM, "Error reading file"); return FALSE; } - priv->current = g_list_next (priv->current); + self->current = g_list_next (self->current); return TRUE; } @@ -224,7 +224,7 @@ static void uca_file_camera_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { g_return_if_fail(UCA_IS_FILE_CAMERA(object)); - UcaFileCameraPrivate *priv = UCA_FILE_CAMERA_GET_PRIVATE(object); + UcaFileCamera *self = UCA_FILE_CAMERA(object); if (uca_camera_is_recording (UCA_CAMERA(object)) && !uca_camera_is_writable_during_acquisition (UCA_CAMERA (object), pspec->name)) { @@ -234,10 +234,10 @@ uca_file_camera_set_property (GObject *object, guint property_id, const GValue * switch (property_id) { case PROP_PATH: - g_free (priv->path); - priv->path = g_strdup (g_value_get_string (value)); - priv->path = g_strstrip (priv->path); - update_fnames (priv); + g_free (self->path); + self->path = g_strdup (g_value_get_string (value)); + self->path = g_strstrip (self->path); + update_fnames (self); g_object_notify (object, "roi-width"); g_object_notify (object, "roi-height"); @@ -253,20 +253,20 @@ static void uca_file_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { g_return_if_fail (UCA_IS_FILE_CAMERA (object)); - UcaFileCameraPrivate *priv = UCA_FILE_CAMERA_GET_PRIVATE (object); + UcaFileCamera *self = UCA_FILE_CAMERA (object); switch (property_id) { case PROP_NAME: g_value_set_string (value, "file camera"); break; case PROP_SENSOR_WIDTH: - g_value_set_uint (value, priv->width); + g_value_set_uint (value, self->width); break; case PROP_SENSOR_HEIGHT: - g_value_set_uint (value, priv->height); + g_value_set_uint (value, self->height); break; case PROP_SENSOR_BITDEPTH: - g_value_set_uint (value, priv->bitdepth); + g_value_set_uint (value, self->bitdepth); break; case PROP_ROI_X: g_value_set_uint (value, 0); @@ -275,10 +275,10 @@ uca_file_camera_get_property(GObject *object, guint property_id, GValue *value, g_value_set_uint (value, 0); break; case PROP_ROI_WIDTH: - g_value_set_uint (value, priv->width); + g_value_set_uint (value, self->width); break; case PROP_ROI_HEIGHT: - g_value_set_uint (value, priv->height); + g_value_set_uint (value, self->height); break; case PROP_EXPOSURE_TIME: g_value_set_double (value, 0.1); @@ -290,7 +290,7 @@ uca_file_camera_get_property(GObject *object, guint property_id, GValue *value, g_value_set_boolean (value, FALSE); break; case PROP_PATH: - g_value_set_string (value, priv->path); + g_value_set_string (value, self->path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); @@ -301,14 +301,13 @@ uca_file_camera_get_property(GObject *object, guint property_id, GValue *value, static void uca_file_camera_finalize(GObject *object) { - UcaFileCameraPrivate *priv; + UcaFileCamera *self = UCA_FILE_CAMERA (object); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (object); - priv = UCA_FILE_CAMERA_GET_PRIVATE(object); + g_list_free_full (self->fnames, g_free); + self->fnames = NULL; - g_list_free_full (priv->fnames, g_free); - priv->fnames = NULL; - - G_OBJECT_CLASS(uca_file_camera_parent_class)->finalize(object); + G_OBJECT_CLASS(klass)->finalize(object); } static gboolean @@ -352,23 +351,18 @@ uca_file_camera_class_init(UcaFileCameraClass *klass) for (guint id = N_BASE_PROPERTIES; id < N_PROPERTIES; id++) g_object_class_install_property (gobject_class, id, file_properties[id]); - - g_type_class_add_private (klass, sizeof(UcaFileCameraPrivate)); } static void uca_file_camera_init(UcaFileCamera *self) { - UcaFileCameraPrivate *priv; - - self->priv = priv = UCA_FILE_CAMERA_GET_PRIVATE(self); - priv->path = g_strdup ("."); - priv->width = 512; - priv->height = 512; - priv->bitdepth = 8; + self->path = g_strdup ("."); + self->width = 512; + self->height = 512; + self->bitdepth = 8; - priv->fnames = NULL; - update_fnames (priv); + self->fnames = NULL; + update_fnames (self); } G_MODULE_EXPORT GType diff --git a/plugins/file/uca-file-camera.h b/plugins/file/uca-file-camera.h index b7ce2c38..38c18e42 100644 --- a/plugins/file/uca-file-camera.h +++ b/plugins/file/uca-file-camera.h @@ -24,39 +24,7 @@ G_BEGIN_DECLS #define UCA_TYPE_FILE_CAMERA (uca_file_camera_get_type()) -#define UCA_FILE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_FILE_CAMERA, UcaFileCamera)) -#define UCA_IS_FILE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_FILE_CAMERA)) -#define UCA_FILE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UCA_TYPE_FILE_CAMERA, UcaFileCameraClass)) -#define UCA_IS_FILE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_FILE_CAMERA)) -#define UCA_FILE_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_FILE_CAMERA, UcaFileCameraClass)) - -typedef struct _UcaFileCamera UcaFileCamera; -typedef struct _UcaFileCameraClass UcaFileCameraClass; -typedef struct _UcaFileCameraPrivate UcaFileCameraPrivate; - -/** - * UcaFileCamera: - * - * Creates #UcaFileCamera instances by loading corresponding shared objects. The - * contents of the #UcaFileCamera structure are private and should only be - * accessed via the provided API. - */ -struct _UcaFileCamera { - /*< private >*/ - UcaCamera parent; - - UcaFileCameraPrivate *priv; -}; - -/** - * UcaFileCameraClass: - * - * #UcaFileCamera class - */ -struct _UcaFileCameraClass { - /*< private >*/ - UcaCameraClass parent; -}; +G_DECLARE_FINAL_TYPE(UcaFileCamera, uca_file_camera, UCA, FILE_CAMERA, UcaCamera) G_END_DECLS diff --git a/plugins/mock/uca-mock-camera.c b/plugins/mock/uca-mock-camera.c index 8d7aed5d..c34a6007 100644 --- a/plugins/mock/uca-mock-camera.c +++ b/plugins/mock/uca-mock-camera.c @@ -22,13 +22,42 @@ #include #include "uca-mock-camera.h" -#define UCA_MOCK_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_MOCK_CAMERA, UcaMockCameraPrivate)) - static void uca_mock_initable_iface_init (GInitableIface *iface); -G_DEFINE_TYPE_WITH_CODE (UcaMockCamera, uca_mock_camera, UCA_TYPE_CAMERA, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, - uca_mock_initable_iface_init)) +/** + * UcaMockCamera: + * + * Creates #UcaMockCamera instances by loading corresponding shared objects. The + * contents of the #UcaMockCamera structure are private and should only be + * accessed via the provided API. + */ +struct _UcaMockCamera { + UcaCamera parent; + + guint width; + guint height; + guint bits; + guint bytes; + guint max_val; + guint roi_x, roi_y, roi_width, roi_height; + gfloat max_frame_rate; + gdouble exposure_time; + guint8 *dummy_data; + guint current_frame; + guint readout_index; + gboolean fill_data; + gdouble degree_value; + GRand *rand; + + gboolean thread_running; + + GThread *grab_thread; + GAsyncQueue *trigger_queue; +}; + +G_DEFINE_FINAL_TYPE_WITH_CODE (UcaMockCamera, uca_mock_camera, UCA_TYPE_CAMERA, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + uca_mock_initable_iface_init)) enum { PROP_FILL_DATA = N_BASE_PROPERTIES, @@ -57,28 +86,6 @@ static GParamSpec *mock_properties[N_PROPERTIES] = { NULL, }; static GMutex signal_mutex; static GCond signal_cond; -struct _UcaMockCameraPrivate { - guint width; - guint height; - guint bits; - guint bytes; - guint max_val; - guint roi_x, roi_y, roi_width, roi_height; - gfloat max_frame_rate; - gdouble exposure_time; - guint8 *dummy_data; - guint current_frame; - guint readout_index; - gboolean fill_data; - gdouble degree_value; - GRand *rand; - - gboolean thread_running; - - GThread *grab_thread; - GAsyncQueue *trigger_queue; -}; - static const char g_digits[16][20] = { /* 0 */ { 0x00, 0xff, 0xff, 0x00, @@ -207,37 +214,37 @@ print_number (guint8 *buffer, guint number, guint x, guint y, guint n_bytes, gui } static void -print_current_frame (UcaMockCameraPrivate *priv, guint8 *buffer, gboolean prefix) +print_current_frame (UcaMockCamera *camera, guint8 *buffer, gboolean prefix) { - const double mean = (double) ceil (priv->max_val / 2.); - const double std = (double) ceil (priv->max_val / 8.); + const double mean = (double) ceil (camera->max_val / 2.); + const double std = (double) ceil (camera->max_val / 8.); guint divisor = 10000000; - guint number = priv->current_frame; + guint number = camera->current_frame; int x = 2; - memset(buffer, 0, 15 * priv->roi_width * priv->bytes); + memset(buffer, 0, 15 * camera->roi_width * camera->bytes); if (prefix) { - number = priv->readout_index; - print_number(buffer, 11, x, 1, priv->bytes, priv->max_val, priv->roi_width); + number = camera->readout_index; + print_number(buffer, 11, x, 1, camera->bytes, camera->max_val, camera->roi_width); divisor = divisor / 10; x += DIGIT_WIDTH + 1; } while (divisor > 0) { /* max_val doubles as a bit mask */ - print_number(buffer, number / divisor, x, 1, priv->bytes, priv->max_val, priv->roi_width); + print_number(buffer, number / divisor, x, 1, camera->bytes, camera->max_val, camera->roi_width); number = number % divisor; divisor = divisor / 10; x += DIGIT_WIDTH + 1; } - for (guint y = (priv->roi_height / 3); y < ((priv->roi_height * 2) / 3); y++) { - for (guint x = (priv->roi_width / 3); x < ((priv->roi_width * 2) / 3); x++) { - double u1 = g_rand_double (priv->rand); - double u2 = g_rand_double (priv->rand); + for (guint y = (camera->roi_height / 3); y < ((camera->roi_height * 2) / 3); y++) { + for (guint x = (camera->roi_width / 3); x < ((camera->roi_width * 2) / 3); x++) { + double u1 = g_rand_double (camera->rand); + double u2 = g_rand_double (camera->rand); double r = sqrt (-2 * log(u1)) * cos(2 * G_PI * u2); - set_pixel (buffer, x, y, round (r * std + mean), priv->bytes, priv->max_val, priv->roi_width); + set_pixel (buffer, x, y, round (r * std + mean), camera->bytes, camera->max_val, camera->roi_width); } } } @@ -248,14 +255,12 @@ mock_grab_func(gpointer data) UcaMockCamera *mock_camera = UCA_MOCK_CAMERA(data); g_return_val_if_fail(UCA_IS_MOCK_CAMERA(mock_camera), NULL); - UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE(mock_camera); - UcaCamera *camera = UCA_CAMERA(mock_camera); gdouble fps = 0; - g_object_get (G_OBJECT (data), "frames-per-second", &fps, NULL); + g_object_get (G_OBJECT (mock_camera), "frames-per-second", &fps, NULL); const gulong sleep_time = (gulong) G_USEC_PER_SEC / fps; - while (priv->thread_running) { - camera->grab_func(priv->dummy_data, camera->user_data); + while (mock_camera->thread_running) { + uca_camera_invoke_grab_func(UCA_CAMERA(mock_camera), mock_camera->dummy_data); g_usleep(sleep_time); } @@ -273,15 +278,14 @@ handle_sigusr1 (int signum) static void uca_mock_camera_start_recording(UcaCamera *camera, GError **error) { - gboolean transfer_async = FALSE; - UcaMockCameraPrivate *priv; g_return_if_fail(UCA_IS_MOCK_CAMERA(camera)); - priv = UCA_MOCK_CAMERA_GET_PRIVATE(camera); + UcaMockCamera *mock_camera = UCA_MOCK_CAMERA (camera); + gboolean transfer_async = FALSE; signal (SIGUSR1, handle_sigusr1); - /* TODO: check that roi_x + roi_width < priv->width */ - priv->dummy_data = (guint8 *) g_malloc0(priv->roi_width * priv->roi_height * priv->bytes); + /* TODO: check that roi_x + roi_width < camera->width */ + mock_camera->dummy_data = (guint8 *) g_malloc0(mock_camera->roi_width * mock_camera->roi_height * mock_camera->bytes); g_object_get(G_OBJECT(camera), "transfer-asynchronously", &transfer_async, NULL); @@ -291,15 +295,15 @@ uca_mock_camera_start_recording(UcaCamera *camera, GError **error) */ if (transfer_async) { GError *tmp_error = NULL; - priv->thread_running = TRUE; + mock_camera->thread_running = TRUE; #if GLIB_CHECK_VERSION (2, 32, 0) - priv->grab_thread = g_thread_new (NULL, mock_grab_func, camera); + mock_camera->grab_thread = g_thread_new (NULL, mock_grab_func, camera); #else - priv->grab_thread = g_thread_create (mock_grab_func, camera, TRUE, &tmp_error); + mock_camera->grab_thread = g_thread_create (mock_grab_func, camera, TRUE, &tmp_error); #endif if (tmp_error != NULL) { - priv->thread_running = FALSE; + mock_camera->thread_running = FALSE; g_propagate_error(error, tmp_error); } } @@ -308,53 +312,47 @@ uca_mock_camera_start_recording(UcaCamera *camera, GError **error) static void uca_mock_camera_stop_recording(UcaCamera *camera, GError **error) { - gboolean transfer_async = FALSE; - UcaMockCameraPrivate *priv; g_return_if_fail(UCA_IS_MOCK_CAMERA(camera)); + gboolean transfer_async = FALSE; - priv = UCA_MOCK_CAMERA_GET_PRIVATE(camera); - g_free(priv->dummy_data); - priv->dummy_data = NULL; + UcaMockCamera *mock_camera = UCA_MOCK_CAMERA (camera); + g_free(mock_camera->dummy_data); + mock_camera->dummy_data = NULL; - g_object_get(G_OBJECT(camera), + g_object_get(G_OBJECT(mock_camera), "transfer-asynchronously", &transfer_async, NULL); if (transfer_async) { - priv->thread_running = FALSE; - g_thread_join(priv->grab_thread); + mock_camera->thread_running = FALSE; + g_thread_join(mock_camera->grab_thread); } } static void uca_mock_camera_trigger (UcaCamera *camera, GError **error) { - UcaMockCameraPrivate *priv; - g_return_if_fail(UCA_IS_MOCK_CAMERA (camera)); - priv = UCA_MOCK_CAMERA_GET_PRIVATE (camera); + UcaMockCamera *mock_camera = UCA_MOCK_CAMERA (camera); - g_async_queue_push (priv->trigger_queue, g_malloc0 (1)); + g_async_queue_push (mock_camera->trigger_queue, g_malloc0 (1)); } static gboolean uca_mock_camera_grab (UcaCamera *camera, gpointer data, GError **error) { - UcaMockCameraPrivate *priv; - UcaCameraTriggerSource trigger_source; - gdouble exposure_time; - g_return_val_if_fail (UCA_IS_MOCK_CAMERA(camera), FALSE); + UcaMockCamera *mock_camera = UCA_MOCK_CAMERA (camera); + UcaCameraTriggerSource trigger_source; + gdouble exposure_time; - priv = UCA_MOCK_CAMERA_GET_PRIVATE (camera); - - g_object_get (G_OBJECT (camera), + g_object_get (G_OBJECT (mock_camera), "exposure-time", &exposure_time, "trigger-source", &trigger_source, NULL); if (trigger_source == UCA_CAMERA_TRIGGER_SOURCE_SOFTWARE) - g_free (g_async_queue_pop (priv->trigger_queue)); + g_free (g_async_queue_pop (mock_camera->trigger_queue)); if (trigger_source == UCA_CAMERA_TRIGGER_SOURCE_EXTERNAL) { /* wait for signal to arrive */ @@ -365,12 +363,12 @@ uca_mock_camera_grab (UcaCamera *camera, gpointer data, GError **error) g_usleep (G_USEC_PER_SEC * exposure_time); - if (priv->fill_data) { - print_current_frame (priv, priv->dummy_data, FALSE); - g_memmove (data, priv->dummy_data, priv->roi_width * priv->roi_height * priv->bytes); + if (mock_camera->fill_data) { + print_current_frame (mock_camera, mock_camera->dummy_data, FALSE); + memmove (data, mock_camera->dummy_data, mock_camera->roi_width * mock_camera->roi_height * mock_camera->bytes); } - priv->current_frame++; + mock_camera->current_frame++; return TRUE; } @@ -380,13 +378,13 @@ uca_mock_camera_readout (UcaCamera *camera, gpointer data, guint index, GError * { g_return_val_if_fail (UCA_IS_MOCK_CAMERA(camera), FALSE); - UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE (camera); + UcaMockCamera *mock_camera = UCA_MOCK_CAMERA (camera); - priv->readout_index = index; + mock_camera->readout_index = index; - if (priv->fill_data) { - print_current_frame (priv, priv->dummy_data, TRUE); - g_memmove (data, priv->dummy_data, priv->roi_width * priv->roi_height * priv->bytes); + if (mock_camera->fill_data) { + print_current_frame (mock_camera, mock_camera->dummy_data, TRUE); + memmove (data, mock_camera->dummy_data, mock_camera->roi_width * mock_camera->roi_height * mock_camera->bytes); } return TRUE; @@ -396,7 +394,7 @@ static void uca_mock_camera_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { g_return_if_fail (UCA_IS_MOCK_CAMERA (object)); - UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE (object); + UcaMockCamera *camera = UCA_MOCK_CAMERA (object); if (uca_camera_is_recording (UCA_CAMERA (object)) && !uca_camera_is_writable_during_acquisition (UCA_CAMERA (object), pspec->name)) { g_warning ("Property '%s' cant be changed during acquisition", pspec->name); @@ -405,25 +403,25 @@ uca_mock_camera_set_property (GObject *object, guint property_id, const GValue * switch (property_id) { case PROP_EXPOSURE_TIME: - priv->exposure_time = g_value_get_double (value); + camera->exposure_time = g_value_get_double (value); break; case PROP_ROI_X: - priv->roi_x = g_value_get_uint (value); + camera->roi_x = g_value_get_uint (value); break; case PROP_ROI_Y: - priv->roi_y = g_value_get_uint (value); + camera->roi_y = g_value_get_uint (value); break; case PROP_ROI_WIDTH: - priv->roi_width = g_value_get_uint (value); + camera->roi_width = g_value_get_uint (value); break; case PROP_ROI_HEIGHT: - priv->roi_height = g_value_get_uint (value); + camera->roi_height = g_value_get_uint (value); break; case PROP_FILL_DATA: - priv->fill_data = g_value_get_boolean (value); + camera->fill_data = g_value_get_boolean (value); break; case PROP_DEGREE_VALUE: - priv->degree_value = g_value_get_double (value); + camera->degree_value = g_value_get_double (value); break; case PROP_TEST_ENUM: g_debug ("Set test-enum to `%i'", g_value_get_enum (value)); @@ -437,35 +435,35 @@ uca_mock_camera_set_property (GObject *object, guint property_id, const GValue * static void uca_mock_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { - UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE(object); + UcaMockCamera *camera = UCA_MOCK_CAMERA (object); switch (property_id) { case PROP_NAME: g_value_set_string(value, "mock camera"); break; case PROP_SENSOR_WIDTH: - g_value_set_uint(value, priv->width); + g_value_set_uint(value, camera->width); break; case PROP_SENSOR_HEIGHT: - g_value_set_uint(value, priv->height); + g_value_set_uint(value, camera->height); break; case PROP_SENSOR_BITDEPTH: - g_value_set_uint(value, priv->bits); + g_value_set_uint(value, camera->bits); break; case PROP_EXPOSURE_TIME: - g_value_set_double(value, priv->exposure_time); + g_value_set_double(value, camera->exposure_time); break; case PROP_ROI_X: - g_value_set_uint(value, priv->roi_x); + g_value_set_uint(value, camera->roi_x); break; case PROP_ROI_Y: - g_value_set_uint(value, priv->roi_y); + g_value_set_uint(value, camera->roi_y); break; case PROP_ROI_WIDTH: - g_value_set_uint(value, priv->roi_width); + g_value_set_uint(value, camera->roi_width); break; case PROP_ROI_HEIGHT: - g_value_set_uint(value, priv->roi_height); + g_value_set_uint(value, camera->roi_height); break; case PROP_HAS_STREAMING: g_value_set_boolean(value, TRUE); @@ -474,10 +472,10 @@ uca_mock_camera_get_property(GObject *object, guint property_id, GValue *value, g_value_set_boolean(value, FALSE); break; case PROP_FILL_DATA: - g_value_set_boolean (value, priv->fill_data); + g_value_set_boolean (value, camera->fill_data); break; case PROP_DEGREE_VALUE: - g_value_set_double (value, priv->degree_value); + g_value_set_double (value, camera->degree_value); break; case PROP_TEST_ENUM: g_value_set_enum (value, 0); @@ -491,17 +489,17 @@ uca_mock_camera_get_property(GObject *object, guint property_id, GValue *value, static void uca_mock_camera_finalize(GObject *object) { - UcaMockCameraPrivate *priv = UCA_MOCK_CAMERA_GET_PRIVATE(object); + UcaMockCamera *camera = UCA_MOCK_CAMERA (object); - g_rand_free (priv->rand); + g_rand_free (camera->rand); - if (priv->thread_running) { - priv->thread_running = FALSE; - g_thread_join (priv->grab_thread); + if (camera->thread_running) { + camera->thread_running = FALSE; + g_thread_join (camera->grab_thread); } - g_free (priv->dummy_data); - g_async_queue_unref (priv->trigger_queue); + g_free (camera->dummy_data); + g_async_queue_unref (camera->trigger_queue); G_OBJECT_CLASS (uca_mock_camera_parent_class)->finalize(object); } @@ -511,16 +509,14 @@ ufo_mock_camera_initable_init (GInitable *initable, GCancellable *cancellable, GError **error) { - UcaMockCameraPrivate *priv; - g_return_val_if_fail (UCA_IS_MOCK_CAMERA (initable), FALSE); - priv = UCA_MOCK_CAMERA_GET_PRIVATE (UCA_MOCK_CAMERA (initable)); + UcaMockCamera *camera = UCA_MOCK_CAMERA (initable); - priv->bytes = ceil (priv->bits / 8.); - priv->max_val = 0; + camera->bytes = ceil (camera->bits / 8.); + camera->max_val = 0; - for (guint i = 0; i < priv->bits; i++) { - priv->max_val |= 1 << i; + for (guint i = 0; i < camera->bits; i++) { + camera->max_val |= 1 << i; } return TRUE; @@ -587,40 +583,39 @@ uca_mock_camera_class_init(UcaMockCameraClass *klass) uca_camera_pspec_set_writable (g_object_class_find_property (gobject_class, uca_camera_props[PROP_EXPOSURE_TIME]), TRUE); uca_camera_pspec_set_writable (mock_properties[PROP_FILL_DATA], TRUE); uca_camera_pspec_set_writable (mock_properties[PROP_DEGREE_VALUE], TRUE); - - g_type_class_add_private(klass, sizeof(UcaMockCameraPrivate)); } static void uca_mock_camera_init(UcaMockCamera *self) { - self->priv = UCA_MOCK_CAMERA_GET_PRIVATE(self); - self->priv->roi_x = 0; - self->priv->roi_y = 0; - self->priv->max_frame_rate = 100000.0f; - self->priv->grab_thread = NULL; - self->priv->current_frame = 0; - self->priv->exposure_time = 0.05; - self->priv->fill_data = TRUE; - self->priv->degree_value = 1.0; - - self->priv->rand = g_rand_new (); - - GValue val = {0}; + self->roi_x = 0; + self->roi_y = 0; + self->max_frame_rate = 100000.0f; + self->grab_thread = NULL; + self->current_frame = 0; + self->exposure_time = 0.05; + self->fill_data = TRUE; + self->degree_value = 1.0; + + self->rand = g_rand_new (); + + GValue val = G_VALUE_INIT; g_value_init(&val, G_TYPE_UINT); g_value_set_uint(&val, 1); /* will be set in initable_init */ - self->priv->width = 4096; - self->priv->height = 4096; - self->priv->roi_width = 512; - self->priv->roi_height = 512; - self->priv->bits = 8; - self->priv->bytes = 0; - self->priv->max_val = 0; - self->priv->trigger_queue = g_async_queue_new (); + self->width = 4096; + self->height = 4096; + self->roi_width = 512; + self->roi_height = 512; + self->bits = 8; + self->bytes = 0; + self->max_val = 0; + self->trigger_queue = g_async_queue_new (); uca_camera_register_unit (UCA_CAMERA (self), "degree-value", UCA_UNIT_DEGREE_CELSIUS); + + g_value_unset(&val); } G_MODULE_EXPORT GType diff --git a/plugins/mock/uca-mock-camera.h b/plugins/mock/uca-mock-camera.h index bfbd166e..16277900 100644 --- a/plugins/mock/uca-mock-camera.h +++ b/plugins/mock/uca-mock-camera.h @@ -24,39 +24,7 @@ G_BEGIN_DECLS #define UCA_TYPE_MOCK_CAMERA (uca_mock_camera_get_type()) -#define UCA_MOCK_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_MOCK_CAMERA, UcaMockCamera)) -#define UCA_IS_MOCK_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_MOCK_CAMERA)) -#define UCA_MOCK_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UFO_TYPE_MOCK_CAMERA, UfoMockCameraClass)) -#define UCA_IS_MOCK_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_MOCK_CAMERA)) -#define UCA_MOCK_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_MOCK_CAMERA, UcaMockCameraClass)) - -typedef struct _UcaMockCamera UcaMockCamera; -typedef struct _UcaMockCameraClass UcaMockCameraClass; -typedef struct _UcaMockCameraPrivate UcaMockCameraPrivate; - -/** - * UcaMockCamera: - * - * Creates #UcaMockCamera instances by loading corresponding shared objects. The - * contents of the #UcaMockCamera structure are private and should only be - * accessed via the provided API. - */ -struct _UcaMockCamera { - /*< private >*/ - UcaCamera parent; - - UcaMockCameraPrivate *priv; -}; - -/** - * UcaMockCameraClass: - * - * #UcaMockCamera class - */ -struct _UcaMockCameraClass { - /*< private >*/ - UcaCameraClass parent; -}; +G_DECLARE_FINAL_TYPE (UcaMockCamera, uca_mock_camera, UCA, MOCK_CAMERA, UcaCamera) G_END_DECLS diff --git a/src/uca-camera.c b/src/uca-camera.c index 1c9f1f72..664e5e66 100644 --- a/src/uca-camera.c +++ b/src/uca-camera.c @@ -38,9 +38,25 @@ #include "uca-enums.h" #define G_LOG_LEVEL_DOMAIN "uca" -#define UCA_CAMERA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_CAMERA, UcaCameraPrivate)) -G_DEFINE_TYPE(UcaCamera, uca_camera, G_TYPE_OBJECT) +struct _UcaCameraPrivate { + gboolean cancelling_recording; + gboolean cancelling_grab; + gboolean is_recording; + gboolean is_readout; + gboolean transfer_async; + gboolean buffered; + guint num_buffers; + GThread *read_thread; + UcaRingBuffer *ring_buffer; + UcaCameraTriggerSource trigger_source; + UcaCameraTriggerType trigger_type; + + UcaCameraGrabFunc grab_func; + gpointer user_data; +}; + +G_DEFINE_TYPE_WITH_PRIVATE(UcaCamera, uca_camera, G_TYPE_OBJECT) /** * UcaCameraTriggerSource: @@ -161,21 +177,6 @@ DEFINE_CAST (double, atof) DEFINE_CAST (enum, atoi) DEFINE_CAST (boolean, str_to_boolean) - -struct _UcaCameraPrivate { - gboolean cancelling_recording; - gboolean cancelling_grab; - gboolean is_recording; - gboolean is_readout; - gboolean transfer_async; - gboolean buffered; - guint num_buffers; - GThread *read_thread; - UcaRingBuffer *ring_buffer; - UcaCameraTriggerSource trigger_source; - UcaCameraTriggerType trigger_type; -}; - static gboolean str_to_boolean (const gchar *s) { @@ -198,7 +199,8 @@ uca_camera_set_property_unit (GParamSpec *pspec, UcaUnit unit) static void uca_camera_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { - UcaCameraPrivate *priv = UCA_CAMERA_GET_PRIVATE(object); + UcaCamera *camera = UCA_CAMERA (object); + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); if (uca_camera_is_recording (UCA_CAMERA (object))) { g_warning("You cannot change properties during data acquisition"); @@ -242,7 +244,8 @@ uca_camera_set_property (GObject *object, guint property_id, const GValue *value static void uca_camera_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { - UcaCameraPrivate *priv = UCA_CAMERA_GET_PRIVATE (object); + UcaCamera *camera = UCA_CAMERA (object); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); switch (property_id) { case PROP_IS_RECORDING: @@ -324,9 +327,8 @@ uca_camera_get_property(GObject *object, guint property_id, GValue *value, GPara static void uca_camera_dispose (GObject *object) { - UcaCameraPrivate *priv; - - priv = UCA_CAMERA_GET_PRIVATE (object); + UcaCamera *camera = UCA_CAMERA (object); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); if (uca_camera_is_recording (UCA_CAMERA (object))) { GError *error = NULL; @@ -372,10 +374,8 @@ uca_camera_finalize (GObject *object) static void uca_camera_constructed (GObject *object) { - UcaCameraPrivate *priv; - g_return_val_if_fail (UCA_IS_CAMERA (object), FALSE); - - priv = UCA_CAMERA_GET_PRIVATE (object); + UcaCamera *camera = UCA_CAMERA (object); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); g_object_get (object, "is-recording", &priv->is_recording, NULL); g_object_get (object, "is-readout", &priv->is_readout, NULL); @@ -581,29 +581,27 @@ uca_camera_class_init (UcaCameraClass *klass) for (guint id = PROP_0 + 1; id < N_BASE_PROPERTIES; id++) g_object_class_install_property(gobject_class, id, camera_properties[id]); - - g_type_class_add_private(klass, sizeof(UcaCameraPrivate)); } static void uca_camera_init (UcaCamera *camera) { - GValue val = {0}; - - camera->grab_func = NULL; - - camera->priv = UCA_CAMERA_GET_PRIVATE(camera); - camera->priv->cancelling_recording = FALSE; - camera->priv->cancelling_grab = FALSE; - camera->priv->is_recording = FALSE; - camera->priv->is_readout = FALSE; - camera->priv->transfer_async = FALSE; - camera->priv->trigger_source = UCA_CAMERA_TRIGGER_SOURCE_AUTO; - camera->priv->trigger_type = UCA_CAMERA_TRIGGER_TYPE_EDGE; - camera->priv->buffered = FALSE; - camera->priv->num_buffers = 4; - camera->priv->ring_buffer = NULL; + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); + priv->grab_func = NULL; + priv->user_data = NULL; + priv->cancelling_recording = FALSE; + priv->cancelling_grab = FALSE; + priv->is_recording = FALSE; + priv->is_readout = FALSE; + priv->transfer_async = FALSE; + priv->trigger_source = UCA_CAMERA_TRIGGER_SOURCE_AUTO; + priv->trigger_type = UCA_CAMERA_TRIGGER_TYPE_EDGE; + priv->buffered = FALSE; + priv->num_buffers = 4; + priv->ring_buffer = NULL; + + GValue val = G_VALUE_INIT; g_value_init (&val, G_TYPE_UINT); g_value_set_uint (&val, 1); @@ -632,22 +630,21 @@ uca_camera_init (UcaCamera *camera) static gpointer buffer_thread (UcaCamera *camera) { - UcaCameraClass *klass; + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); GError *error = NULL; - klass = UCA_CAMERA_GET_CLASS (camera); - - while (!camera->priv->cancelling_recording) { + while (!priv->cancelling_recording) { gpointer buffer; - buffer = uca_ring_buffer_get_write_pointer (camera->priv->ring_buffer); + buffer = uca_ring_buffer_get_write_pointer (priv->ring_buffer); if (!(*klass->grab) (camera, buffer, &error)) { - camera->priv->cancelling_grab = TRUE; + priv->cancelling_grab = TRUE; break; } - uca_ring_buffer_write_advance (camera->priv->ring_buffer); + uca_ring_buffer_write_advance (priv->ring_buffer); } return error; @@ -799,7 +796,6 @@ void uca_camera_start_recording (UcaCamera *camera, GError **error) { UcaCameraClass *klass; - UcaCameraPrivate *priv; static GMutex mutex; GError *tmp_error = NULL; guint width, height, bitdepth; @@ -812,7 +808,7 @@ uca_camera_start_recording (UcaCamera *camera, GError **error) g_return_if_fail (klass != NULL); g_return_if_fail (klass->start_recording != NULL); - priv = camera->priv; + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); g_mutex_lock (&mutex); @@ -833,7 +829,7 @@ uca_camera_start_recording (UcaCamera *camera, GError **error) pixel_size = bitdepth <= 8 ? 1 : 2; } - if (priv->transfer_async && (camera->grab_func == NULL)) { + if (priv->transfer_async && (priv->grab_func == NULL)) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NO_GRAB_FUNC, "No grab callback function set"); goto start_recording_unlock; @@ -873,20 +869,15 @@ uca_camera_start_recording (UcaCamera *camera, GError **error) void uca_camera_stop_recording (UcaCamera *camera, GError **error) { - UcaCameraClass *klass; - UcaCameraPrivate *priv; - static GMutex mutex; - GError *tmp_error = NULL; - g_return_if_fail (UCA_IS_CAMERA (camera)); - klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); g_return_if_fail (klass != NULL); g_return_if_fail (klass->stop_recording != NULL); - priv = camera->priv; - + static GMutex mutex; g_mutex_lock (&mutex); if (!uca_camera_is_recording (camera)) { @@ -903,6 +894,7 @@ uca_camera_stop_recording (UcaCamera *camera, GError **error) priv->read_thread = NULL; } + GError *tmp_error = NULL; g_mutex_lock (&access_lock); (*klass->stop_recording)(camera, &tmp_error); @@ -918,9 +910,9 @@ uca_camera_stop_recording (UcaCamera *camera, GError **error) else g_propagate_error (error, tmp_error); - if (camera->priv->ring_buffer != NULL) { - g_object_unref (camera->priv->ring_buffer); - camera->priv->ring_buffer = NULL; + if (priv->ring_buffer != NULL) { + g_object_unref (priv->ring_buffer); + priv->ring_buffer = NULL; } error_stop_recording: @@ -968,7 +960,8 @@ gboolean uca_camera_stopped_recording(UcaCamera *camera) { g_return_val_if_fail (UCA_IS_CAMERA(camera), FALSE); - return !uca_camera_is_recording (camera) || camera->priv->cancelling_recording; + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); + return !uca_camera_is_recording (camera) || priv->cancelling_recording; } /** @@ -984,16 +977,15 @@ uca_camera_stopped_recording(UcaCamera *camera) void uca_camera_start_readout (UcaCamera *camera, GError **error) { - UcaCameraClass *klass; - static GMutex mutex; - g_return_if_fail (UCA_IS_CAMERA(camera)); - klass = UCA_CAMERA_GET_CLASS(camera); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS(camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); g_return_if_fail (klass != NULL); g_return_if_fail (klass->start_readout != NULL); + static GMutex mutex; g_mutex_lock (&mutex); if (!already_recording (camera, error)) { @@ -1004,7 +996,7 @@ uca_camera_start_readout (UcaCamera *camera, GError **error) g_mutex_unlock (&access_lock); if (tmp_error == NULL) { - camera->priv->is_readout = TRUE; + priv->is_readout = TRUE; g_object_notify_by_pspec (G_OBJECT (camera), camera_properties[PROP_IS_READOUT]); } else @@ -1026,12 +1018,12 @@ uca_camera_start_readout (UcaCamera *camera, GError **error) void uca_camera_stop_readout (UcaCamera *camera, GError **error) { - UcaCameraClass *klass; static GMutex mutex; g_return_if_fail (UCA_IS_CAMERA(camera)); - klass = UCA_CAMERA_GET_CLASS(camera); + UcaCameraClass *klass= UCA_CAMERA_GET_CLASS(camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); g_return_if_fail (klass != NULL); g_return_if_fail (klass->stop_readout != NULL); @@ -1046,7 +1038,7 @@ uca_camera_stop_readout (UcaCamera *camera, GError **error) g_mutex_unlock (&access_lock); if (tmp_error == NULL) { - camera->priv->is_readout = FALSE; + priv->is_readout = FALSE; g_object_notify (G_OBJECT (camera), "is-readout"); } else @@ -1067,10 +1059,23 @@ uca_camera_stop_readout (UcaCamera *camera, GError **error) void uca_camera_set_grab_func(UcaCamera *camera, UcaCameraGrabFunc func, gpointer user_data) { - camera->grab_func = func; - camera->user_data = user_data; + g_return_if_fail (UCA_IS_CAMERA (camera)); + + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); + priv->grab_func = func; + priv->user_data = user_data; +} + +void +uca_camera_invoke_grab_func (UcaCamera *camera, gpointer data) +{ + UcaCameraPrivate *priv = uca_camera_get_instance_private(camera); + + if (priv->grab_func != NULL) + priv->grab_func (data, priv->user_data); } + /** * uca_camera_trigger: * @camera: A #UcaCamera object @@ -1084,19 +1089,19 @@ uca_camera_set_grab_func(UcaCamera *camera, UcaCameraGrabFunc func, gpointer use void uca_camera_trigger (UcaCamera *camera, GError **error) { - UcaCameraClass *klass; static GMutex mutex; g_return_if_fail (UCA_IS_CAMERA (camera)); - klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); g_return_if_fail (klass != NULL); g_return_if_fail (klass->trigger != NULL); g_mutex_lock (&mutex); - if (!camera->priv->is_recording) { + if (!priv->is_recording) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING, "Camera is not recording"); } else { @@ -1153,24 +1158,24 @@ uca_camera_write (UcaCamera *camera, const gchar *name, gpointer data, gsize siz gboolean uca_camera_grab (UcaCamera *camera, gpointer data, GError **error) { - UcaCameraClass *klass; gboolean result = FALSE; /* FIXME: this prevents accessing two independent cameras simultanously. */ - static GMutex mutex; g_return_val_if_fail (UCA_IS_CAMERA(camera), FALSE); - klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); g_return_val_if_fail (klass != NULL, FALSE); g_return_val_if_fail (klass->grab != NULL, FALSE); g_return_val_if_fail (data != NULL, FALSE); - if (!camera->priv->buffered) { + static GMutex mutex; + if (!priv->buffered) { g_mutex_lock (&mutex); - if (!camera->priv->is_recording && !camera->priv->is_readout) { + if (!priv->is_recording && !priv->is_readout) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING, "Camera is neither recording nor in readout mode"); } @@ -1204,7 +1209,7 @@ uca_camera_grab (UcaCamera *camera, gpointer data, GError **error) else { gpointer buffer; - if (camera->priv->ring_buffer == NULL) + if (priv->ring_buffer == NULL) return FALSE; /* @@ -1212,20 +1217,20 @@ uca_camera_grab (UcaCamera *camera, gpointer data, GError **error) * often, as buffering is usually used in those cases when the camera is * faster than the software. */ - while (!uca_ring_buffer_available (camera->priv->ring_buffer)) { - if (camera->priv->cancelling_grab) { + while (!uca_ring_buffer_available (priv->ring_buffer)) { + if (priv->cancelling_grab) { return FALSE; } } - buffer = uca_ring_buffer_get_read_pointer (camera->priv->ring_buffer); + buffer = uca_ring_buffer_get_read_pointer (priv->ring_buffer); if (buffer == NULL) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_END_OF_STREAM, "Ring buffer is empty"); } else { - memcpy (data, buffer, uca_ring_buffer_get_block_size (camera->priv->ring_buffer)); + memcpy (data, buffer, uca_ring_buffer_get_block_size (priv->ring_buffer)); result = TRUE; } } @@ -1250,29 +1255,28 @@ uca_camera_grab (UcaCamera *camera, gpointer data, GError **error) gboolean uca_camera_readout (UcaCamera *camera, gpointer data, guint index, GError **error) { - UcaCameraClass *klass; + g_return_val_if_fail (UCA_IS_CAMERA(camera), FALSE); + gboolean result = FALSE; /* FIXME: this prevents accessing two independent cameras simultanously. */ - static GMutex mutex; - - g_return_val_if_fail (UCA_IS_CAMERA(camera), FALSE); - - klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); + UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); g_return_val_if_fail (klass != NULL, FALSE); g_return_val_if_fail (klass->readout != NULL, FALSE); g_return_val_if_fail (data != NULL, FALSE); - if (camera->priv->buffered) { + if (priv->buffered) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_RECORDING, "Cannot grab specific frame in buffered mode"); return FALSE; } + static GMutex mutex; g_mutex_lock (&mutex); - if (!camera->priv->is_recording && !camera->priv->is_readout) { + if (!priv->is_recording && !priv->is_readout) { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_RECORDING, "Camera is not in readout or record mode"); } diff --git a/src/uca-camera.h b/src/uca-camera.h index 7fcd632b..4951708c 100644 --- a/src/uca-camera.h +++ b/src/uca-camera.h @@ -23,11 +23,7 @@ G_BEGIN_DECLS #define UCA_TYPE_CAMERA (uca_camera_get_type()) -#define UCA_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_CAMERA, UcaCamera)) -#define UCA_IS_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_CAMERA)) -#define UCA_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UCA_TYPE_CAMERA, UcaCameraClass)) -#define UCA_IS_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_CAMERA)) -#define UCA_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_CAMERA, UcaCameraClass)) +G_DECLARE_DERIVABLE_TYPE(UcaCamera, uca_camera, UCA, CAMERA, GObject) #define UCA_CAMERA_ERROR uca_camera_error_quark() #define UCA_UNIT_QUARK uca_unit_quark() @@ -118,16 +114,6 @@ extern const gchar *uca_camera_props[N_BASE_PROPERTIES]; */ typedef void (*UcaCameraGrabFunc) (gpointer data, gpointer user_data); -struct _UcaCamera { - /*< private >*/ - GObject parent; - - UcaCameraGrabFunc grab_func; - gpointer user_data; - - UcaCameraPrivate *priv; -}; - /** * UcaCameraInterface: * @@ -182,6 +168,8 @@ gboolean uca_camera_readout (UcaCamera *camera, void uca_camera_set_grab_func (UcaCamera *camera, UcaCameraGrabFunc func, gpointer user_data); +void uca_camera_invoke_grab_func (UcaCamera *camera, + gpointer data); void uca_camera_register_unit (UcaCamera *camera, const gchar *prop_name, UcaUnit unit); @@ -198,8 +186,6 @@ gboolean uca_camera_is_writable_during_acquisition const gchar *prop_name); -GType uca_camera_get_type(void); - G_END_DECLS #endif From 2994a7f42e46cfa7edcfba757ce4274b31a235b1 Mon Sep 17 00:00:00 2001 From: Gabriel Lefloch Date: Mon, 20 Jan 2025 17:49:39 +0100 Subject: [PATCH 2/4] Use g_autoptr for errors --- src/uca-camera.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/uca-camera.c b/src/uca-camera.c index 664e5e66..f52f5f40 100644 --- a/src/uca-camera.c +++ b/src/uca-camera.c @@ -331,12 +331,11 @@ uca_camera_dispose (GObject *object) UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); if (uca_camera_is_recording (UCA_CAMERA (object))) { - GError *error = NULL; + g_autoptr(GError) error = NULL; uca_camera_stop_recording (UCA_CAMERA (object), &error); if (error != NULL) { g_warning ("Could not stop recording: %s", error->message); - g_error_free (error); } } @@ -632,7 +631,7 @@ buffer_thread (UcaCamera *camera) { UcaCameraClass *klass = UCA_CAMERA_GET_CLASS (camera); UcaCameraPrivate *priv = uca_camera_get_instance_private (camera); - GError *error = NULL; + g_autoptr(GError) error = NULL; while (!priv->cancelling_recording) { gpointer buffer; @@ -797,7 +796,7 @@ uca_camera_start_recording (UcaCamera *camera, GError **error) { UcaCameraClass *klass; static GMutex mutex; - GError *tmp_error = NULL; + g_autoptr(GError) tmp_error = NULL; guint width, height, bitdepth; guint pixel_size; @@ -894,7 +893,7 @@ uca_camera_stop_recording (UcaCamera *camera, GError **error) priv->read_thread = NULL; } - GError *tmp_error = NULL; + g_autoptr(GError) tmp_error = NULL; g_mutex_lock (&access_lock); (*klass->stop_recording)(camera, &tmp_error); @@ -989,7 +988,7 @@ uca_camera_start_readout (UcaCamera *camera, GError **error) g_mutex_lock (&mutex); if (!already_recording (camera, error)) { - GError *tmp_error = NULL; + g_autoptr(GError) tmp_error = NULL; g_mutex_lock (&access_lock); (*klass->start_readout) (camera, &tmp_error); @@ -1031,7 +1030,7 @@ uca_camera_stop_readout (UcaCamera *camera, GError **error) g_mutex_lock (&mutex); if (!already_recording (camera, error)) { - GError *tmp_error = NULL; + g_autoptr(GError) tmp_error = NULL; g_mutex_lock (&access_lock); (*klass->stop_readout) (camera, &tmp_error); From 2878ba3dad8498bc6055efa1061f56097491c09c Mon Sep 17 00:00:00 2001 From: gabs1234 Date: Tue, 4 Feb 2025 11:52:28 +0100 Subject: [PATCH 3/4] Modernized plugin-manager as well as the ring buffer --- src/uca-plugin-manager.c | 63 +++++++++-------------- src/uca-plugin-manager.h | 27 +--------- src/uca-ring-buffer.c | 105 ++++++++++++++------------------------- src/uca-ring-buffer.h | 26 +--------- 4 files changed, 64 insertions(+), 157 deletions(-) diff --git a/src/uca-plugin-manager.c b/src/uca-plugin-manager.c index b4c70487..d0d78933 100644 --- a/src/uca-plugin-manager.c +++ b/src/uca-plugin-manager.c @@ -39,15 +39,14 @@ #include #include "uca-plugin-manager.h" -G_DEFINE_TYPE (UcaPluginManager, uca_plugin_manager, G_TYPE_OBJECT) - -#define UCA_PLUGIN_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_PLUGIN_MANAGER, UcaPluginManagerPrivate)) - -struct _UcaPluginManagerPrivate { +struct _UcaPluginManager { + GObject parent_instance; GList *search_paths; GList *funcs; }; +G_DEFINE_FINAL_TYPE (UcaPluginManager, uca_plugin_manager, G_TYPE_OBJECT) + static const gchar *MODULE_PATTERN = "libuca([A-Za-z0-9]+)"; typedef GType (*GetTypeFunc) (void); @@ -99,11 +98,8 @@ uca_plugin_manager_add_path (UcaPluginManager *manager, { g_return_if_fail (UCA_IS_PLUGIN_MANAGER (manager)); - if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { - UcaPluginManagerPrivate *priv; - - priv = manager->priv; - priv->search_paths = g_list_append (priv->search_paths, + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { + manager->search_paths = g_list_append (manager->search_paths, g_strdup (path)); } } @@ -176,14 +172,12 @@ transform_camera_module_path_to_name (gchar *path, GList **result) GList * uca_plugin_manager_get_available_cameras (UcaPluginManager *manager) { - UcaPluginManagerPrivate *priv; GList *camera_paths; GList *camera_names = NULL; g_return_val_if_fail (UCA_IS_PLUGIN_MANAGER (manager), NULL); - - priv = manager->priv; - camera_paths = scan_search_paths (priv->search_paths); + + camera_paths = scan_search_paths (manager->search_paths); g_list_foreach (camera_paths, (GFunc) transform_camera_module_path_to_name, &camera_names); g_list_free_full (camera_paths, g_free); @@ -224,7 +218,7 @@ find_camera_module_path (GList *search_paths, const gchar *name) } static GType -get_camera_type (UcaPluginManagerPrivate *priv, +get_camera_type (UcaPluginManager *manager, const gchar *name, GError **error) { @@ -233,7 +227,7 @@ get_camera_type (UcaPluginManagerPrivate *priv, GetTypeFunc *func; const gchar *symbol_name = "camera_plugin_get_type"; - module_path = find_camera_module_path (priv->search_paths, name); + module_path = find_camera_module_path (manager->search_paths, name); g_debug ("Trying to load `%s' from %s.", name, module_path); if (module_path == NULL) { @@ -264,7 +258,7 @@ get_camera_type (UcaPluginManagerPrivate *priv, return G_TYPE_NONE; } - priv->funcs = g_list_append (priv->funcs, func); + manager->funcs = g_list_append (manager->funcs, func); return (*func) (); } @@ -353,14 +347,12 @@ uca_plugin_manager_get_camerav (UcaPluginManager *manager, GParameter *parameters, GError **error) { - UcaPluginManagerPrivate *priv; UcaCamera *camera; GType type; - g_return_val_if_fail (UCA_IS_PLUGIN_MANAGER (manager) && (name != NULL), NULL); + g_return_val_if_fail (UCA_IS_PLUGIN_MANAGER (manager) && (name != NULL), NULL); - priv = manager->priv; - type = get_camera_type (priv, name, error); + type = get_camera_type (manager, name, error); if (type == G_TYPE_NONE) return NULL; @@ -393,15 +385,13 @@ uca_plugin_manager_get_camera (UcaPluginManager *manager, const gchar *first_prop_name, ...) { - UcaPluginManagerPrivate *priv; UcaCamera *camera; GType type; va_list var_args; g_return_val_if_fail (UCA_IS_PLUGIN_MANAGER (manager) && (name != NULL), NULL); - - priv = manager->priv; - type = get_camera_type (priv, name, error); + + type = get_camera_type (manager, name, error); if (type == G_TYPE_NONE) return NULL; @@ -442,11 +432,11 @@ uca_plugin_manager_dispose (GObject *object) static void uca_plugin_manager_finalize (GObject *object) -{ - UcaPluginManagerPrivate *priv = UCA_PLUGIN_MANAGER_GET_PRIVATE (object); - - g_list_free_full (priv->search_paths, g_free); - g_list_free_full (priv->funcs, g_free); +{ + UcaPluginManager *manager = UCA_PLUGIN_MANAGER (object); + + g_list_free_full (manager->search_paths, g_free); + g_list_free_full (manager->funcs, g_free); G_OBJECT_CLASS (uca_plugin_manager_parent_class)->finalize (object); } @@ -459,21 +449,16 @@ uca_plugin_manager_class_init (UcaPluginManagerClass *klass) gobject_class->set_property = uca_plugin_manager_set_property; gobject_class->dispose = uca_plugin_manager_dispose; gobject_class->finalize = uca_plugin_manager_finalize; - - g_type_class_add_private (klass, sizeof (UcaPluginManagerPrivate)); } static void uca_plugin_manager_init (UcaPluginManager *manager) -{ - UcaPluginManagerPrivate *priv; - const gchar *uca_camera_path; +{ - manager->priv = priv = UCA_PLUGIN_MANAGER_GET_PRIVATE (manager); - priv->search_paths = NULL; - priv->funcs = NULL; + manager->search_paths = NULL; + manager->funcs = NULL; - uca_camera_path = g_getenv ("UCA_CAMERA_PATH"); + const gchar *uca_camera_path = g_getenv ("UCA_CAMERA_PATH"); if (uca_camera_path != NULL) uca_plugin_manager_add_path (manager, uca_camera_path); diff --git a/src/uca-plugin-manager.h b/src/uca-plugin-manager.h index 6e84a853..231f2d47 100644 --- a/src/uca-plugin-manager.h +++ b/src/uca-plugin-manager.h @@ -7,11 +7,7 @@ G_BEGIN_DECLS #define UCA_TYPE_PLUGIN_MANAGER (uca_plugin_manager_get_type()) -#define UCA_PLUGIN_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_PLUGIN_MANAGER, UcaPluginManager)) -#define UCA_IS_PLUGIN_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_PLUGIN_MANAGER)) -#define UCA_PLUGIN_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UCA_TYPE_PLUGIN_MANAGER, UcaPluginManagerClass)) -#define UCA_IS_PLUGIN_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_PLUGIN_MANAGER)) -#define UCA_PLUGIN_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_PLUGIN_MANAGER, UcaPluginManagerClass)) +G_DECLARE_FINAL_TYPE(UcaPluginManager, uca_plugin_manager, UCA, PLUGIN_MANAGER, GObject) #define UCA_PLUGIN_MANAGER_ERROR uca_plugin_manager_error_quark() GQuark uca_plugin_manager_error_quark(void); @@ -22,10 +18,6 @@ typedef enum { UCA_PLUGIN_MANAGER_ERROR_SYMBOL_NOT_FOUND } UcaPluginManagerError; -typedef struct _UcaPluginManager UcaPluginManager; -typedef struct _UcaPluginManagerClass UcaPluginManagerClass; -typedef struct _UcaPluginManagerPrivate UcaPluginManagerPrivate; - /** * UcaPluginManager: * @@ -33,22 +25,6 @@ typedef struct _UcaPluginManagerPrivate UcaPluginManagerPrivate; * contents of the #UcaPluginManager structure are private and should only be * accessed via the provided API. */ -struct _UcaPluginManager { - /*< private >*/ - GObject parent_instance; - - UcaPluginManagerPrivate *priv; -}; - -/** - * UcaPluginManagerClass: - * - * #UcaPluginManager class - */ -struct _UcaPluginManagerClass { - /*< private >*/ - GObjectClass parent_class; -}; UcaPluginManager *uca_plugin_manager_new (void); void uca_plugin_manager_add_path (UcaPluginManager *manager, @@ -69,7 +45,6 @@ UcaCamera *uca_plugin_manager_get_camera (UcaPluginManager *manager GError **error, const gchar *first_prop_name, ...); -GType uca_plugin_manager_get_type (void); G_END_DECLS diff --git a/src/uca-ring-buffer.c b/src/uca-ring-buffer.c index 2334b7c1..b948b034 100644 --- a/src/uca-ring-buffer.c +++ b/src/uca-ring-buffer.c @@ -18,11 +18,10 @@ #include #include "uca-ring-buffer.h" -#define UCA_RING_BUFFER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_RING_BUFFER, UcaRingBufferPrivate)) +#define UCA_RING_BUFFER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UCA_TYPE_RING_BUFFER, UcaRingBuffer)) -G_DEFINE_TYPE(UcaRingBuffer, uca_ring_buffer, G_TYPE_OBJECT) - -struct _UcaRingBufferPrivate { +struct _UcaRingBuffer { + GObject parent_instance; guchar *data; gsize block_size; guint n_blocks_total; @@ -32,6 +31,8 @@ struct _UcaRingBufferPrivate { guint written; }; +G_DEFINE_FINAL_TYPE (UcaRingBuffer, uca_ring_buffer, G_TYPE_OBJECT) + enum { PROP_0, PROP_BLOCK_SIZE, @@ -45,13 +46,10 @@ UcaRingBuffer * uca_ring_buffer_new (gsize block_size, guint n_blocks) { - UcaRingBuffer *buffer; - - buffer = g_object_new (UCA_TYPE_RING_BUFFER, + return g_object_new (UCA_TYPE_RING_BUFFER, "block-size", (guint64) block_size, "num-blocks", n_blocks, NULL); - return buffer; } void @@ -59,22 +57,22 @@ uca_ring_buffer_reset (UcaRingBuffer *buffer) { g_return_if_fail (UCA_IS_RING_BUFFER (buffer)); - buffer->priv->write_index = 0; - buffer->priv->read_index = 0; + buffer->write_index = 0; + buffer->read_index = 0; } gsize uca_ring_buffer_get_block_size (UcaRingBuffer *buffer) { g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), 0); - return buffer->priv->block_size; + return buffer->block_size; } gboolean uca_ring_buffer_available (UcaRingBuffer *buffer) { g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), FALSE); - return buffer->priv->read_index < buffer->priv->write_index; + return buffer->read_index < buffer->write_index; } /** @@ -89,15 +87,11 @@ uca_ring_buffer_available (UcaRingBuffer *buffer) gpointer uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer) { - UcaRingBufferPrivate *priv; - gpointer data; - g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), NULL); - priv = buffer->priv; + g_return_val_if_fail (buffer->read_index != buffer->write_index, NULL); - g_return_val_if_fail (priv->read_index != priv->write_index, NULL); - data = priv->data + (priv->read_index % priv->n_blocks_total) * priv->block_size; - priv->read_index++; + gpointer data = buffer->data + (buffer->read_index % buffer->n_blocks_total) * buffer->block_size; + buffer->read_index++; return data; } @@ -112,22 +106,15 @@ uca_ring_buffer_get_read_pointer (UcaRingBuffer *buffer) gpointer uca_ring_buffer_get_write_pointer (UcaRingBuffer *buffer) { - UcaRingBufferPrivate *priv; - gpointer data; - g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), NULL); - - priv = buffer->priv; - data = priv->data + (priv->write_index % priv->n_blocks_total) * priv->block_size; - - return data; + return buffer->data + (buffer->write_index % buffer->n_blocks_total) * buffer->block_size; } void uca_ring_buffer_write_advance (UcaRingBuffer *buffer) { g_return_if_fail (UCA_IS_RING_BUFFER (buffer)); - buffer->priv->write_index++; + buffer->write_index++; } /** @@ -141,10 +128,8 @@ uca_ring_buffer_write_advance (UcaRingBuffer *buffer) gpointer uca_ring_buffer_peek_pointer (UcaRingBuffer *buffer) { - UcaRingBufferPrivate *priv; g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), NULL); - priv = buffer->priv; - return ((guint8 *) priv->data) + ((priv->write_index % priv->n_blocks_total) * priv->block_size); + return ((guint8 *) buffer->data) + ((buffer->write_index % buffer->n_blocks_total) * buffer->block_size); } /** @@ -160,29 +145,23 @@ gpointer uca_ring_buffer_get_pointer (UcaRingBuffer *buffer, guint index) { - UcaRingBufferPrivate *priv; g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), NULL); - priv = buffer->priv; - return ((guint8 *) priv->data) + (((priv->read_index + index) % priv->n_blocks_total) * priv->block_size); + return ((guint8 *) buffer->data) + (((buffer->read_index + index) % buffer->n_blocks_total) * buffer->block_size); } guint uca_ring_buffer_get_num_blocks (UcaRingBuffer *buffer) { - UcaRingBufferPrivate *priv; - - g_return_val_if_fail (UCA_IS_RING_BUFFER (buffer), 0); - priv = buffer->priv; - return priv->write_index < priv->n_blocks_total ? priv->write_index : priv->n_blocks_total; + return buffer->write_index < buffer->n_blocks_total ? buffer->write_index : buffer->n_blocks_total; } static void -realloc_mem (UcaRingBufferPrivate *priv) +realloc_mem (UcaRingBuffer *buffer) { - if (priv->data != NULL) - g_free (priv->data); + if (buffer->data != NULL) + g_free (buffer->data); - priv->data = g_malloc0_n (priv->n_blocks_total, priv->block_size); + buffer->data = g_malloc0_n (buffer->n_blocks_total, buffer->block_size); } static void @@ -191,18 +170,16 @@ uca_ring_buffer_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - UcaRingBufferPrivate *priv; + UcaRingBuffer *buffer = UCA_RING_BUFFER (object); g_return_if_fail (UCA_IS_RING_BUFFER (object)); - priv = UCA_RING_BUFFER_GET_PRIVATE (object); - switch (property_id) { case PROP_BLOCK_SIZE: - g_value_set_uint64 (value, (guint64) priv->block_size); + g_value_set_uint64 (value, (guint64) buffer->block_size); break; case PROP_NUM_BLOCKS: - g_value_set_uint (value, priv->n_blocks_total); + g_value_set_uint (value, buffer->n_blocks_total); break; default: @@ -217,20 +194,19 @@ uca_ring_buffer_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - UcaRingBufferPrivate *priv; - g_return_if_fail (UCA_IS_RING_BUFFER (object)); - priv = UCA_RING_BUFFER_GET_PRIVATE (object); + + UcaRingBuffer *buffer = UCA_RING_BUFFER (object); switch (property_id) { case PROP_BLOCK_SIZE: - priv->block_size = (gsize) g_value_get_uint64 (value); - realloc_mem (priv); + buffer->block_size = (gsize) g_value_get_uint64 (value); + realloc_mem (buffer); break; case PROP_NUM_BLOCKS: - priv->n_blocks_total = g_value_get_uint (value); - realloc_mem (priv); + buffer->n_blocks_total = g_value_get_uint (value); + realloc_mem (buffer); break; default: @@ -248,11 +224,9 @@ uca_ring_buffer_dispose (GObject *object) static void uca_ring_buffer_finalize (GObject *object) { - UcaRingBufferPrivate *priv; - - priv = UCA_RING_BUFFER_GET_PRIVATE (object); - g_free (priv->data); - priv->data = NULL; + UcaRingBuffer *buffer = UCA_RING_BUFFER (object); + g_free (buffer->data); + buffer->data = NULL; G_OBJECT_CLASS (uca_ring_buffer_parent_class)->finalize (object); } @@ -284,17 +258,12 @@ uca_ring_buffer_class_init (UcaRingBufferClass *klass) for (guint i = PROP_0 + 1; i < N_PROPERTIES; i++) g_object_class_install_property (oclass, i, properties[i]); - - g_type_class_add_private (klass, sizeof (UcaRingBufferPrivate)); } static void uca_ring_buffer_init (UcaRingBuffer *buffer) { - UcaRingBufferPrivate *priv; - priv = buffer->priv = UCA_RING_BUFFER_GET_PRIVATE (buffer); - - priv->n_blocks_total = 0; - priv->block_size = 0; - priv->data = NULL; + buffer->n_blocks_total = 0; + buffer->block_size = 0; + buffer->data = NULL; } diff --git a/src/uca-ring-buffer.h b/src/uca-ring-buffer.h index 9fcf3b61..62ed1551 100644 --- a/src/uca-ring-buffer.h +++ b/src/uca-ring-buffer.h @@ -3,30 +3,10 @@ #include -#define UCA_TYPE_RING_BUFFER (uca_ring_buffer_get_type()) -#define UCA_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_RING_BUFFER, UcaRingBuffer)) -#define UCA_IS_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_RING_BUFFER)) -#define UCA_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UCA_TYPE_RING_BUFFER, UcaRingBufferClass)) -#define UCA_IS_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_RING_BUFFER)) -#define UCA_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_RING_BUFFER, UcaRingBufferClass)) - G_BEGIN_DECLS -typedef struct _UcaRingBuffer UcaRingBuffer; -typedef struct _UcaRingBufferClass UcaRingBufferClass; -typedef struct _UcaRingBufferPrivate UcaRingBufferPrivate; - -struct _UcaRingBuffer { - /*< private >*/ - GObject parent; - - UcaRingBufferPrivate *priv; -}; - -struct _UcaRingBufferClass { - /*< private >*/ - GObjectClass parent; -}; +#define UCA_TYPE_RING_BUFFER (uca_ring_buffer_get_type()) +G_DECLARE_FINAL_TYPE(UcaRingBuffer, uca_ring_buffer, UCA, RING_BUFFER, GObject) UcaRingBuffer * uca_ring_buffer_new (gsize block_size, guint n_blocks); @@ -42,8 +22,6 @@ gpointer uca_ring_buffer_get_pointer (UcaRingBuffer *buffer, guint index); gpointer uca_ring_buffer_peek_pointer (UcaRingBuffer *buffer); -GType uca_ring_buffer_get_type (void); - G_END_DECLS #endif From c507f01f96bc0a16411a7f82908528e74d681a0d Mon Sep 17 00:00:00 2001 From: gabs1234 Date: Tue, 4 Feb 2025 16:56:15 +0100 Subject: [PATCH 4/4] Updated minimum version in CMakeLists.txt --- CMakeLists.txt | 40 +++++++++++++++---------------------- bin/CMakeLists.txt | 2 +- bin/gui/CMakeLists.txt | 10 +++++----- bin/tools/CMakeLists.txt | 8 ++++---- plugins/CMakeLists.txt | 8 ++++---- plugins/file/CMakeLists.txt | 4 ++-- plugins/mock/CMakeLists.txt | 4 ++-- src/CMakeLists.txt | 8 ++++---- test/CMakeLists.txt | 4 ++-- 9 files changed, 40 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 350091a4..be878330 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,4 @@ -cmake_minimum_required(VERSION 2.6) - -if (POLICY CMP0053) -cmake_policy(SET CMP0053 OLD) -endif () - -if (POLICY CMP0054) -cmake_policy(SET CMP0054 OLD) -endif () +cmake_minimum_required(VERSION 3.16) project(uca C) @@ -17,29 +9,29 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") set(UCA_DESCRIPTION "Unified Camera Access") # These are software release versions -set(UCA_VERSION_MAJOR "2") -set(UCA_VERSION_MINOR "4") -set(UCA_VERSION_PATCH "0") +set(UCA_VERSION_MAJOR 2) +set(UCA_VERSION_MINOR 4) +set(UCA_VERSION_PATCH 0) set(UCA_VERSION_STRING "${UCA_VERSION_MAJOR}.${UCA_VERSION_MINOR}.${UCA_VERSION_PATCH}") # Increase the ABI version when binary compatibility cannot be guaranteed, e.g. # symbols have been removed, function signatures, structures, constants etc. # changed. -set(UCA_ABI_VERSION "2") +set(UCA_ABI_VERSION 2) #}}} #{{{ Macros # create_enums # @prefix: prefix of the output enum files # @template_prefix: prefix of the template (should be src/uca-enums) # @header_list: list with header files that should be searched for enums -macro(create_enums prefix template_prefix header_list) +function(create_enums prefix template_prefix header_list) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.h COMMAND ${GLIB2_MKENUMS} ARGS --template ${template_prefix}.h.template ${header_list} > ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${header_list}) add_custom_command( @@ -48,11 +40,11 @@ macro(create_enums prefix template_prefix header_list) ARGS --template ${template_prefix}.c.template ${header_list} > ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.c - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${header_list} ${CMAKE_CURRENT_BINARY_DIR}/${prefix}.h ) -endmacro() +endfunction() #}}} #{{{ Configure include(PkgConfigVars) @@ -67,12 +59,12 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/package.sh.in ${CMAKE_CURRENT_BINARY_DIR}/package.sh) #}}} #{{{ Common dependencies -find_package(PkgConfig) +find_package(PkgConfig REQUIRED) find_program(GLIB2_MKENUMS glib-mkenums REQUIRED) -pkg_check_modules(GLIB2 glib-2.0>=2.38 REQUIRED) -pkg_check_modules(GOBJECT2 gobject-2.0>=2.38 REQUIRED) -pkg_check_modules(GMODULE2 gmodule-2.0>=2.38 REQUIRED) -pkg_check_modules(GIO2 gio-2.0>=2.38 REQUIRED) +pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.38) +pkg_check_modules(GOBJECT2 REQUIRED gobject-2.0>=2.38) +pkg_check_modules(GMODULE2 REQUIRED gmodule-2.0>=2.38) +pkg_check_modules(GIO2 REQUIRED gio-2.0>=2.38) set(GLIB_VERSION_MIN_REQUIRED "GLIB_VERSION_2_38") set(GLIB_VERSION_MAX_ALLOWED "GLIB_VERSION_2_38") @@ -99,11 +91,11 @@ set(UCA_ENUM_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/plugins/pco/uca-pco-camera.h) #}}} #{{{ Common definitions -add_definitions("-std=c99 -Wall -fPIC") +add_compile_options("-std=c99" "-Wall" "-fPIC") #}}} #{{{ Subdirectories add_subdirectory(src) add_subdirectory(plugins) add_subdirectory(test) add_subdirectory(bin) -#}}} +#}}} \ No newline at end of file diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index cb2d9207..b703d732 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) add_subdirectory(gui) add_subdirectory(tools) diff --git a/bin/gui/CMakeLists.txt b/bin/gui/CMakeLists.txt index a8869dd7..c4042026 100644 --- a/bin/gui/CMakeLists.txt +++ b/bin/gui/CMakeLists.txt @@ -1,10 +1,10 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) -find_package(PkgConfig) +find_package(PkgConfig REQUIRED) find_program(GLIB_COMPILE_RESOURCES glib-compile-resources REQUIRED) -pkg_check_modules(GTK2 gtk+-2.0>=2.22) -pkg_check_modules(GTHREAD2 gthread-2.0) +pkg_check_modules(GTK2 REQUIRED gtk+-2.0>=2.22) +pkg_check_modules(GTHREAD2 REQUIRED gthread-2.0) if (GTK2_FOUND) set(GRESOURCES_XML "${CMAKE_CURRENT_SOURCE_DIR}/uca-camera-control.gresource.xml") @@ -52,4 +52,4 @@ if (GTK2_FOUND) install(TARGETS uca-camera-control RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT executables) -endif() +endif() \ No newline at end of file diff --git a/bin/tools/CMakeLists.txt b/bin/tools/CMakeLists.txt index 3f0044b8..872665d5 100644 --- a/bin/tools/CMakeLists.txt +++ b/bin/tools/CMakeLists.txt @@ -1,10 +1,10 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) #{{{ Variables set(libs uca) #}}} #{{{ Configure -find_package(TIFF) +find_package(TIFF REQUIRED) if (TIFF_FOUND) set(HAVE_LIBTIFF "1") @@ -21,7 +21,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR} set(BINARIES "benchmark" "gen-doc" "info") -foreach (BINARY ${BINARIES}) +foreach (BINARY IN LISTS BINARIES) add_executable(uca-${BINARY} ${BINARY}.c common.c) target_link_libraries(uca-${BINARY} ${libs}) endforeach () @@ -32,4 +32,4 @@ target_link_libraries(uca-grab ${libs} m) install(TARGETS uca-benchmark uca-grab uca-gen-doc uca-info RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT executables) -#}}} +#}}} \ No newline at end of file diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 7029cf73..e4045ade 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -3,11 +3,11 @@ set(UCA_CONFIGDIR "${CMAKE_CURRENT_BINARY_DIR}/../src") add_subdirectory(mock) add_subdirectory(file) -message("-- Building the following plugins:") +message(STATUS "Building the following plugins:") set(_plugins "mock;file") -foreach(_target ${_plugins}) +foreach(_target IN LISTS _plugins) if (TARGET "uca${_target}") - message("-- ${_target}") + message(STATUS " ${_target}") endif() -endforeach() +endforeach() \ No newline at end of file diff --git a/plugins/file/CMakeLists.txt b/plugins/file/CMakeLists.txt index 68741685..45e40400 100644 --- a/plugins/file/CMakeLists.txt +++ b/plugins/file/CMakeLists.txt @@ -1,7 +1,7 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) project(ucafile C) -find_package(TIFF) +find_package(TIFF REQUIRED) if (TIFF_FOUND) set(UCA_CAMERA_NAME "file") diff --git a/plugins/mock/CMakeLists.txt b/plugins/mock/CMakeLists.txt index 48a11beb..3766e003 100644 --- a/plugins/mock/CMakeLists.txt +++ b/plugins/mock/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) project(ucamock C) set(UCA_CAMERA_NAME "mock") @@ -18,4 +18,4 @@ target_link_libraries(ucamock uca m ${UCA_DEPS}) install(TARGETS ucamock LIBRARY DESTINATION ${CMAKE_INSTALL_PLUGINDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_PLUGINDIR} - COMPONENT ${UCA_CAMERA_NAME}) + COMPONENT ${UCA_CAMERA_NAME}) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2d047003..66614359 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) project(uca C) #{{{ Sources @@ -6,13 +6,13 @@ set(uca_SRCS uca-camera.c uca-plugin-manager.c uca-ring-buffer.c - ) +) set(uca_HDRS uca-camera.h uca-plugin-manager.h uca-ring-buffer.h - ) +) create_enums(uca-enums ${CMAKE_CURRENT_SOURCE_DIR}/uca-enums @@ -162,4 +162,4 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in configure_file("${CMAKE_CURRENT_SOURCE_DIR}/libuca.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libuca.pc" @ONLY IMMEDIATE) -#}}} +#}}} \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0e8cfadd..a6e23e15 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.16...3.22) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gtester.xsl ${CMAKE_CURRENT_BINARY_DIR}/gtester.xsl) @@ -7,4 +7,4 @@ add_executable(test-mock test-mock.c) add_executable(test-ring-buffer test-ring-buffer.c) target_link_libraries(test-mock uca ${UCA_DEPS}) -target_link_libraries(test-ring-buffer uca ${UCA_DEPS}) +target_link_libraries(test-ring-buffer uca ${UCA_DEPS}) \ No newline at end of file