vlc.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:6k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * vlc.c: the vlc player
  3.  *****************************************************************************
  4.  * Copyright (C) 1998-2004 VideoLAN
  5.  * $Id: vlc.c 9292 2004-11-12 10:44:50Z gbazin $
  6.  *
  7.  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  8.  *          Samuel Hocevar <sam@zoy.org>
  9.  *          Gildas Bazin <gbazin@videolan.org>
  10.  *          Derk-Jan Hartman <hartman at videolan dot org>
  11.  *          Lots of other people, see the libvlc AUTHORS file
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2 of the License, or
  16.  * (at your option) any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; if not, write to the Free Software
  25.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  26.  *****************************************************************************/
  27. #include "config.h"
  28. #include <stdio.h>                                              /* fprintf() */
  29. #include <stdlib.h>                                  /* putenv(), strtol(),  */
  30. #ifdef HAVE_SIGNAL_H
  31. #   include <signal.h>                            /* SIGHUP, SIGINT, SIGKILL */
  32. #endif
  33. #ifdef HAVE_TIME_H
  34. #   include <time.h>                                               /* time() */
  35. #endif
  36. #include <vlc/vlc.h>
  37. /*****************************************************************************
  38.  * Local prototypes.
  39.  *****************************************************************************/
  40. #if !defined(WIN32) && !defined(UNDER_CE)
  41. static void SigHandler  ( int i_signal );
  42. #endif
  43. /*****************************************************************************
  44.  * main: parse command line, start interface and spawn threads.
  45.  *****************************************************************************/
  46. int main( int i_argc, char *ppsz_argv[] )
  47. {
  48.     int i_ret;
  49. #ifndef SYS_DARWIN
  50.     /* This clutters OSX GUI error logs */
  51.     fprintf( stderr, "VLC media player %sn", VLC_Version() );
  52. #endif
  53. #ifdef HAVE_PUTENV
  54. #   ifdef DEBUG
  55.     /* Activate malloc checking routines to detect heap corruptions. */
  56.     putenv( "MALLOC_CHECK_=2" );
  57.     /* Disable the ugly Gnome crash dialog so that we properly segfault */
  58.     putenv( "GNOME_DISABLE_CRASH_DIALOG=1" );
  59. #   endif
  60.     /* If the user isn't using VLC_VERBOSE, set it to 0 by default */
  61.     if( getenv( "VLC_VERBOSE" ) == NULL )
  62.     {
  63.         putenv( "VLC_VERBOSE=0" );
  64.     }
  65. #endif
  66.     /* Create a libvlc structure */
  67.     i_ret = VLC_Create();
  68.     if( i_ret < 0 )
  69.     {
  70.         return i_ret;
  71.     }
  72. #if !defined(WIN32) && !defined(UNDER_CE)
  73.     /* Set the signal handlers. SIGTERM is not intercepted, because we need at
  74.      * least one method to kill the program when all other methods failed, and
  75.      * when we don't want to use SIGKILL.
  76.      * Note that we set the signals after the vlc_create call. */
  77.     signal( SIGINT,  SigHandler );
  78.     signal( SIGHUP,  SigHandler );
  79.     signal( SIGQUIT, SigHandler );
  80.     /* Other signals */
  81.     signal( SIGALRM, SIG_IGN );
  82.     signal( SIGPIPE, SIG_IGN );
  83. #endif
  84.     /* Initialize libvlc */
  85.     i_ret = VLC_Init( 0, i_argc, ppsz_argv );
  86.     if( i_ret < 0 )
  87.     {
  88.         VLC_Destroy( 0 );
  89.         return i_ret;
  90.     }
  91.     i_ret = VLC_AddIntf( 0, NULL, VLC_TRUE, VLC_TRUE );
  92.     /* Finish the threads */
  93.     VLC_CleanUp( 0 );
  94.     /* Destroy the libvlc structure */
  95.     VLC_Destroy( 0 );
  96.     return i_ret;
  97. }
  98. #if !defined(WIN32) && !defined(UNDER_CE)
  99. /*****************************************************************************
  100.  * SigHandler: system signal handler
  101.  *****************************************************************************
  102.  * This function is called when a fatal signal is received by the program.
  103.  * It tries to end the program in a clean way.
  104.  *****************************************************************************/
  105. static void SigHandler( int i_signal )
  106. {
  107.     static time_t abort_time = 0;
  108.     static volatile vlc_bool_t b_die = VLC_FALSE;
  109.     /* Once a signal has been trapped, the termination sequence will be
  110.      * armed and subsequent signals will be ignored to avoid sending signals
  111.      * to a libvlc structure having been destroyed */
  112.     if( !b_die )
  113.     {
  114.         b_die = VLC_TRUE;
  115.         abort_time = time( NULL );
  116.         fprintf( stderr, "signal %d received, terminating vlc - do it "
  117.                          "again in case it gets stuckn", i_signal );
  118.         /* Acknowledge the signal received */
  119.         VLC_Die( 0 );
  120.     }
  121.     else if( time( NULL ) > abort_time + 2 )
  122.     {
  123.         /* If user asks again 1 or 2 seconds later, die badly */
  124.         signal( SIGINT,  SIG_DFL );
  125.         signal( SIGHUP,  SIG_DFL );
  126.         signal( SIGQUIT, SIG_DFL );
  127.         signal( SIGALRM, SIG_DFL );
  128.         signal( SIGPIPE, SIG_DFL );
  129.         fprintf( stderr, "user insisted too much, dying badlyn" );
  130.         abort();
  131.     }
  132. }
  133. #endif
  134. #if defined(UNDER_CE)
  135. #include "vlc_common.h"
  136. /*****************************************************************************
  137.  * WinMain: parse command line, start interface and spawn threads. (WinCE only)
  138.  *****************************************************************************/
  139. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  140.                     LPTSTR lpCmdLine, int nCmdShow )
  141. {
  142.     char **argv, psz_cmdline[MAX_PATH];
  143.     int argc, i_ret;
  144.     WideCharToMultiByte( CP_ACP, 0, lpCmdLine, -1,
  145.                          psz_cmdline, MAX_PATH, NULL, NULL );
  146.     argv = vlc_parse_cmdline( psz_cmdline, &argc );
  147.     argv = realloc( argv, (argc + 1) * sizeof(char *) );
  148.     if( !argv ) return -1;
  149.     if( argc ) memmove( argv + 1, argv, argc * sizeof(char *) );
  150.     argv[0] = ""; /* Fake program path */
  151.     i_ret = main( argc + 1, argv );
  152.     /* No need to free the argv memory */
  153.     return i_ret;
  154. }
  155. #endif