* libvlc.c: main libvlc source
*****************************************************************************
* Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.c,v 1.47 2002/11/14 15:07:49 sigmunau Exp $
+ * $Id: libvlc.c,v 1.63 2003/02/06 23:59:40 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
msg_Dbg( &libvlc, COPYRIGHT_MESSAGE );
msg_Dbg( &libvlc, "libvlc was configured with %s", CONFIGURE_LINE );
- /* Initialize the module bank and load the configuration of the
- * main module. We need to do this at this stage to be able to display
- * a short help if required by the user. (short help == main module
- * options) */
- module_InitBank( &libvlc );
- module_LoadMain( &libvlc );
+ /* The module bank will be initialized later */
+ libvlc.p_module_bank = NULL;
libvlc.b_ready = VLC_TRUE;
}
{
char p_capabilities[200];
char * p_tmp;
- vlc_bool_t b_exit;
+ char * psz_modules;
+ char * psz_parser;
+ vlc_bool_t b_exit = VLC_FALSE;
vlc_t * p_vlc;
module_t *p_help_module;
playlist_t *p_playlist;
+ vlc_value_t lockval;
p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
return VLC_ENOOBJ;
}
- /*
- * Support for gettext
- */
- SetLanguage( "" );
-
/*
* System specific initialization code
*/
p_vlc->psz_object_name = "vlc";
}
+ /*
+ * Support for gettext
+ */
+ SetLanguage( "" );
+
+ /* Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
+ msg_Dbg( p_vlc, "translation test: code is \"%s\"", _("C") );
+
+ /* Initialize the module bank and load the configuration of the
+ * main module. We need to do this at this stage to be able to display
+ * a short help if required by the user. (short help == main module
+ * options) */
+ var_Create( &libvlc, "libvlc", VLC_VAR_MUTEX );
+ var_Get( &libvlc, "libvlc", &lockval );
+ vlc_mutex_lock( lockval.p_address );
+ if( libvlc.p_module_bank == NULL )
+ {
+ module_InitBank( &libvlc );
+ module_LoadMain( &libvlc );
+ }
+ vlc_mutex_unlock( lockval.p_address );
+ var_Destroy( &libvlc, "libvlc" );
+
/* Hack: insert the help module here */
p_help_module = vlc_object_create( p_vlc, VLC_OBJECT_MODULE );
if( p_help_module == NULL )
{
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
p_help_module->psz_object_name = "help";
config_Free( p_help_module );
vlc_object_destroy( p_help_module );
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
- b_exit = VLC_FALSE;
-
/* Check for short help option */
if( config_GetInt( p_vlc, "help" ) )
{
config_Free( p_help_module );
vlc_object_destroy( p_help_module );
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EEXIT;
}
if( b_exit )
{
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EEXIT;
}
getchar();
#endif
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
module_Unneed( p_vlc, p_vlc->p_memcpy_module );
}
//module_EndBank( p_vlc );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
+ /*
+ * Load background interfaces
+ */
+ psz_modules = config_GetPsz( p_vlc, "extraintf" );
+ psz_parser = psz_modules;
+ while ( psz_parser && *psz_parser )
+ {
+ char *psz_module;
+ psz_module = psz_parser;
+ psz_parser = strchr( psz_module, ',' );
+ if ( psz_parser )
+ {
+ *psz_parser = '\0';
+ psz_parser++;
+ }
+ VLC_AddIntf( 0, psz_module, VLC_FALSE );
+ }
+ if ( psz_modules )
+ {
+ free( psz_modules );
+ }
+
+ /*
+ * FIXME: kludge to use a p_vlc-local variable for the Mozilla plugin
+ */
+ var_Create( p_vlc, "drawable", VLC_VAR_INTEGER );
+
/*
* Get input filenames given as commandline arguments
*/
GetFilenames( p_vlc, i_argc, ppsz_argv );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
int i_err;
intf_thread_t *p_intf;
vlc_t *p_vlc;
- char *psz_oldmodule = NULL;
p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
return VLC_ENOOBJ;
}
- if( psz_module )
- {
- psz_oldmodule = config_GetPsz( p_vlc, "intf" );
- config_PutPsz( p_vlc, "intf", psz_module );
- }
-
/* Try to create the interface */
- p_intf = intf_Create( p_vlc );
-
- if( psz_module )
- {
- config_PutPsz( p_vlc, "intf", psz_oldmodule );
- if( psz_oldmodule )
- {
- free( psz_oldmodule );
- }
- }
+ p_intf = intf_Create( p_vlc, psz_module ? psz_module : "$intf" );
if( p_intf == NULL )
{
msg_Err( p_vlc, "interface initialization failed" );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
{
vlc_object_detach( p_intf );
intf_Destroy( p_intf );
+ if( i_object ) vlc_object_release( p_vlc );
return i_err;
}
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
{
network_ChannelJoin( p_vlc, COMMON_CHANNEL );
}
-
+
/*
* Free allocated memory
*/
* XXX: Free module bank !
*/
//module_EndBank( p_vlc );
-
+
/*
* System specific cleaning code
*/
system_End( p_vlc );
-
+
/* Destroy mutexes */
vlc_mutex_destroy( &p_vlc->config_lock );
vlc_object_detach( p_vlc );
+ /* Release object before destroying it */
+ if( i_object ) vlc_object_release( p_vlc );
+
vlc_object_destroy( p_vlc );
/* Stop thread system: last one out please shut the door! */
p_vlc->b_die = VLC_TRUE;
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
if( p_playlist == NULL )
{
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_EGENERIC;
}
vlc_object_release( p_playlist );
+ if( i_object ) vlc_object_release( p_vlc );
return i_err;
}
int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
{
vlc_t *p_vlc;
+ int i_ret;
p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
config_PutPsz( p_vlc, psz_newvar, value.psz_string );
break;
}
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
}
- return var_Set( p_vlc, psz_var, value );
+ i_ret = var_Set( p_vlc, psz_var, value );
+
+ if( i_object ) vlc_object_release( p_vlc );
+ return i_ret;
}
/*****************************************************************************
int VLC_Get( int i_object, char const *psz_var, vlc_value_t *p_value )
{
vlc_t *p_vlc;
+ int i_ret;
p_vlc = i_object ? vlc_object_get( &libvlc, i_object ) : p_static_vlc;
return VLC_ENOOBJ;
}
- return var_Get( p_vlc, psz_var, p_value );
+ i_ret = var_Get( p_vlc, psz_var, p_value );
+
+ if( i_object ) vlc_object_release( p_vlc );
+ return i_ret;
}
/* FIXME: temporary hacks */
return VLC_ENOOBJ;
}
+ vlc_thread_set_priority( p_vlc, VLC_THREAD_PRIORITY_LOW );
+
p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
if( !p_playlist )
{
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_ENOOBJ;
}
vlc_object_release( p_playlist );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
{
vlc_object_detach( p_vout );
vlc_object_release( p_vout );
- vout_DestroyThread( p_vout );
+ vout_Destroy( p_vout );
}
/*
aout_Delete( p_aout );
}
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
if( !p_input )
{
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_ENOOBJ;
}
input_SetStatus( p_input, INPUT_STATUS_PAUSE );
vlc_object_release( p_input );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
if( !p_vout )
{
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_ENOOBJ;
}
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
vlc_object_release( p_vout );
+ if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
#if defined( ENABLE_NLS ) \
&& ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) )
+ char * psz_path;
+#ifdef SYS_DARWIN
+ char psz_tmp[1024];
+#endif
+
# if defined( HAVE_INCLUDED_GETTEXT ) && !defined( HAVE_LC_MESSAGES )
if( *psz_lang )
{
setlocale( LC_CTYPE, psz_lang );
/* Specify where to find the locales for current domain */
- if( !bindtextdomain( PACKAGE, LOCALEDIR ) )
+#ifndef SYS_DARWIN
+ psz_path = LOCALEDIR;
+#else
+ snprintf( psz_tmp, sizeof(psz_tmp), "%s/%s", libvlc.psz_vlcpath,
+ "locale" );
+ psz_path = psz_tmp;
+#endif
+ if( !bindtextdomain( PACKAGE, psz_path ) )
{
fprintf( stderr, "warning: no domain %s in directory %s\n",
- PACKAGE, LOCALEDIR );
+ PACKAGE, psz_path );
}
/* Set the default domain */
#define LINE_START 8
#define PADDING_SPACES 25
vlc_list_t *p_list;
- module_t **pp_parser;
+ module_t *p_parser;
module_config_t *p_item;
char psz_spaces[PADDING_SPACES+LINE_START+1];
char psz_format[sizeof(FORMAT_STRING)];
+ int i_index;
memset( psz_spaces, ' ', PADDING_SPACES+LINE_START );
psz_spaces[PADDING_SPACES+LINE_START] = '\0';
p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
/* Enumerate the config for each module */
- for( pp_parser = (module_t **)p_list->pp_objects ;
- *pp_parser ;
- pp_parser++ )
+ for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
vlc_bool_t b_help_module;
+ p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+
if( psz_module_name && strcmp( psz_module_name,
- (*pp_parser)->psz_object_name ) )
+ p_parser->psz_object_name ) )
{
continue;
}
/* Ignore modules without config options */
- if( !(*pp_parser)->i_config_items )
+ if( !p_parser->i_config_items )
{
continue;
}
- b_help_module = !strcmp( "help", (*pp_parser)->psz_object_name );
+ b_help_module = !strcmp( "help", p_parser->psz_object_name );
/* Print module options */
- for( p_item = (*pp_parser)->p_config;
+ for( p_item = p_parser->p_config;
p_item->i_type != CONFIG_HINT_END;
p_item++ )
{
static void ListModules( vlc_t *p_this )
{
vlc_list_t *p_list;
- module_t **pp_parser;
+ module_t *p_parser;
char psz_spaces[22];
+ int i_index;
memset( psz_spaces, ' ', 22 );
p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
/* Enumerate each module */
- for( pp_parser = (module_t **)p_list->pp_objects ;
- *pp_parser ;
- pp_parser++ )
+ for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
int i;
+ p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+
/* Nasty hack, but right now I'm too tired to think about a nice
* solution */
- i = 22 - strlen( (*pp_parser)->psz_object_name ) - 1;
+ i = 22 - strlen( p_parser->psz_object_name ) - 1;
if( i < 0 ) i = 0;
psz_spaces[i] = 0;
- fprintf( stdout, " %s%s %s\n", (*pp_parser)->psz_object_name,
- psz_spaces, (*pp_parser)->psz_longname );
+ fprintf( stdout, " %s%s %s\n", p_parser->psz_object_name,
+ psz_spaces, p_parser->psz_longname );
psz_spaces[i] = ' ';
}
vlc_list_release( p_list );
#ifdef WIN32 /* Pause the console because it's destroyed when we exit */
- fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
- getchar();
+ fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
+ getchar();
#endif
}
return;
}
#endif
-