[cheese/gnome-2-26] Don't take new photo while waiting for the previous



commit 1419fb8b8261d4b276719b9895f0bdb2bba05bd0
Author: Filippo Argiolas <filippo argiolas gmail com>
Date:   Sun May 17 08:27:49 2009 +0200

    Don't take new photo while waiting for the previous
    
    Ignore new photo requests if we are still waiting for an "handoff"
    signal for the previous one. Fixes bug #582902
---
 src/cheese-webcam.c |   16 +++++++++-------
 src/cheese-webcam.h |    2 +-
 src/cheese-window.c |   36 ++++++++++++++++++++----------------
 3 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/src/cheese-webcam.c b/src/cheese-webcam.c
index 1d2130e..6375eb1 100644
--- a/src/cheese-webcam.c
+++ b/src/cheese-webcam.c
@@ -40,7 +40,6 @@
 #include <linux/videodev.h>
 
 #include "cheese-webcam.h"
-#include "cheese-flash.h"
 
 G_DEFINE_TYPE (CheeseWebcam, cheese_webcam, G_TYPE_OBJECT)
 
@@ -93,8 +92,6 @@ typedef struct
   int selected_device;
   CheeseVideoFormat *current_format;
 
-  CheeseFlash *flash;
-
   guint eos_timeout_id;
 } CheeseWebcamPrivate;
 
@@ -218,6 +215,7 @@ cheese_webcam_photo_data_cb (GstElement *element, GstBuffer *buffer,
 
   g_signal_handler_disconnect (G_OBJECT (priv->photo_sink),
                                priv->photo_handler_signal_id);
+  priv->photo_handler_signal_id = 0;
 
   g_signal_emit (webcam, webcam_signals[PHOTO_SAVED], 0);
 }
@@ -1346,11 +1344,16 @@ cheese_webcam_stop_video_recording (CheeseWebcam *webcam)
   }
 }
 
-void
+gboolean
 cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename)
 {
   CheeseWebcamPrivate *priv = CHEESE_WEBCAM_GET_PRIVATE (webcam);
 
+  if (priv->photo_handler_signal_id != 0) {
+    g_print ("Still waiting for previous photo data, ignoring new request\n");
+    return FALSE;
+  }
+
   g_free (priv->photo_filename);
   priv->photo_filename = g_strdup (filename);
 
@@ -1359,7 +1362,7 @@ cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename)
                                                     "handoff",
                                                     G_CALLBACK (cheese_webcam_photo_data_cb),
                                                     webcam);
-  cheese_flash_fire (priv->flash);
+  return TRUE;
 }
 
 static void
@@ -1534,8 +1537,7 @@ cheese_webcam_init (CheeseWebcam *webcam)
   priv->photo_filename      = NULL;
   priv->webcam_devices      = NULL;
   priv->device_name         = NULL;
-
-  priv->flash = cheese_flash_new ();
+  priv->photo_handler_signal_id = 0;
 }
 
 CheeseWebcam *
diff --git a/src/cheese-webcam.h b/src/cheese-webcam.h
index a996c55..6004a31 100644
--- a/src/cheese-webcam.h
+++ b/src/cheese-webcam.h
@@ -108,7 +108,7 @@ void               cheese_webcam_stop (CheeseWebcam *webcam);
 void               cheese_webcam_set_effect (CheeseWebcam *webcam, CheeseWebcamEffect effect);
 void               cheese_webcam_start_video_recording (CheeseWebcam *webcam, char *filename);
 void               cheese_webcam_stop_video_recording (CheeseWebcam *webcam);
-void               cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename);
+gboolean            cheese_webcam_take_photo (CheeseWebcam *webcam, char *filename);
 gboolean           cheese_webcam_has_webcam (CheeseWebcam *webcam);
 int                cheese_webcam_get_num_webcam_devices (CheeseWebcam *webcam);
 int                cheese_webcam_get_selected_device_index (CheeseWebcam *webcam);
diff --git a/src/cheese-window.c b/src/cheese-window.c
index e931488..48974c4 100644
--- a/src/cheese-window.c
+++ b/src/cheese-window.c
@@ -55,6 +55,7 @@
 #include "gedit-message-area.h"
 #include "cheese-no-camera.h"
 #include "cheese-prefs-dialog.h"
+#include "cheese-flash.h"
 
 #define SHUTTER_SOUNDS             5
 #define FULLSCREEN_POPUP_HEIGHT    40
@@ -87,7 +88,6 @@ typedef struct
   /* UDI device requested on the command line */
   char *startup_hal_dev_udi;
   char *video_filename;
-  char *photo_filename;
 
   int counter;
 
@@ -172,6 +172,8 @@ typedef struct
   GSource *fullscreen_timeout_source;
 
   int audio_play_counter;
+
+  CheeseFlash *flash;
 } CheeseWindow;
 
 void
@@ -405,15 +407,13 @@ static void
 cheese_window_photo_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
 {
   gdk_threads_enter ();
-  /* TODO look at this g_free */
-  g_free (cheese_window->photo_filename);
-  cheese_window->photo_filename = NULL;
   gtk_widget_set_sensitive (cheese_window->take_picture, TRUE);
   gtk_widget_set_sensitive (cheese_window->take_picture_fullscreen, TRUE);
   gdk_flush ();
   gdk_threads_leave ();
 }
 
+
 static void
 cheese_window_video_saved_cb (CheeseWebcam *webcam, CheeseWindow *cheese_window)
 {
@@ -1190,20 +1190,23 @@ cheese_window_countdown_picture_cb (gpointer data)
   CheeseWindow *cheese_window = (CheeseWindow *) data;
   GError       *error         = NULL;
   GstAudioPlay *audio_play;
-  char         *file;
+  char         *shutter_filename;
+  char         *photo_filename;
 
-  file       = audio_play_get_filename (cheese_window);
-  audio_play = gst_audio_play_file (file, &error);
-  if (!audio_play)
+  photo_filename = cheese_fileutil_get_new_media_filename (cheese_window->fileutil, WEBCAM_MODE_PHOTO);
+  if (cheese_webcam_take_photo (cheese_window->webcam, photo_filename))
   {
-    g_warning ("%s", error ? error->message : "Unknown error");
-    g_error_free (error);
+    cheese_flash_fire (cheese_window->flash);
+    shutter_filename = audio_play_get_filename (cheese_window);
+    audio_play = gst_audio_play_file (shutter_filename, &error);
+    if (!audio_play)
+    {
+      g_warning ("%s", error ? error->message : "Unknown error");
+      g_error_free (error);
+    }
+    g_free (shutter_filename);
   }
-
-  g_free (file);
-
-  cheese_window->photo_filename = cheese_fileutil_get_new_media_filename (cheese_window->fileutil, WEBCAM_MODE_PHOTO);
-  cheese_webcam_take_photo (cheese_window->webcam, cheese_window->photo_filename);
+  g_free (photo_filename);
 }
 
 static void
@@ -1938,8 +1941,9 @@ cheese_window_init (char *hal_dev_udi, CheeseDbus *dbus_server)
 
   cheese_window->startup_hal_dev_udi = hal_dev_udi;
   cheese_window->gconf               = cheese_gconf_new ();
-  cheese_window->audio_play_counter  = 0;
   cheese_window->fileutil            = cheese_fileutil_new ();
+  cheese_window->flash               = cheese_flash_new ();
+  cheese_window->audio_play_counter  = 0;
   cheese_window->isFullscreen        = FALSE;
 
   cheese_window->server = dbus_server;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]