]> git.sesse.net Git - vlc/blobdiff - src/libvlc.c
* ./ipkg/Makefile.am: added missing files to the distribution.
[vlc] / src / libvlc.c
index 4439ed00ec5e6a86f3a46aafa0dcb856c6242a1b..4fa06feb26340a458d529c16cb2c84ef9f6d980f 100644 (file)
@@ -2,7 +2,7 @@
  * libvlc.c: main libvlc source
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.c,v 1.46 2002/11/10 23:41:53 sam Exp $
+ * $Id: libvlc.c,v 1.53 2002/12/14 19:43:25 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -255,6 +255,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     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";
@@ -268,6 +269,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         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;
     }
 
@@ -276,7 +278,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     /* Check for short help option */
     if( config_GetInt( p_vlc, "help" ) )
     {
-        fprintf( stderr, _("Usage: %s [options] [items]...\n\n"),
+        fprintf( stdout, _("Usage: %s [options] [items]...\n\n"),
                          p_vlc->psz_object_name );
         Usage( p_vlc, "main" );
         Usage( p_vlc, "help" );
@@ -298,6 +300,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         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;
     }
 
@@ -345,6 +348,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     if( b_exit )
     {
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EEXIT;
     }
 
@@ -367,6 +371,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         getchar();
 #endif
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -474,6 +479,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
             module_Unneed( p_vlc, p_vlc->p_memcpy_module );
         }
         //module_EndBank( p_vlc );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -482,6 +488,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
      */
     GetFilenames( p_vlc, i_argc, ppsz_argv );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -528,6 +535,7 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
     if( p_intf == NULL )
     {
         msg_Err( p_vlc, "interface initialization failed" );
+        if( i_object ) vlc_object_release( p_vlc );
         return VLC_EGENERIC;
     }
 
@@ -538,9 +546,11 @@ int VLC_AddIntf( int i_object, char const *psz_module, vlc_bool_t b_block )
     {
         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;
 }
 
@@ -604,6 +614,7 @@ int VLC_Destroy( int i_object )
     /* Stop thread system: last one out please shut the door! */
     vlc_threads_end( &libvlc );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -626,6 +637,7 @@ int VLC_Die( int i_object )
 
     p_vlc->b_die = VLC_TRUE;
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -657,6 +669,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 
         if( p_playlist == NULL )
         {
+            if( i_object ) vlc_object_release( p_vlc );
             return VLC_EGENERIC;
         }
 
@@ -667,6 +680,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 
     vlc_object_release( p_playlist );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return i_err;
 }
 
@@ -678,6 +692,7 @@ int VLC_AddTarget( int i_object, char const *psz_target, int i_mode, int i_pos )
 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;
 
@@ -712,11 +727,15 @@ int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
                     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;
 }
 
 /*****************************************************************************
@@ -727,6 +746,7 @@ int VLC_Set( int i_object, char const *psz_var, vlc_value_t value )
 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;
 
@@ -735,7 +755,10 @@ int VLC_Get( int i_object, char const *psz_var, vlc_value_t *p_value )
         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 */
@@ -755,11 +778,21 @@ int VLC_Play( int i_object )
     {
         return VLC_ENOOBJ;
     }
+    
+    /* add pseudo sap interface; non blocking */
+    if( config_GetInt( p_vlc, "sap" ) )
+    {
+        msg_Dbg( p_vlc, "adding sap interface" );
+        VLC_AddIntf( 0, "sap", VLC_FALSE );
+    }
+
+    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;
     }
 
@@ -776,6 +809,7 @@ int VLC_Play( int i_object )
 
     vlc_object_release( p_playlist );
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -830,7 +864,7 @@ int VLC_Stop( int i_object )
     {
         vlc_object_detach( p_vout );
         vlc_object_release( p_vout );
-        vout_DestroyThread( p_vout );
+        vout_Destroy( p_vout );
     }
 
     /*
@@ -844,6 +878,7 @@ int VLC_Stop( int i_object )
         aout_Delete( p_aout );
     }
 
+    if( i_object ) vlc_object_release( p_vlc );
     return VLC_SUCCESS;
 }
 
@@ -866,12 +901,14 @@ int VLC_Pause( int i_object )
 
     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;
 }
 
@@ -894,12 +931,14 @@ int VLC_FullScreen( int i_object )
 
     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;
 }
 
@@ -996,11 +1035,12 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
      */
 #define LINE_START 8
 #define PADDING_SPACES 25
