ekiga r6140 - in trunk: . lib/engine/vidinput/skel src/gui



Author: mschneid
Date: Mon Apr  7 18:13:14 2008
New Revision: 6140
URL: http://svn.gnome.org/viewvc/ekiga?rev=6140&view=rev

Log:
Perform video device settings updates when getting frames
in order not to block the GUI thread.


Modified:
   trunk/ChangeLog
   trunk/lib/engine/vidinput/skel/vidinput-core.cpp
   trunk/lib/engine/vidinput/skel/vidinput-core.h
   trunk/src/gui/main.cpp

Modified: trunk/lib/engine/vidinput/skel/vidinput-core.cpp
==============================================================================
--- trunk/lib/engine/vidinput/skel/vidinput-core.cpp	(original)
+++ trunk/lib/engine/vidinput/skel/vidinput-core.cpp	Mon Apr  7 18:13:14 2008
@@ -118,18 +118,36 @@
 :  runtime (_runtime),
    preview_manager(*this, _display_core)
 {
-  PWaitAndSignal m(var_mutex);
+  PWaitAndSignal m_var(var_mutex);
+  PWaitAndSignal m_set(set_mutex);
 
   preview_config.active = false;
   preview_config.width = 176;
   preview_config.height = 144;
   preview_config.fps = 30;
-
+  preview_config.settings.brightness = 0;
+  preview_config.settings.whiteness = 0;
+  preview_config.settings.colour = 0;
+  preview_config.settings.contrast = 0;
+
+  new_preview_settings.brightness = 0;
+  new_preview_settings.whiteness = 0;
+  new_preview_settings.colour = 0;
+  new_preview_settings.contrast = 0;
 
   stream_config.active = false;
   stream_config.width = 176;
   stream_config.height = 144;
   stream_config.fps = 30;
+  stream_config.settings.brightness = 0;
+  stream_config.settings.whiteness = 0;
+  stream_config.settings.colour = 0;
+  stream_config.settings.contrast = 0;
+
+  new_stream_settings.brightness = 0;
+  new_stream_settings.whiteness = 0;
+  new_stream_settings.colour = 0;
+  new_stream_settings.contrast = 0;
 
   current_manager = NULL;
   vidinput_core_conf_bridge = NULL;
@@ -363,39 +381,100 @@
       if (current_manager)
         current_manager->get_frame_data(width, height, data); // the default device must always return true
     }
+    apply_settings();
+  }
+}
+
+void VidInputCore::apply_settings()
+{
+  PWaitAndSignal m_set(set_mutex);
+  if (preview_config.active && !stream_config.active) {
+
+    if (new_preview_settings.colour != preview_config.settings.colour) {
+      current_manager->set_colour (new_preview_settings.colour);
+      preview_config.settings.colour = new_preview_settings.colour;
+    }
+
+    if (new_preview_settings.brightness != preview_config.settings.brightness) {
+      current_manager->set_brightness (new_preview_settings.brightness);
+      preview_config.settings.brightness = new_preview_settings.brightness;
+    }
+
+    if (new_preview_settings.whiteness != preview_config.settings.whiteness) {
+      current_manager->set_whiteness (new_preview_settings.whiteness);
+      preview_config.settings.whiteness = new_preview_settings.whiteness;
+    }
+
+    if (new_preview_settings.contrast != preview_config.settings.contrast) {
+      current_manager->set_contrast (new_preview_settings.contrast);
+      preview_config.settings.contrast = new_preview_settings.contrast;
+    }
+
+  }
+
+  if (!preview_config.active && stream_config.active) {
+
+    if (new_stream_settings.colour != stream_config.settings.colour) {
+      current_manager->set_colour (new_stream_settings.colour);
+      stream_config.settings.colour = new_stream_settings.colour;
+    }
+
+    if (new_stream_settings.brightness != stream_config.settings.brightness) {
+      current_manager->set_brightness (new_stream_settings.brightness);
+      stream_config.settings.brightness = new_stream_settings.brightness;
+    }
+
+    if (new_stream_settings.whiteness != stream_config.settings.whiteness) {
+      current_manager->set_whiteness (new_stream_settings.whiteness);
+      stream_config.settings.whiteness = new_stream_settings.whiteness;
+    }
+
+    if (new_stream_settings.contrast != stream_config.settings.contrast) {
+      current_manager->set_contrast (new_stream_settings.contrast);
+      stream_config.settings.contrast = new_stream_settings.contrast;
+    }
+
   }
 }
 
 void VidInputCore::set_colour (unsigned colour)
 {
-  PWaitAndSignal m(var_mutex);
+  PWaitAndSignal m(set_mutex);
+  if (preview_config.active && !stream_config.active)
+    new_preview_settings.colour = colour;
 
-  if (current_manager)
-    current_manager->set_colour (colour);
+  if (!preview_config.active && stream_config.active)
+    new_stream_settings.colour = colour;
 }
 
 void VidInputCore::set_brightness (unsigned brightness)
 {
-  PWaitAndSignal m(var_mutex);
+  PWaitAndSignal m(set_mutex);
+  if (preview_config.active && !stream_config.active)
+    new_preview_settings.brightness  = brightness;
 
-  if (current_manager)
-    current_manager->set_brightness (brightness);
+  if (!preview_config.active && stream_config.active)
+    new_stream_settings.brightness = brightness;
 }
 
 void VidInputCore::set_whiteness  (unsigned whiteness)
 {
-  PWaitAndSignal m(var_mutex);
+  PWaitAndSignal m(set_mutex);
+  if (preview_config.active && !stream_config.active)
+    new_preview_settings.whiteness = whiteness;
 
-  if (current_manager)
-    current_manager->set_whiteness (whiteness);
+  if (!preview_config.active && stream_config.active)
+    new_stream_settings.whiteness = whiteness;
 }
 
 void VidInputCore::set_contrast   (unsigned contrast)
 {
-  PWaitAndSignal m(var_mutex);
+  PWaitAndSignal m(set_mutex);
+  if (preview_config.active && !stream_config.active)
+    new_preview_settings.contrast = contrast ;
 
-  if (current_manager)
-    current_manager->set_contrast (contrast);
+  if (!preview_config.active && stream_config.active)
+    new_stream_settings.contrast = contrast ;
 }
 
 void VidInputCore::on_vidinputdevice_error (VidInputDevice vidinput_device, VidInputErrorCodes error_code, VidInputManager *manager)

