[vlc-devel] commit: variables: add a Get and Set function. This function can be only used (for the ( Rémi Duraffort )
git version control
git at videolan.org
Mon Jul 27 09:42:25 CEST 2009
vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Mon Jul 27 08:00:53 2009 +0200| [1bc0945eea3fc2cf77502da070a4af831e4f3175] | committer: Rémi Duraffort
variables: add a Get and Set function. This function can be only used (for the
moment) to toggle a boolean with the variable lock taken (which is not the case
when doing a var_SetBool(!var_GetBool)).
This function is also two times faster (only one lookup).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1bc0945eea3fc2cf77502da070a4af831e4f3175
---
include/vlc_variables.h | 26 ++++++++++++++++++++
src/libvlccore.sym | 1 +
src/misc/variables.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 87 insertions(+), 0 deletions(-)
diff --git a/include/vlc_variables.h b/include/vlc_variables.h
index 0efe910..aaada0d 100644
--- a/include/vlc_variables.h
+++ b/include/vlc_variables.h
@@ -115,6 +115,17 @@
#define VLC_VAR_SETISCOMMAND 0x0040
/**@}*/
+/** \defgroup var_GetAndSet Variable actions
+ * These are the different actions that can be used with __var_GetAndSet()
+ * @{
+ */
+/**
+ * Toggle the value of this boolean
+ * \param val Unused
+ */
+#define VLC_VAR_TOGGLE_BOOL 0x0010
+/**@}*/
+
/*****************************************************************************
* Prototypes
*****************************************************************************/
@@ -128,6 +139,7 @@ VLC_EXPORT( int, __var_Set, ( vlc_object_t *, const char *, vlc_value_t ) );
VLC_EXPORT( int, __var_Get, ( vlc_object_t *, const char *, vlc_value_t * ) );
VLC_EXPORT( int, var_SetChecked, ( vlc_object_t *, const char *, int, vlc_value_t ) );
VLC_EXPORT( int, var_GetChecked, ( vlc_object_t *, const char *, int, vlc_value_t * ) );
+VLC_EXPORT( int, __var_GetAndSet, ( vlc_object_t *, const char *, int, vlc_value_t ) );
#define var_Command(a,b,c,d,e) __var_Command( VLC_OBJECT( a ), b, c, d, e )
VLC_EXPORT( int, __var_Command, ( vlc_object_t *, const char *, const char *, const char *, char ** ) );
@@ -160,6 +172,10 @@ VLC_EXPORT( void, var_FreeList, ( vlc_value_t *, vlc_value_t * ) );
* __var_Get() with automatic casting
*/
#define var_Get(a,b,c) __var_Get( VLC_OBJECT(a), b, c )
+/**
+ * __var_GetAndSet() with automatic casting
+ */
+#define var_GetAndSet(a,b,c,d) __var_GetAndSet(VLC_OBJECT(a), b, c, d)
/*****************************************************************************
* Variable callbacks
@@ -654,6 +670,16 @@ static inline int __var_CountChoices( vlc_object_t *p_obj, const char *psz_name
*/
#define var_CountChoices(a,b) __var_CountChoices( VLC_OBJECT(a),b)
+
+static inline int __var_ToggleBool( vlc_object_t *p_obj, const char *psz_name )
+{
+ vlc_value_t val;
+ return __var_GetAndSet( p_obj, psz_name, VLC_VAR_TOGGLE_BOOL, val );
+}
+/**
+ * __var_ToggleBool() with automatic casting
+ */
+#define var_ToggleBool(a,b) __var_ToggleBool( VLC_OBJECT(a),b )
/**
* @}
*/
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 357f4ec..affea30 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -437,6 +437,7 @@ __var_DelCallback
__var_Destroy
var_FreeList
__var_Get
+__var_GetAndSet
var_GetChecked
__var_Set
var_SetChecked
diff --git a/src/misc/variables.c b/src/misc/variables.c
index 864089b..c3f2971 100644
--- a/src/misc/variables.c
+++ b/src/misc/variables.c
@@ -662,6 +662,66 @@ int __var_Change( vlc_object_t *p_this, const char *psz_name,
return VLC_SUCCESS;
}
+
+/**
+ * Perform a Get and Set on a variable
+ *
+ * \param p_this: The object that hold the variable
+ * \param psz_name: the name of the variable
+ * \param i_action: the action to perform
+ * \param p_val: The action parameter
+ * \return vlc error codes
+ */
+int __var_GetAndSet( vlc_object_t *p_this, const char *psz_name, int i_action,
+ vlc_value_t val )
+{
+ int i_var;
+ int i_ret = VLC_SUCCESS;
+ variable_t *p_var;
+ vlc_value_t oldval;
+ vlc_object_internals_t *p_priv = vlc_internals( p_this );
+
+ vlc_mutex_lock( &p_priv->var_lock );
+ i_var = GetUnused( p_this, psz_name );
+ if( i_var < 0 )
+ {
+ vlc_mutex_unlock( &p_priv->var_lock );
+ return i_var;
+ }
+
+ p_var = &p_priv->p_vars[i_var];
+
+ /* Duplicated data if needed */
+ //p_var->ops->pf_dup( &val );
+
+ /* Backup needed stuff */
+ oldval = p_var->val;
+
+ /* depending of the action requiered */
+ switch( i_action )
+ {
+ case VLC_VAR_TOGGLE_BOOL:
+ assert( ( p_var->i_type & VLC_VAR_BOOL ) == VLC_VAR_BOOL );
+ p_var->val.b_bool = !p_var->val.b_bool;
+ break;
+ default:
+ vlc_mutex_unlock( &p_priv->var_lock );
+ return VLC_EGENERIC;
+ }
+
+ /* Check boundaries */
+ CheckValue( p_var, &p_var->val );
+
+ /* Del with callbacks.*/
+ if( p_var->i_entries )
+ i_ret = TriggerCallback( p_this, p_var, psz_name, oldval, p_var->val );
+
+ vlc_mutex_unlock( &p_priv->var_lock );
+
+ return i_ret;
+}
+
+
/**
* Request a variable's type
*
More information about the vlc-devel
mailing list