[the-board/cheese: 3/10] [tb] Add utils to start cheese camera asynchronously
- From: Lucas Rocha <lucasr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [the-board/cheese: 3/10] [tb] Add utils to start cheese camera asynchronously
- Date: Sun, 3 Apr 2011 22:37:33 +0000 (UTC)
commit 02808f14eaaa9b7f77618841afbff62eabf9b67a
Author: Lucas Rocha <lucasr gnome org>
Date: Sat Apr 2 02:10:18 2011 +0100
[tb] Add utils to start cheese camera asynchronously
configure.ac | 2 +
src/Makefile-tb.am | 3 ++
src/tb/tb-cheese-util.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++
src/tb/tb-cheese-util.h | 15 ++++++++
4 files changed, 111 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 187629a..f970443 100644
--- a/configure.ac
+++ b/configure.ac
@@ -58,6 +58,7 @@ MX_MIN_VERSION=1.1.1
GDK_PIXBUF_MIN_VERSION=2.22.1
LIBNOTIFY_MIN_VERSION=0.7.1
NAUTILUS_MIN_VERSION=2.91.3
+CHEESE_MIN_VERSION=2.91.93
PKG_CHECK_MODULES(THE_BOARD,
glib-2.0 >= $GLIB_MIN_VERSION
@@ -77,6 +78,7 @@ PKG_CHECK_MODULES(TB,
clutter-1.0 >= $CLUTTER_MIN_VERSION
mx-1.0 >= $MX_MIN_VERSION
gtk+-3.0 >= $GTK_MIN_VERSION
+ cheese >= $CHEESE_MIN_VERSION
gstreamer-0.10)
AC_ARG_WITH([libnotify],
diff --git a/src/Makefile-tb.am b/src/Makefile-tb.am
index d467272..1ef4e37 100644
--- a/src/Makefile-tb.am
+++ b/src/Makefile-tb.am
@@ -20,6 +20,7 @@ THE_BOARD_STAMP_FILES = stamp-tb-marshal.h stamp-tb-enum-types.h
tb_source_h = \
tb/tb-box.h \
+ tb/tb-cheese-util.h \
tb/tb-gio-util.h \
tb/tb-gdk-util.h \
tb/tb-gobject-util.h \
@@ -33,6 +34,7 @@ endif
tb_source_c = \
tb/tb-box.c \
+ tb/tb-cheese-util.c \
tb/tb-gio-util.c \
tb/tb-gdk-util.c \
tb/tb-gobject-util.c \
@@ -95,6 +97,7 @@ TheBoard_1_0_gir_LIBS = libthe-board-1.0.la
TheBoard_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(tb_cflags)
TheBoard_1_0_gir_SCANNERFLAGS = --warn-all --symbol-prefix=tb --identifier-prefix=Tb
TheBoard_1_0_gir_INCLUDES = \
+ Cheese-3.0 \
Clutter-1.0 \
GdkPixbuf-2.0 \
Gtk-3.0 \
diff --git a/src/tb/tb-cheese-util.c b/src/tb/tb-cheese-util.c
new file mode 100644
index 0000000..6b26914
--- /dev/null
+++ b/src/tb/tb-cheese-util.c
@@ -0,0 +1,91 @@
+#include <glib.h>
+#include <gio/gio.h>
+#include <cheese/cheese-camera.h>
+
+#include "tb/tb-cheese-util.h"
+
+/* This is a saner way to use cheese_camera_setup()
+ * and cheese_camera_play asynchronously so that we
+ * never block the ui thread while webcam is loading */
+
+typedef struct {
+ CheeseCamera *camera;
+} CameraStartData;
+
+static void
+camera_start_data_free(void *data)
+{
+ CameraStartData *dsd;
+
+ dsd = data;
+
+ g_object_unref(dsd->camera);
+ g_slice_free(CameraStartData, dsd);
+}
+
+static void
+camera_start_async_thread(GSimpleAsyncResult *res,
+ GObject *object,
+ GCancellable *cancellable)
+{
+ CameraStartData *dsd;
+ GError *error;
+
+ error = NULL;
+
+ dsd = g_simple_async_result_get_op_res_gpointer(res);
+
+ cheese_camera_setup(dsd->camera, NULL, &error);
+
+ if (error != NULL)
+ {
+ g_simple_async_result_set_from_error(res, error);
+ g_error_free(error);
+ return;
+ }
+
+ cheese_camera_play(dsd->camera);
+}
+
+
+void
+tb_cheese_camera_start_async(CheeseCamera *camera,
+ GAsyncReadyCallback callback)
+{
+ GSimpleAsyncResult *res;
+ CameraStartData *dsd;
+
+ dsd = g_slice_new0(CameraStartData);
+ dsd->camera = g_object_ref(camera);
+
+ res = g_simple_async_result_new(G_OBJECT(camera),
+ callback, NULL,
+ tb_cheese_camera_start_async);
+
+ g_simple_async_result_set_op_res_gpointer(res, dsd,
+ camera_start_data_free);
+
+ g_simple_async_result_run_in_thread(res,
+ camera_start_async_thread,
+ G_PRIORITY_DEFAULT,
+ NULL);
+
+ g_object_unref(res);
+}
+
+gboolean
+tb_cheese_camera_start_finish(CheeseCamera *camera,
+ GAsyncResult *res,
+ GError **error)
+{
+ GSimpleAsyncResult *simple;
+
+ simple = G_SIMPLE_ASYNC_RESULT(res);
+
+ g_warn_if_fail(g_simple_async_result_get_source_tag(simple) == tb_cheese_camera_start_async);
+
+ if (g_simple_async_result_propagate_error(simple, error))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/src/tb/tb-cheese-util.h b/src/tb/tb-cheese-util.h
new file mode 100644
index 0000000..1029bed
--- /dev/null
+++ b/src/tb/tb-cheese-util.h
@@ -0,0 +1,15 @@
+#ifndef __TB_CHEESE_UTIL_H__
+#define __TB_CHEESE_UTIL_H__
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <cheese/cheese-camera.h>
+
+void tb_cheese_camera_start_async (CheeseCamera *camera,
+ GAsyncReadyCallback callback);
+
+gboolean tb_cheese_camera_start_finish (CheeseCamera *camera,
+ GAsyncResult *res,
+ GError **error);
+
+#endif /* __TB_CHEESE_UTIL_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]