Modified: trunk/lib/engine/vidinput/skel/vidinput-core.h
==============================================================================
--- trunk/lib/engine/vidinput/skel/vidinput-core.h	(original)
+++ trunk/lib/engine/vidinput/skel/vidinput-core.h	Mon Apr  7 18:13:14 2008
@@ -58,6 +58,7 @@
     unsigned width;
     unsigned height;
     unsigned fps;
+    VidInputConfig settings;
   };
 
   class VidInputManager;
@@ -195,6 +196,8 @@
       void internal_close();
       void internal_set_device (const VidInputDevice & vidinput_device, int channel, VideoFormat format);
       void internal_set_fallback ();
+      void apply_settings();
+
 
       std::set<VidInputManager *> managers;
 
@@ -203,6 +206,9 @@
       DeviceConfig preview_config;
       DeviceConfig stream_config;
 
+      VidInputConfig new_stream_settings; 
+      VidInputConfig new_preview_settings;
+
       VidInputManager* current_manager;
       VidInputDevice desired_device;
       VidInputDevice current_device;
@@ -210,6 +216,7 @@
       int current_channel;
 
       PMutex var_mutex;      /* To protect variables that are read and written */
+      PMutex set_mutex;      /* To protect variables that are read and written */
 
       PreviewManager preview_manager;
       VidInputCoreConfBridge* vidinput_core_conf_bridge;

Modified: trunk/src/gui/main.cpp
==============================================================================
--- trunk/src/gui/main.cpp	(original)
+++ trunk/src/gui/main.cpp	Mon Apr  7 18:13:14 2008
@@ -2448,11 +2448,11 @@
   g_return_if_fail (data != NULL);
   mw = gm_mw_get_mw (GTK_WIDGET (data));
 
- // Ekiga::AudioInputCore *audioinput_core = dynamic_cast<Ekiga::AudioInputCore *> (mw->core.get ("audioinput-core"));
+  Ekiga::AudioInputCore *audioinput_core = dynamic_cast<Ekiga::AudioInputCore *> (mw->core.get ("audioinput-core"));
   Ekiga::AudioOutputCore *audiooutput_core = dynamic_cast<Ekiga::AudioOutputCore *> (mw->core.get ("audiooutput-core"));
 
   audiooutput_core->set_volume(Ekiga::primary, (unsigned)GTK_ADJUSTMENT (mw->adj_output_volume)->value);
-//  audioinput_core->set_volume((unsigned)GTK_ADJUSTMENT (mw->adj_input_volume)->value); //FIXME
+  audioinput_core->set_volume((unsigned)GTK_ADJUSTMENT (mw->adj_input_volume)->value);
 }
 
 



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