-    vlc_list_t *p_list;
-    module_t **pp_parser;
+    vlc_list_t list;
+    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';
@@ -1012,31 +1052,31 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
 #endif
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    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 < list.i_count; i_index++ )
     {
         vlc_bool_t b_help_module;
 
+        p_parser = (module_t *)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++ )
         {
@@ -1048,7 +1088,7 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
             {
             case CONFIG_HINT_CATEGORY:
             case CONFIG_HINT_USAGE:
-                fprintf( stderr, " %s\n", p_item->psz_text );
+                fprintf( stdout, " %s\n", p_item->psz_text );
                 break;
 
             case CONFIG_ITEM_STRING:
@@ -1151,13 +1191,13 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
                 if( p_item->i_type == CONFIG_ITEM_BOOL &&
                     !b_help_module )
                 {
-                    fprintf( stderr, psz_format, p_item->psz_name, psz_prefix,
+                    fprintf( stdout, psz_format, p_item->psz_name, psz_prefix,
                              p_item->psz_name, psz_bra, psz_type, psz_ket,
                              psz_spaces, p_item->psz_text, psz_suf );
                 }
                 else
                 {
-                    fprintf( stderr, psz_format, p_item->psz_name, "", "",
+                    fprintf( stdout, psz_format, p_item->psz_name, "", "",
                              psz_bra, psz_type, psz_ket, psz_spaces,
                              p_item->psz_text, psz_suf );
                 }
@@ -1171,10 +1211,10 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
     }
 
     /* Release the module list */
-    vlc_list_release( p_list );
+    vlc_list_release( &list );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-        fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
+        fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
         getchar();
 #endif
 }
@@ -1187,9 +1227,10 @@ static void Usage( vlc_t *p_this, char const *psz_module_name )
  *****************************************************************************/
 static void ListModules( vlc_t *p_this )
 {
-    vlc_list_t *p_list;
-    module_t **pp_parser;
+    vlc_list_t list;
+    module_t *p_parser;
     char psz_spaces[22];
+    int i_index;
 
     memset( psz_spaces, ' ', 22 );
 
@@ -1198,37 +1239,37 @@ static void ListModules( vlc_t *p_this )
 #endif
 
     /* Usage */
-    fprintf( stderr, _("Usage: %s [options] [items]...\n\n"),
+    fprintf( stdout, _("Usage: %s [options] [items]...\n\n"),
                      p_this->p_vlc->psz_object_name );
 
-    fprintf( stderr, _("[module]              [description]\n") );
+    fprintf( stdout, _("[module]              [description]\n") );
 
     /* List all modules */
-    p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+    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 < list.i_count; i_index++ )
     {
         int i;
 
+        p_parser = (module_t *)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( stderr, "  %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 );
+    vlc_list_release( &list );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-        fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
+        fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
         getchar();
 #endif
 }
@@ -1244,15 +1285,15 @@ static void Version( void )
     ShowConsole();
 #endif
 
-    fprintf( stderr, VERSION_MESSAGE "\n" );
-    fprintf( stderr,
+    fprintf( stdout, VERSION_MESSAGE "\n" );
+    fprintf( stdout,
       _("This program comes with NO WARRANTY, to the extent permitted by "
         "law.\nYou may redistribute it under the terms of the GNU General "
         "Public License;\nsee the file named COPYING for details.\n"
         "Written by the VideoLAN team at Ecole Centrale, Paris.\n") );
 
 #ifdef WIN32        /* Pause the console because it's destroyed when we exit */
-    fprintf( stderr, _("\nPress the RETURN key to continue...\n") );
+    fprintf( stdout, _("\nPress the RETURN key to continue...\n") );
     getchar();
 #endif
 }
@@ -1274,4 +1315,3 @@ static void ShowConsole( void )
     return;
 }
 #endif
-