[cheese/gnome-2-26] Don't take new photo while waiting for the previous
- From: Filippo Argiolas <fargiolas src gnome org>
- To: svn-commits-list gnome org
- Subject: [cheese/gnome-2-26] Don't take new photo while waiting for the previous
- Date: Sun, 17 May 2009 15:04:04 -0400 (EDT)
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]