X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=cff3784c1660d59886f8ce6e58967df8811a4fbc;hb=98748a4a98cefe26451a93b6deb646dbdb8d4366;hp=71e7faf484946117a60e20c980cf611f324b526f;hpb=9ff28119bcd7a610bd9859a8f49b4635443df784;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index 71e7faf484..cff3784c16 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -42,6 +42,7 @@ #include "modules/modules.h" #include "config/configuration.h" +#include "playlist/preparser.h" #include /* sprintf() */ #include @@ -77,30 +78,20 @@ #include -/***************************************************************************** - * The evil global variables. We handle them with care, don't worry. - *****************************************************************************/ - -#if !defined(_WIN32) && !defined(__OS2__) -static bool b_daemon = false; -#endif - /***************************************************************************** * Local prototypes *****************************************************************************/ static void GetFilenames ( libvlc_int_t *, unsigned, const char *const [] ); /** - * Allocate a libvlc instance, initialize global data if needed - * It also initializes the threading system + * Allocate a blank libvlc instance, also setting the exit handler. + * Vlc's threading system must have been initialized first */ libvlc_int_t * libvlc_InternalCreate( void ) { libvlc_int_t *p_libvlc; libvlc_priv_t *priv; - /* Now that the thread system is initialized, we don't have much, but - * at least we have variables */ /* Allocate a libvlc instance object */ p_libvlc = vlc_custom_create( (vlc_object_t *)NULL, sizeof (*priv), "libvlc" ); @@ -108,7 +99,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) return NULL; priv = libvlc_priv (p_libvlc); - priv->p_playlist = NULL; + priv->playlist = NULL; priv->p_dialog_provider = NULL; priv->p_vlm = NULL; @@ -137,6 +128,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* System specific initialization code */ system_Init(); + vlc_LogPreinit(p_libvlc); + /* Initialize the module bank and load the configuration of the * core module. We need to do this at this stage to be able to display * a short help if required by the user. (short help == core module @@ -150,7 +143,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, return VLC_EGENERIC; } - vlc_LogInit (p_libvlc); vlc_threads_setup (p_libvlc); /* Load the builtins and plugins into the module_bank. @@ -176,11 +168,13 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, int vlc_optind; if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, &vlc_optind ) ) { - module_EndBank (true); vlc_LogDeinit (p_libvlc); + module_EndBank (true); return VLC_EGENERIC; } + vlc_LogInit(p_libvlc); + /* * Support for gettext */ @@ -200,8 +194,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( module_count <= 1 ) { msg_Err( p_libvlc, "No plugins found! Check your VLC installation."); - module_EndBank (true); vlc_LogDeinit (p_libvlc); + module_EndBank (true); return VLC_ENOMOD; } @@ -209,38 +203,35 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, /* Check for daemon mode */ if( var_InheritBool( p_libvlc, "daemon" ) ) { - char *psz_pidfile = NULL; - if( daemon( 1, 0) != 0 ) { msg_Err( p_libvlc, "Unable to fork vlc to daemon mode" ); - module_EndBank (true); vlc_LogDeinit (p_libvlc); + module_EndBank (true); return VLC_ENOMEM; } - b_daemon = true; /* lets check if we need to write the pidfile */ - psz_pidfile = var_CreateGetNonEmptyString( p_libvlc, "pidfile" ); - if( psz_pidfile != NULL ) + char *pidfile = var_InheritString( p_libvlc, "pidfile" ); + if( pidfile != NULL ) { - FILE *pidfile; - pid_t i_pid = getpid (); - msg_Dbg( p_libvlc, "PID is %d, writing it to %s", - i_pid, psz_pidfile ); - pidfile = vlc_fopen( psz_pidfile,"w" ); - if( pidfile != NULL ) + FILE *stream = vlc_fopen( pidfile, "w" ); + if( stream != NULL ) { - utf8_fprintf( pidfile, "%d", (int)i_pid ); - fclose( pidfile ); + fprintf( stream, "%d", (int)getpid() ); + fclose( stream ); + msg_Dbg( p_libvlc, "written PID file %s", pidfile ); } else - { - msg_Err( p_libvlc, "cannot open pid file %s for writing: %s", - psz_pidfile, vlc_strerror_c(errno) ); - } + msg_Err( p_libvlc, "cannot write PID file %s: %s", + pidfile, vlc_strerror_c(errno) ); + free( pidfile ); } - free( psz_pidfile ); + } + else + { + var_Create( p_libvlc, "pidfile", VLC_VAR_STRING ); + var_SetString( p_libvlc, "pidfile", "" ); } #endif @@ -367,6 +358,11 @@ dbus_out: */ priv->actions = vlc_InitActions( p_libvlc ); + /* + * Meta data handling + */ + priv->parser = playlist_preparser_New(VLC_OBJECT(p_libvlc)); + /* Create a variable for showing the fullscreen interface */ var_Create( p_libvlc, "intf-toggle-fscontrol", VLC_VAR_BOOL ); var_SetBool( p_libvlc, "intf-toggle-fscontrol", true ); @@ -452,41 +448,15 @@ dbus_out: } if( asprintf( &psz_temp, "%s,none", psz_module ) != -1) { - intf_Create( p_libvlc, psz_temp ); + libvlc_InternalAddIntf( p_libvlc, psz_temp ); free( psz_temp ); } } free( psz_modules ); free( psz_control ); - if( var_InheritBool( p_libvlc, "file-logging" ) -#ifdef HAVE_SYSLOG_H - && !var_InheritBool( p_libvlc, "syslog" ) -#endif - ) - { - intf_Create( p_libvlc, "logger,none" ); - } -#ifdef HAVE_SYSLOG_H - if( var_InheritBool( p_libvlc, "syslog" ) ) - { - char *logmode = var_CreateGetNonEmptyString( p_libvlc, "logmode" ); - var_SetString( p_libvlc, "logmode", "syslog" ); - intf_Create( p_libvlc, "logger,none" ); - - if( logmode ) - { - var_SetString( p_libvlc, "logmode", logmode ); - free( logmode ); - } - var_Destroy( p_libvlc, "logmode" ); - } -#endif - if( var_InheritBool( p_libvlc, "network-synchronisation") ) - { - intf_Create( p_libvlc, "netsync,none" ); - } + libvlc_InternalAddIntf( p_libvlc, "netsync,none" ); #ifdef __APPLE__ var_Create( p_libvlc, "drawable-view-top", VLC_VAR_INTEGER ); @@ -499,9 +469,6 @@ dbus_out: var_Create( p_libvlc, "drawable-clip-right", VLC_VAR_INTEGER ); var_Create( p_libvlc, "drawable-nsobject", VLC_VAR_ADDRESS ); #endif -#if defined (_WIN32) || defined (__OS2__) - var_Create( p_libvlc, "drawable-hwnd", VLC_VAR_INTEGER ); -#endif /* * Get input filenames given as commandline arguments. @@ -516,8 +483,7 @@ dbus_out: psz_val = var_InheritString( p_libvlc, "open" ); if ( psz_val != NULL ) { - playlist_AddExt( pl_Get(p_libvlc), psz_val, NULL, PLAYLIST_INSERT, 0, - -1, 0, NULL, 0, true, pl_Unlocked ); + intf_InsertItem( p_libvlc, psz_val, 0, NULL, 0 ); free( psz_val ); } @@ -545,32 +511,21 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif - /* Free playlist now, all threads are gone */ - playlist_t *p_playlist = libvlc_priv (p_libvlc)->p_playlist; - if( p_playlist != NULL ) - playlist_Destroy( p_playlist ); - - msg_Dbg( p_libvlc, "removing stats" ); - #if !defined( _WIN32 ) && !defined( __OS2__ ) - char* psz_pidfile = NULL; - - if( b_daemon ) + char *pidfile = var_InheritString( p_libvlc, "pidfile" ); + if( pidfile != NULL ) { - psz_pidfile = var_CreateGetNonEmptyString( p_libvlc, "pidfile" ); - if( psz_pidfile != NULL ) - { - msg_Dbg( p_libvlc, "removing pid file %s", psz_pidfile ); - if( unlink( psz_pidfile ) == -1 ) - { - msg_Dbg( p_libvlc, "removing pid file %s: %s", - psz_pidfile, vlc_strerror_c(errno) ); - } - } - free( psz_pidfile ); + msg_Dbg( p_libvlc, "removing PID file %s", pidfile ); + if( unlink( pidfile ) ) + msg_Warn( p_libvlc, "cannot remove PID file %s: %s", + pidfile, vlc_strerror_c(errno) ); + free( pidfile ); } #endif + if (priv->parser != NULL) + playlist_preparser_Delete(priv->parser); + vlc_DeinitActions( p_libvlc, priv->actions ); /* Save the configuration */ @@ -578,8 +533,8 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) config_AutoSaveConfigFile( VLC_OBJECT(p_libvlc) ); /* Free module bank. It is refcounted, so we call this each time */ - module_EndBank (true); vlc_LogDeinit (p_libvlc); + module_EndBank (true); #if defined(_WIN32) || defined(__OS2__) system_End( ); #endif @@ -602,42 +557,6 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) vlc_object_release( p_libvlc ); } -/** - * Add an interface plugin and run it - */ -int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) -{ - if( !p_libvlc ) - return VLC_EGENERIC; - - if( !psz_module ) /* requesting the default interface */ - { - char *psz_interface = var_CreateGetNonEmptyString( p_libvlc, "intf" ); - if( !psz_interface ) /* "intf" has not been set */ - { -#if !defined( _WIN32 ) && !defined( __OS2__ ) - if( b_daemon ) - /* Daemon mode hack. - * We prefer the dummy interface if none is specified. */ - psz_module = "dummy"; - else -#endif - msg_Info( p_libvlc, "%s", - _("Running vlc with the default interface. " - "Use 'cvlc' to use vlc without interface.") ); - } - free( psz_interface ); - var_Destroy( p_libvlc, "intf" ); - } - - /* Try to create the interface */ - int ret = intf_Create( p_libvlc, psz_module ? psz_module : "$intf" ); - if( ret ) - msg_Err( p_libvlc, "interface \"%s\" initialization failed", - psz_module ? psz_module : "default" ); - return ret; -} - /***************************************************************************** * GetFilenames: parse command line options which are not flags ***************************************************************************** @@ -670,10 +589,41 @@ static void GetFilenames( libvlc_int_t *p_vlc, unsigned n, continue; } - playlist_AddExt( pl_Get( p_vlc ), (mrl != NULL) ? mrl : args[n], NULL, - PLAYLIST_INSERT, 0, -1, i_options, + intf_InsertItem( p_vlc, (mrl != NULL) ? mrl : args[n], i_options, ( i_options ? &args[n + 1] : NULL ), - VLC_INPUT_OPTION_TRUSTED, true, pl_Unlocked ); + VLC_INPUT_OPTION_TRUSTED ); free( mrl ); } } + +/** + * Requests extraction of the meta data for an input item (a.k.a. preparsing). + * The actual extraction is asynchronous. + */ +int libvlc_MetaRequest(libvlc_int_t *libvlc, input_item_t *item, + input_item_meta_request_option_t i_options) +{ + libvlc_priv_t *priv = libvlc_priv(libvlc); + + if (unlikely(priv->parser == NULL)) + return VLC_ENOMEM; + + playlist_preparser_Push(priv->parser, item, i_options); + return VLC_SUCCESS; +} + +/** + * Requests retrieving/downloading art for an input item. + * The retrieval is performed asynchronously. + */ +int libvlc_ArtRequest(libvlc_int_t *libvlc, input_item_t *item, + input_item_meta_request_option_t i_options) +{ + libvlc_priv_t *priv = libvlc_priv(libvlc); + + if (unlikely(priv->parser == NULL)) + return VLC_ENOMEM; + + playlist_preparser_fetcher_Push(priv->parser, item, i_options); + return VLC_SUCCESS; +}