[vlc-devel] [PATCH] libvlc_config_update was added to libvlc API
basos g
noxelia at gmail.com
Thu Dec 11 15:25:28 CET 2008
It updates realtime configuration parameters
taken in the format of argv
---
include/vlc/libvlc.h | 17 +++++++
include/vlc_configuration.h | 1 +
src/config/core.c | 45 ++++++++++++++++++++
src/control/core.c | 98 +++++++++++++++++++++++++++++++++++++++++++
src/libvlc.sym | 1 +
src/libvlccore.sym | 1 +
6 files changed, 163 insertions(+), 0 deletions(-)
diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h
index 932192f..4a111c3 100644
--- a/include/vlc/libvlc.h
+++ b/include/vlc/libvlc.h
@@ -190,6 +190,23 @@ VLC_PUBLIC_API void libvlc_release( libvlc_instance_t * );
VLC_PUBLIC_API void libvlc_retain( libvlc_instance_t * );
/**
+ * Updates configuration parameters real time. psz_config has is the
same as the
+ * argv parameter. All values should be passed as string (like argv,
no -- prefix)
+ * except for boolean that are optionally prefixed with no- and
psz_value remains NULL.
+ * Also note that real-time takes effect in COMMAND variables (those that have
+ * a callback). Types supported are INTEGER, BOOLEAN, STRING, FLOAT
+ *
+ * \param p_instance the instance
+ * \param psz_config configuration name (e.g. blur-factor )
+ * \param psz_value configuration value as a string or NULL on
boolean (e.g. 40 )
+ * \param b_lookVars this is a hack to also look for internal vars
(not exported to
+ * config) where psz_config is at the form "module-name". If you
don't know what
+ * this is set is to false
+ */
+VLC_PUBLIC_API void libvlc_config_update( libvlc_instance_t *, const
char *psz_config,
+ const char * psz_value, int b_lookVars, libvlc_exception_t
*p_exception );
+
+/**
* Try to start a user interface for the libvlc instance, and wait until the
* user exits.
*
diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h
index 36d46cb..bb53485 100644
--- a/include/vlc_configuration.h
+++ b/include/vlc_configuration.h
@@ -214,6 +214,7 @@ VLC_EXPORT( int, __config_SaveConfigFile, (
vlc_object_t *, const char * ) );
VLC_EXPORT( void, __config_ResetAll, ( vlc_object_t * ) );
VLC_EXPORT( module_config_t *, config_FindConfig,( vlc_object_t *,
const char * ) );
+VLC_EXPORT( char *, config_FindModuleName,( vlc_object_t *p_this,
const char *psz_name ) ) ;
VLC_EXPORT(const char *, config_GetDataDir, ( void ));
VLC_EXPORT(const char *, config_GetConfDir, ( void ) );
diff --git a/src/config/core.c b/src/config/core.c
index 3f6110e..749a693 100644
--- a/src/config/core.c
+++ b/src/config/core.c
@@ -447,6 +447,51 @@ module_config_t *config_FindConfig( vlc_object_t
*p_this, const char *psz_name )
}
/*****************************************************************************
+ * config_FindModule: find the module object associated with an option.
+ *****************************************************************************
+ * FIXME: This function really needs to be optimized. The same as
config_FindConfig
+ *****************************************************************************/
+char *config_FindModuleName( vlc_object_t *p_this, const char *psz_name )
+{
+ vlc_list_t *p_list;
+ int i_index;
+
+ if( !psz_name ) return NULL;
+
+ p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+
+ for( i_index = 0; i_index < p_list->i_count; i_index++ )
+ {
+ module_config_t *p_item, *p_end;
+ module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object;
+
+ if( !p_parser->i_config_items )
+ continue;
+
+ for( p_item = p_parser->p_config, p_end = p_item + p_parser->confsize;
+ p_item < p_end;
+ p_item++ )
+ {
+ if( p_item->i_type & CONFIG_HINT )
+ /* ignore hints */
+ continue;
+ if( !strcmp( psz_name, p_item->psz_name )
+ || ( p_item->psz_oldname
+ && !strcmp( psz_name, p_item->psz_oldname ) ) )
+ {
+ vlc_list_release( p_list );
+ char* psz_name = strdup( module_GetObjName( p_parser ) );
+ return psz_name;
+ }
+ }
+ }
+
+ vlc_list_release( p_list );
+
+ return NULL;
+}
+
+/*****************************************************************************
* config_Free: frees a duplicated module's configuration data.
*****************************************************************************
* This function frees all the data duplicated by config_Duplicate.
diff --git a/src/control/core.c b/src/control/core.c
index 7914c0f..744f2dc 100644
--- a/src/control/core.c
+++ b/src/control/core.c
@@ -30,6 +30,11 @@
#include <limits.h>
#include <assert.h>
+//#include <vlc_common.h>
+//#include "vlc_configuration.h"
+
+#include "config/configuration.h"
+
static const char nomemstr[] = "Insufficient memory";
/*************************************************************************
@@ -192,6 +197,98 @@ void libvlc_retain_internal_object(
libvlc_internal_t* p_object )
vlc_object_yield( p_object );
}
+void libvlc_config_update( libvlc_instance_t* p_instance, const char*
psz_config,
+ const char* psz_value, int b_lookVars, libvlc_exception_t *p_e )
+{
+ if (!psz_config || !*psz_config)
+ RAISEVOID( "Config name cannot be empty empty")
+
+ /* parse boolean and strip prefix */
+ bool i_yes = 1 ;
+ if( (!strncmp( psz_config, "no-", 3 ) && (psz_config = psz_config + 3) ) ||
+ (!strncmp( psz_config, "no", 2 ) && (psz_config = psz_config
+ 2 ) ) ) {
+ i_yes = 0;
+ }
+
+ char tbuf[2] ;
+ snprintf( tbuf ,2 , "%d", i_yes ); ;
+
+ /* Find the corresponing module object that holds that config var */
+ char* psz_moduleName =
+ config_FindModuleName( (vlc_object_t*) p_instance->p_libvlc_int,
psz_config );
+
+ if ( !psz_moduleName ) {
+ /* we didn't find it */
+
+ if (! b_lookVars )
+ RAISEVOID( "Config item %s does not belong to any module", psz_config );
+ /* If psz_config is not a config item and b_lookVars is true then we ASSUME
+ that it is an internal var name at the form "module-name" where module
+ is the internal module name. This is a hack to modify internal vars without
+ the need to export them at module config level. This could be
usefull to modify
+ internal vars for callback purposes to assync trigger module "events" */
+ char* p_dashoff = strchr( psz_config, '-' );
+ if ( ! p_dashoff )
+ RAISEVOID( "Config item %s does not belong to any module and has
not a valid object prefix", psz_config );
+ int i_dash = ( int ) (p_dashoff - psz_config) ;
+ psz_moduleName = malloc( i_dash + 1 ); // NULL + offset inc
+ strncpy( psz_moduleName, psz_config, i_dash );
+ psz_moduleName[ i_dash ] = '\0' ; // NULL terminate string
+ if (!psz_value) //assume boolean value
+ psz_value = (const char* ) &tbuf ;
+ msg_Dbg( (vlc_object_t*) p_instance->p_libvlc_int,
+ "config %s assumed to be bound to module %s (len=%d)",
psz_config, psz_moduleName, i_dash );
+ }
+ else {
+ module_config_t * p_conf =
+ config_FindConfig( (vlc_object_t*) p_instance->p_libvlc_int, psz_config );
+
+ /* Check if the option is deprecated */
+ if( !p_conf ) {
+ if (! b_lookVars )
+ RAISEVOID( "Config item %s does not belong to any module!", psz_config );
+ }
+ else {
+ if( p_conf->b_removed )
+ {
+ RAISEVOID( "Option %s is not supported anymore.", psz_config );
+ }
+ if( p_conf->psz_oldname
+ && !strcmp( p_conf->psz_oldname, psz_config ) )
+ {
+ msg_Warn( (vlc_object_t*) p_instance->p_libvlc_int, "Option %s
is obsolete. Use %s instead.",
+ psz_config, p_conf->psz_name );
+ }
+ }
+
+ /* Check boolean specific */
+ int i_type =
+ config_GetType((vlc_object_t*) p_instance->p_libvlc_int, psz_config ) ;
+ //int i_type = p_conf->i_type & CONFIG_ITEM ;
+ if( i_type != VLC_VAR_BOOL && psz_value == NULL )
+ {
+ free( psz_moduleName ) ;
+ RAISEVOID( "missing value for option %s", psz_config );
+ }
+ if ( i_type == VLC_VAR_BOOL ) {
+ psz_value = (const char* ) &tbuf ;
+ }
+ msg_Dbg( (vlc_object_t*) p_instance->p_libvlc_int,
+ "config %s bound to module %s", psz_config, psz_moduleName );
+ }
+
+ char* psz_err ;
+ int i_ret = var_Command( (vlc_object_t*) p_instance->p_libvlc_int,
psz_moduleName, psz_config,
+ psz_value, &psz_err ) ;
+
+ if ( i_ret != VLC_SUCCESS ) {
+ libvlc_exception_raise( p_e, psz_err );
+ }
+ else
+ msg_Dbg( (vlc_object_t*) p_instance->p_libvlc_int, psz_err ) ;
+ free( psz_err ) ;
+ free( psz_moduleName );
+}
void libvlc_add_intf( libvlc_instance_t *p_i, const char *name,
libvlc_exception_t *p_e )
@@ -228,3 +325,4 @@ const char * libvlc_get_changeset(void)
{
return VLC_Changeset();
}
+
diff --git a/src/libvlc.sym b/src/libvlc.sym
index 52dfb03..4e424a6 100644
--- a/src/libvlc.sym
+++ b/src/libvlc.sym
@@ -31,6 +31,7 @@ libvlc_get_vlc_id
libvlc_get_internal_object
libvlc_retain_internal_object
libvlc_release_internal_object
+libvlc_config_update
libvlc_log_clear
libvlc_log_close
libvlc_log_count
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 05acc07..73d70fb 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -52,6 +52,7 @@ config_ChainDestroy
__config_ChainParse
__config_ExistIntf
config_FindConfig
+config_FindModuleName
config_GetCacheDir
config_GetConfDir
config_GetDataDir
--
1.5.6.5
More information about the vlc-devel
mailing list