[cheese/0-to-1-devices] From 0 to 1 devices.



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]