/*****************************************************************************
* Local comparison functions, returns 0 if v == w, < 0 if v < w, > 0 if v > w
*****************************************************************************/
-static int CmpBool( vlc_value_t v, vlc_value_t w ) { return v.b_bool ? w.b_bool ? 0 : 1 : w.b_bool ? -1 : 0; }
-static int CmpInt( vlc_value_t v, vlc_value_t w ) { return v.i_int == w.i_int ? 0 : v.i_int > w.i_int ? 1 : -1; }
+static int CmpBool( vlc_value_t v, vlc_value_t w )
+{
+ return v.b_bool ? w.b_bool ? 0 : 1 : w.b_bool ? -1 : 0;
+}
+
+static int CmpInt( vlc_value_t v, vlc_value_t w )
+{
+ return v.i_int == w.i_int ? 0 : v.i_int > w.i_int ? 1 : -1;
+}
+
static int CmpTime( vlc_value_t v, vlc_value_t w )
{
return v.i_time == w.i_time ? 0 : v.i_time > w.i_time ? 1 : -1;
}
+
static int CmpString( vlc_value_t v, vlc_value_t w )
{
if( !v.psz_string )
list_ops = { CmpAddress, DupList, FreeList, },
mutex_ops = { CmpAddress, DupDummy, FreeMutex, },
string_ops = { CmpString, DupString, FreeString, },
-time_ops = { CmpTime, DupDummy, FreeDummy, };
+time_ops = { CmpTime, DupDummy, FreeDummy, },
+coords_ops = { NULL, DupDummy, FreeDummy, };
/*****************************************************************************
* Local prototypes
free( p_var );
}
+#undef var_Create
/**
* Initialize a vlc variable
*
* \param i_type The variables type. Must be one of \ref var_type combined with
* zero or more \ref var_flags
*/
-int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
+int var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
{
static vlc_list_t dummy_null_list = {0, NULL, NULL};
assert( p_this );
p_var->ops = &time_ops;
p_var->val.i_time = 0;
break;
+ case VLC_VAR_COORDS:
+ p_var->ops = &coords_ops;
+ p_var->val.coords.x = p_var->val.coords.y = 0;
+ break;
case VLC_VAR_ADDRESS:
p_var->ops = &addr_ops;
p_var->val.p_address = NULL;
break;
default:
p_var->ops = &void_ops;
- break;
+#ifndef NDEBUG
+ if( (i_type & VLC_VAR_CLASS) != VLC_VAR_VOID )
+ msg_Err( p_this, "Creating the variable '%s' without a type",
+ psz_name );
+#endif
}
if( i_type & VLC_VAR_DOINHERIT )
return ret;
}
+#undef var_Destroy
/**
* Destroy a vlc variable
*
* \param p_this The object that holds the variable
* \param psz_name The name of the variable
*/
-int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
+int var_Destroy( vlc_object_t *p_this, const char *psz_name )
{
variable_t *p_var;
tdestroy( priv->var_root, CleanupVar );
}
+#undef var_Change
/**
* Perform an action on a variable
*
* \param p_val First action parameter
* \param p_val2 Second action parameter
*/
-int __var_Change( vlc_object_t *p_this, const char *psz_name,
- int i_action, vlc_value_t *p_val, vlc_value_t *p_val2 )
+int var_Change( vlc_object_t *p_this, const char *psz_name,
+ int i_action, vlc_value_t *p_val, vlc_value_t *p_val2 )
{
int i;
variable_t *p_var;
return VLC_SUCCESS;
}
-
+#undef var_GetAndSet
/**
* Perform a Get and Set on a variable
*
* \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 var_GetAndSet( vlc_object_t *p_this, const char *psz_name, int i_action,
+ vlc_value_t *p_val )
{
int i_ret;
variable_t *p_var;
vlc_value_t oldval;
assert( p_this );
+ assert( p_val );
vlc_object_internals_t *p_priv = vlc_internals( p_this );
/* depending of the action requiered */
switch( i_action )
{
- case VLC_VAR_TOGGLE_BOOL:
+ case VLC_VAR_BOOL_TOGGLE:
assert( ( p_var->i_type & VLC_VAR_BOOL ) == VLC_VAR_BOOL );
p_var->val.b_bool = !p_var->val.b_bool;
break;
- case VLC_VAR_INTEGER_INCDEC:
+ case VLC_VAR_INTEGER_ADD:
+ assert( ( p_var->i_type & VLC_VAR_INTEGER ) == VLC_VAR_INTEGER );
+ p_var->val.i_int += p_val->i_int;
+ break;
+ case VLC_VAR_INTEGER_OR:
+ assert( ( p_var->i_type & VLC_VAR_INTEGER ) == VLC_VAR_INTEGER );
+ p_var->val.i_int |= p_val->i_int;
+ break;
+ case VLC_VAR_INTEGER_NAND:
assert( ( p_var->i_type & VLC_VAR_INTEGER ) == VLC_VAR_INTEGER );
- p_var->val.i_int += val.i_int;
+ p_var->val.i_int &= ~p_val->i_int;
break;
default:
vlc_mutex_unlock( &p_priv->var_lock );
/* Check boundaries */
CheckValue( p_var, &p_var->val );
+ *p_val = p_var->val;
/* Deal with callbacks.*/
i_ret = TriggerCallback( p_this, p_var, psz_name, oldval );
return i_ret;
}
-
+#undef var_Type
/**
* Request a variable's type
*
* variable could not be found.
* \see \ref var_type
*/
-int __var_Type( vlc_object_t *p_this, const char *psz_name )
+int var_Type( vlc_object_t *p_this, const char *psz_name )
{
variable_t *p_var;
int i_type = 0;
return i_type;
}
+#undef var_SetChecked
int var_SetChecked( vlc_object_t *p_this, const char *psz_name,
int expected_type, vlc_value_t val )
{
assert( expected_type == 0 ||
(p_var->i_type & VLC_VAR_CLASS) == expected_type );
+#ifndef NDEBUG
+ /* Alert if the type is VLC_VAR_VOID */
+ if( ( p_var->i_type & VLC_VAR_TYPE ) == VLC_VAR_VOID )
+ msg_Warn( p_this, "Calling var_Set on the void variable '%s' (0x%04x)", psz_name, p_var->i_type );
+#endif
+
WaitUnused( p_this, p_var );
return i_ret;
}
-
+#undef var_Set
/**
* Set a variable's value
*
* \param psz_name The name of the variable
* \param val the value to set
*/
-int __var_Set( vlc_object_t *p_this, const char *psz_name, vlc_value_t val )
+int var_Set( vlc_object_t *p_this, const char *psz_name, vlc_value_t val )
{
return var_SetChecked( p_this, psz_name, 0, val );
}
+#undef var_GetChecked
int var_GetChecked( vlc_object_t *p_this, const char *psz_name,
int expected_type, vlc_value_t *p_val )
{
#ifndef NDEBUG
/* Alert if the type is VLC_VAR_VOID */
if( ( p_var->i_type & VLC_VAR_TYPE ) == VLC_VAR_VOID )
- msg_Warn( p_this, "Calling var_GetVoid on the void variable '%s' (0x%04x)", psz_name, p_var->i_type );
+ msg_Warn( p_this, "Calling var_Get on the void variable '%s' (0x%04x)", psz_name, p_var->i_type );
#endif
/* Duplicate value if needed */
return err;
}
+#undef var_Get
/**
* Get a variable's value
*
* \param p_val Pointer to a vlc_value_t that will hold the variable's value
* after the function is finished
*/
-int __var_Get( vlc_object_t *p_this, const char *psz_name, vlc_value_t *p_val )
+int var_Get( vlc_object_t *p_this, const char *psz_name, vlc_value_t *p_val )
{
return var_GetChecked( p_this, psz_name, 0, p_val );
}
+#undef var_AddCallback
/**
* Register a callback in a variable
*
* the variable. Use proper locking. This thread may not have much
* time to spare, so keep callback functions short.
*/
-int __var_AddCallback( vlc_object_t *p_this, const char *psz_name,
- vlc_callback_t pf_callback, void *p_data )
+int var_AddCallback( vlc_object_t *p_this, const char *psz_name,
+ vlc_callback_t pf_callback, void *p_data )
{
variable_t *p_var;
callback_entry_t entry;
return VLC_SUCCESS;
}
+#undef var_DelCallback
/**
* Remove a callback from a variable
*
* pf_callback and p_data have to be given again, because different objects
* might have registered the same callback function.
*/
-int __var_DelCallback( vlc_object_t *p_this, const char *psz_name,
- vlc_callback_t pf_callback, void *p_data )
+int var_DelCallback( vlc_object_t *p_this, const char *psz_name,
+ vlc_callback_t pf_callback, void *p_data )
{
int i_entry;
variable_t *p_var;
return VLC_SUCCESS;
}
+#undef var_TriggerCallback
/**
* Trigger callback on a variable
*
* \param p_this The object that hold the variable
* \param psz_name The name of the variable
*/
-int __var_TriggerCallback( vlc_object_t *p_this, const char *psz_name )
+int var_TriggerCallback( vlc_object_t *p_this, const char *psz_name )
{
int i_ret;
variable_t *p_var;
/* Create the variable in the input object.
* Children of the input object will be able to retreive this value
* thanks to the inheritance property of the object variables. */
- __var_Create( p_obj, psz_name, i_type );
+ var_Create( p_obj, psz_name, i_type );
switch( i_type )
{
goto cleanup;
}
- __var_Set( p_obj, psz_name, val );
+ var_Set( p_obj, psz_name, val );
/* If that's a list, remove all elements allocated */
if( i_type == VLC_VAR_LIST )
int var_Inherit( vlc_object_t *p_this, const char *psz_name, int i_type,
vlc_value_t *p_val )
{
+#ifndef NDEBUG
+ if (p_this != VLC_OBJECT(p_this->p_libvlc)
+ && unlikely(p_this->p_parent == NULL))
+ {
+ msg_Info (p_this, "%s(%s) on detached object", __func__, psz_name);
+ //vlc_backtrace ();
+ }
+#endif
i_type &= VLC_VAR_CLASS;
for( vlc_object_t *obj = p_this; obj != NULL; obj = obj->p_parent )
+ {
if( var_GetChecked( obj, psz_name, i_type, p_val ) == VLC_SUCCESS )
return VLC_SUCCESS;
+#ifndef NDEBUG
+ if (obj != p_this && obj != VLC_OBJECT(p_this->p_libvlc)
+ && unlikely(obj->p_parent == NULL))
+ {
+ msg_Info (p_this, "%s(%s) on detached tree [%p] %s", __func__,
+ psz_name, obj, obj->psz_object_type);
+ //vlc_backtrace ();
+ }
+#endif
+ }
/* else take value from config */
switch( i_type & VLC_VAR_CLASS )
return VLC_SUCCESS;
}
-
+#undef var_Command
/**********************************************************************
* Execute a var command on an object identified by its name
**********************************************************************/
-int __var_Command( vlc_object_t *p_this, const char *psz_name,
- const char *psz_cmd, const char *psz_arg, char **psz_msg )
+int var_Command( vlc_object_t *p_this, const char *psz_name,
+ const char *psz_cmd, const char *psz_arg, char **psz_msg )
{
vlc_object_t *p_obj = vlc_object_find_name( p_this->p_libvlc,
psz_name, FIND_CHILD );