[cheese/0-to-1-devices] From 0 to 1 devices.
- From: Patricia Santana Cruz <patriciasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cheese/0-to-1-devices] From 0 to 1 devices.
- Date: Tue, 28 Feb 2012 14:22:53 +0000 (UTC)
commit 29534423bcc332517b1fff7b54dc3729128ef7e3
Author: Patricia Santana Cruz <patriciasantanacruz gmail com>
Date: Wed Feb 15 15:46:13 2012 +0000
From 0 to 1 devices.
libcheese/cheese-camera.c | 99 +++++++++++++++++++++++++++++++++++++++----
libcheese/cheese-camera.h | 3 +-
src/cheese-window.vala | 74 ++++++++++----------------------
src/vapi/cheese-common.vapi | 3 +-
4 files changed, 116 insertions(+), 63 deletions(-)
---
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index 0eb058c..6ee6c03 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -87,6 +87,7 @@ struct _CheeseCameraPrivate
GstElement *video_enc;
ClutterTexture *video_texture;
+ ClutterActor *error_layer;
GstElement *effect_filter;
GstElement *video_balance, *csp_post_balance;
@@ -99,6 +100,7 @@ struct _CheeseCameraPrivate
gboolean is_recording;
gboolean pipeline_is_playing;
+ gboolean is_hotplug_device;
gchar *photo_filename;
guint num_camera_devices;
@@ -278,6 +280,36 @@ cheese_camera_bus_message_cb (GstBus *bus, GstMessage *message, CheeseCamera *ca
}
/*
+ * cheese_camera_setup_init:
+ * @device: a #CheeseCameraDevice
+ * @camera: a #CheeseCamera
+ *
+ * Sets up the first connected camera device.
+ */
+static void
+cheese_camera_setup_init (CheeseCameraDevice *device,
+ CheeseCamera *camera)
+{
+ g_printf ("Camera - cheese_camera_setup_init\n");
+ CheeseCameraPrivate *priv = camera->priv;
+ const gchar *uuid = cheese_camera_device_get_uuid (device);
+ GError *error = NULL;
+
+ cheese_camera_setup (camera, uuid, &error);
+
+ if (error != NULL) {
+ cheese_camera_show_error_layer (camera, error->message);
+ g_error_free (error);
+ } else {
+ cheese_camera_hide_error_layer (camera);
+ if (priv->is_hotplug_device) {
+ cheese_camera_play (camera);
+ priv->is_hotplug_device = FALSE;
+ }
+ }
+}
+
+/*
* cheese_camera_add_device:
* @monitor: a #CheeseCameraDeviceMonitor
* @device: a #CheeseCameraDevice
@@ -291,11 +323,16 @@ cheese_camera_add_device (CheeseCameraDeviceMonitor *monitor,
CheeseCameraDevice *device,
CheeseCamera *camera)
{
+ g_printf ("Cheese - cheese_camera_add_device\n");
CheeseCameraPrivate *priv = camera->priv;
g_ptr_array_add (priv->camera_devices, device);
priv->num_camera_devices++;
+ g_printf ("Number of camera devices : %i\n", priv->num_camera_devices);
+ if (priv->num_camera_devices == 1)
+ cheese_camera_setup_init (device, camera);
+
g_object_notify_by_pspec (G_OBJECT (camera), properties[PROP_NUM_CAMERA_DEVICES]);
}
@@ -343,6 +380,7 @@ cheese_camera_remove_device (CheeseCameraDeviceMonitor *monitor,
static void
cheese_camera_detect_camera_devices (CheeseCamera *camera)
{
+ g_printf ("Camera - cheese_camera_detect_camera_devices\n");
CheeseCameraPrivate *priv = camera->priv;
priv->num_camera_devices = 0;
@@ -355,6 +393,14 @@ cheese_camera_detect_camera_devices (CheeseCamera *camera)
G_CALLBACK (cheese_camera_remove_device), camera);
cheese_camera_device_monitor_coldplug (priv->monitor);
+
+ if (priv->num_camera_devices < 1)
+ {
+ cheese_camera_show_error_layer (camera, "No device found");
+ priv->is_hotplug_device = TRUE;
+ return 1;
+ }
+ return 0;
}
/*
@@ -710,6 +756,7 @@ cheese_camera_switch_camera_device (CheeseCamera *camera)
void
cheese_camera_play (CheeseCamera *camera)
{
+ g_printf ("Camera - cheese_camera_play\n");
CheeseCameraPrivate *priv;
CheeseCameraDevice *device;
GstCaps *caps;
@@ -717,6 +764,7 @@ cheese_camera_play (CheeseCamera *camera)
g_return_if_fail (CHEESE_IS_CAMERA (camera));
priv = camera->priv;
+
device = g_ptr_array_index (priv->camera_devices, priv->selected_device);
caps = cheese_camera_device_get_caps_for_format (device, priv->current_format);
@@ -1372,16 +1420,32 @@ cheese_camera_class_init (CheeseCameraClass *klass)
static void
cheese_camera_init (CheeseCamera *camera)
{
+ g_printf ("Camera - cheese_camera_init\n");
CheeseCameraPrivate *priv = camera->priv = CHEESE_CAMERA_GET_PRIVATE (camera);
+ ClutterScript *clutter_builder = clutter_script_new();
+ const gchar *file;
+ int result;
+ GError *error = NULL;
priv->is_recording = FALSE;
priv->pipeline_is_playing = FALSE;
+ priv->is_hotplug_device = FALSE;
priv->photo_filename = NULL;
priv->camera_devices = NULL;
priv->device_node = NULL;
priv->photo_handler_signal_id = 0;
priv->current_format = NULL;
priv->monitor = NULL;
+
+ file = g_build_filename (PACKAGE_DATADIR, "cheese-viewport.json", NULL);
+ result = clutter_script_load_from_file (clutter_builder, file, &error);
+
+ if (result == 0) {
+ g_error ("Error: %s\n", error->message);
+ g_error_free (error);
+ }
+
+ priv->error_layer = CLUTTER_ACTOR (clutter_script_get_object (clutter_builder, "error_layer"));
}
/**
@@ -1396,9 +1460,11 @@ cheese_camera_init (CheeseCamera *camera)
* Returns: a new #CheeseCamera
*/
CheeseCamera *
-cheese_camera_new (ClutterTexture *video_texture, const gchar *camera_device_node,
+cheese_camera_new (ClutterTexture *video_texture,
+ const gchar *camera_device_node,
gint x_resolution, gint y_resolution)
{
+ g_printf ("Camera - cheese_camera_new\n");
CheeseCamera *camera;
CheeseVideoFormat *format = g_slice_new (CheeseVideoFormat);
@@ -1417,6 +1483,8 @@ cheese_camera_new (ClutterTexture *video_texture, const gchar *camera_device_nod
"format", format, NULL);
}
+ cheese_camera_detect_camera_devices (camera);
+
return camera;
}
@@ -1462,6 +1530,27 @@ cheese_camera_set_device_by_dev_uuid (CheeseCamera *camera, const gchar *uuid)
}
}
+void
+cheese_camera_show_error_layer (CheeseCamera *camera, char *message)
+{
+ g_printf ("Camera - cheese_camera_show_error_layer\n");
+ g_printf ("Message is %s\n", message);
+ CheeseCameraPrivate *priv = camera->priv;
+
+ clutter_actor_hide ((ClutterActor *) priv->video_texture);
+ clutter_text_set_text ((ClutterText *) priv->error_layer, message);
+ clutter_actor_show ((ClutterActor *) priv->error_layer);
+}
+
+void
+cheese_camera_hide_error_layer (CheeseCamera *camera)
+{
+ g_printf ("Camera - cheese_camera_hide_error_layer\n");
+ CheeseCameraPrivate *priv = camera->priv;
+ clutter_actor_hide ((ClutterActor *) priv->error_layer);
+ clutter_actor_show ((ClutterActor *) priv->video_texture);
+}
+
/**
* cheese_camera_setup:
* @camera: a #CheeseCamera
@@ -1482,14 +1571,6 @@ cheese_camera_setup (CheeseCamera *camera, const gchar *uuid, GError **error)
priv = camera->priv;
- cheese_camera_detect_camera_devices (camera);
-
- if (priv->num_camera_devices < 1)
- {
- g_set_error (error, CHEESE_CAMERA_ERROR, CHEESE_CAMERA_ERROR_NO_DEVICE, _("No device found"));
- return;
- }
-
if (uuid != NULL)
{
cheese_camera_set_device_by_dev_uuid (camera, uuid);
diff --git a/libcheese/cheese-camera.h b/libcheese/cheese-camera.h
index bfc9525..c546f0d 100644
--- a/libcheese/cheese-camera.h
+++ b/libcheese/cheese-camera.h
@@ -102,7 +102,8 @@ CheeseCamera *cheese_camera_new (ClutterTexture *video_texture,
gint y_resolution);
const CheeseVideoFormat *cheese_camera_get_current_video_format (CheeseCamera *camera);
-void cheese_camera_setup (CheeseCamera *camera, const gchar *uuid, GError **error);
+void cheese_camera_show_error_layer (CheeseCamera *camera, char *message);
+void cheese_camera_hide_error_layer (CheeseCamera *camera);
void cheese_camera_play (CheeseCamera *camera);
void cheese_camera_stop (CheeseCamera *camera);
void cheese_camera_set_effect (CheeseCamera *camera, CheeseEffect *effect);
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 12ef2e0..68be390 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -73,7 +73,6 @@ public class Cheese.MainWindow : Gtk.Window
private Clutter.BinLayout viewport_layout_manager;
private Clutter.Text countdown_layer;
private Clutter.Rectangle background_layer;
- private Clutter.Text error_layer;
private Clutter.Box current_effects_grid;
private int current_effects_page = 0;
@@ -348,42 +347,30 @@ public class Cheese.MainWindow : Gtk.Window
[CCode (instance_pos = -1)]
public void on_file_move_to_trash_all (Gtk.Action action)
{
- // TODO: Use asynchronous methods.
try {
- var directory = File.new_for_path (fileutil.get_photo_path ());
- var enumerator = directory.enumerate_children (FILE_ATTRIBUTE_STANDARD_NAME, FileQueryInfoFlags.NONE);
+ File file_to_trash;
+ FileInfo file_info;
+ File directory = File.new_for_path (fileutil.get_photo_path ());
+ FileEnumerator enumerator = directory.enumerate_children (FILE_ATTRIBUTE_STANDARD_NAME, 0, null);
- // Trash photos.
- trash_enumerated_files (directory.get_path (), enumerator);
+ while ((file_info = enumerator.next_file (null)) != null)
+ {
+ file_to_trash = File.new_for_path (fileutil.get_photo_path () + GLib.Path.DIR_SEPARATOR_S + file_info.get_name ());
+ file_to_trash.trash (null);
+ }
directory = File.new_for_path (fileutil.get_video_path ());
- enumerator = directory.enumerate_children (FILE_ATTRIBUTE_STANDARD_NAME, FileQueryInfoFlags.NONE);
-
- // Trash videos.
- trash_enumerated_files (directory.get_path (), enumerator);
- } catch (Error error) {
- warning ("Error while building file trash list: %s", error.message);
- }
- }
-
- /**
- * Send the enumerated files to the trash.
- *
- * @param directory the directory containing the enumerated files
- * @param enumerator the enumeration of files to send to the trash
- */
- private void trash_enumerated_files (string directory, FileEnumerator enumerator)
- {
- try {
- FileInfo file_info;
+ enumerator = directory.enumerate_children (FILE_ATTRIBUTE_STANDARD_NAME, 0, null);
while ((file_info = enumerator.next_file (null)) != null)
{
- var file_to_trash = File.new_for_path (GLib.Path.build_filename (directory, file_info.get_name ()));
- file_to_trash.trash ();
+ file_to_trash = File.new_for_path (fileutil.get_photo_path () + GLib.Path.DIR_SEPARATOR_S + file_info.get_name ());
+ file_to_trash.trash (null);
}
- } catch (Error error) {
- warning ("Error while trashing files: %s", error.message);
+ } catch (Error e)
+ {
+ warning ("Error: %s\n", e.message);
+ return;
}
}
@@ -1236,10 +1223,7 @@ public class Cheese.MainWindow : Gtk.Window
video_preview.hide ();
if (effects_grids.size == 0)
- {
- error_layer.text = _("No effects found");
- error_layer.show ();
- }
+ camera.show_error_layer ("No effects found");
else
{
current_effects_grid.show ();
@@ -1249,9 +1233,7 @@ public class Cheese.MainWindow : Gtk.Window
else
{
if (effects_grids.size == 0)
- {
- error_layer.hide ();
- }
+ camera.hide_error_layer ();
else
{
current_effects_grid.hide ();
@@ -1521,7 +1503,6 @@ public class Cheese.MainWindow : Gtk.Window
viewport_layout_manager = clutter_builder.get_object ("viewport_layout_manager") as Clutter.BinLayout;
countdown_layer = clutter_builder.get_object ("countdown_layer") as Clutter.Text;
background_layer = clutter_builder.get_object ("background") as Clutter.Rectangle;
- error_layer = clutter_builder.get_object ("error_layer") as Clutter.Text;
video_preview.keep_aspect_ratio = true;
video_preview.request_mode = Clutter.RequestMode.HEIGHT_FOR_WIDTH;
@@ -1604,7 +1585,6 @@ public class Cheese.MainWindow : Gtk.Window
public void setup_camera (string ? uri)
{
string device;
- double value;
if (uri != null && uri.length > 0)
device = uri;
@@ -1615,20 +1595,8 @@ public class Cheese.MainWindow : Gtk.Window
device,
settings.get_int ("photo-x-resolution"),
settings.get_int ("photo-y-resolution"));
- try {
- camera.setup (device);
- }
- catch (Error err)
- {
- video_preview.hide ();
- warning ("Error: %s\n", err.message);
- error_layer.text = err.message;
- error_layer.show ();
-
- toggle_camera_actions_sensitivities (false);
- return;
- }
+ double value;
value = settings.get_double ("brightness");
if (value != 0.0)
camera.set_balance_property ("brightness", value);
@@ -1646,7 +1614,9 @@ public class Cheese.MainWindow : Gtk.Window
camera.set_balance_property ("saturation", value);
camera.state_flags_changed.connect (camera_state_changed);
- camera.play ();
+
+ if (camera.get_camera_devices ().len != 0)
+ camera.play ();
}
/**
diff --git a/src/vapi/cheese-common.vapi b/src/vapi/cheese-common.vapi
index 5b59b0d..b845d90 100644
--- a/src/vapi/cheese-common.vapi
+++ b/src/vapi/cheese-common.vapi
@@ -49,7 +49,8 @@ namespace Cheese
public void toggle_effects_pipeline (bool active);
public void connect_effect_texture (Cheese.Effect effect, Clutter.Texture texture);
public void set_video_format (Cheese.VideoFormat format);
- public void setup (string udi) throws GLib.Error;
+ public void show_error_layer (string message);
+ public void hide_error_layer ();
public void start_video_recording (string filename);
public void stop ();
public void stop_video_recording ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]