core.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * core.c: Core libvlc new API functions : initialization, exceptions handling
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  * $Id: e52a1a0023b93ca4d08052571436b9fa3d6694dc $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include "libvlc_internal.h"
  24. #include <vlc/libvlc.h>
  25. #include <vlc_interface.h>
  26. #include <vlc_vlm.h>
  27. #include <stdarg.h>
  28. #include <limits.h>
  29. #include <assert.h>
  30. static const char nomemstr[] = "Insufficient memory";
  31. /*************************************************************************
  32.  * Exceptions handling
  33.  *************************************************************************/
  34. void libvlc_exception_init( libvlc_exception_t *p_exception )
  35. {
  36.     p_exception->b_raised = 0;
  37.     p_exception->psz_message = NULL;
  38. }
  39. void libvlc_exception_clear( libvlc_exception_t *p_exception )
  40. {
  41.     if( NULL == p_exception )
  42.         return;
  43.     if( p_exception->psz_message != nomemstr )
  44.         free( p_exception->psz_message );
  45.     p_exception->psz_message = NULL;
  46.     p_exception->b_raised = 0;
  47. }
  48. int libvlc_exception_raised( const libvlc_exception_t *p_exception )
  49. {
  50.     return (NULL != p_exception) && p_exception->b_raised;
  51. }
  52. const char *
  53. libvlc_exception_get_message( const libvlc_exception_t *p_exception )
  54. {
  55.     if( p_exception->b_raised == 1 && p_exception->psz_message )
  56.     {
  57.         return p_exception->psz_message;
  58.     }
  59.     return NULL;
  60. }
  61. static void libvlc_exception_not_handled( const char *psz )
  62. {
  63.     fprintf( stderr, "*** LibVLC Exception not handled: %snSet a breakpoint in '%s' to debug.n",
  64.              psz, __func__ );
  65. }
  66. void libvlc_exception_raise( libvlc_exception_t *p_exception,
  67.                              const char *psz_format, ... )
  68. {
  69.     va_list args;
  70.     char * psz;
  71.     /* Unformat-ize the message */
  72.     va_start( args, psz_format );
  73.     if( vasprintf( &psz, psz_format, args ) == -1)
  74.         psz = (char *)nomemstr;
  75.     va_end( args );
  76.     /* Does caller care about exceptions ? */
  77.     if( p_exception == NULL ) {
  78.         /* Print something, so that lazy third-parties can easily
  79.          * notice that something may have gone unnoticedly wrong */
  80.         libvlc_exception_not_handled( psz );
  81.         if( psz != nomemstr )
  82.             free( psz );
  83.         return;
  84.     }
  85.     /* Make sure that there is no unnoticed previous exception */
  86.     if( p_exception->b_raised )
  87.     {
  88.         libvlc_exception_not_handled( p_exception->psz_message );
  89.         libvlc_exception_clear( p_exception );
  90.     }
  91.     p_exception->psz_message = psz;
  92.     p_exception->b_raised = 1;
  93. }
  94. libvlc_instance_t * libvlc_new( int argc, const char *const *argv,
  95.                                 libvlc_exception_t *p_e )
  96. {
  97.     libvlc_instance_t *p_new;
  98.     int i_ret;
  99.     libvlc_int_t *p_libvlc_int = libvlc_InternalCreate();
  100.     if( !p_libvlc_int ) RAISENULL( "VLC initialization failed" );
  101.     p_new = malloc( sizeof( libvlc_instance_t ) );
  102.     if( !p_new ) RAISENULL( "Out of memory" );
  103.     const char *my_argv[argc + 2];
  104.     my_argv[0] = "libvlc"; /* dummy arg0, skipped by getopt() et al */
  105.     for( int i = 0; i < argc; i++ )
  106.          my_argv[i + 1] = argv[i];
  107.     my_argv[argc + 1] = NULL; /* C calling conventions require a NULL */
  108.     /** todo Look for interface settings. If we don't have any, add -I dummy */
  109.     /* Because we probably don't want a GUI by default */
  110.     i_ret = libvlc_InternalInit( p_libvlc_int, argc + 1, my_argv );
  111.     if( i_ret )
  112.     {
  113.         libvlc_InternalDestroy( p_libvlc_int );
  114.         free( p_new );
  115.         if( i_ret == VLC_EEXITSUCCESS )
  116.             return NULL;
  117.         else
  118.             RAISENULL( "VLC initialization failed" );
  119.     }
  120.     p_new->p_libvlc_int = p_libvlc_int;
  121.     p_new->p_vlm = NULL;
  122.     p_new->b_playlist_locked = 0;
  123.     p_new->ref_count = 1;
  124.     p_new->verbosity = 1;
  125.     p_new->p_callback_list = NULL;
  126.     vlc_mutex_init(&p_new->instance_lock);
  127.     vlc_mutex_init(&p_new->event_callback_lock);
  128.     return p_new;
  129. }
  130. void libvlc_retain( libvlc_instance_t *p_instance )
  131. {
  132.     assert( p_instance != NULL );
  133.     assert( p_instance->ref_count < UINT_MAX );
  134.     vlc_mutex_lock( &p_instance->instance_lock );
  135.     p_instance->ref_count++;
  136.     vlc_mutex_unlock( &p_instance->instance_lock );
  137. }
  138. void libvlc_release( libvlc_instance_t *p_instance )
  139. {
  140.     vlc_mutex_t *lock = &p_instance->instance_lock;
  141.     int refs;
  142.     assert( p_instance->ref_count > 0 );
  143.     vlc_mutex_lock( lock );
  144.     refs = --p_instance->ref_count;
  145.     vlc_mutex_unlock( lock );
  146.     if( refs == 0 )
  147.     {
  148.         vlc_mutex_destroy( lock );
  149.         vlc_mutex_destroy( &p_instance->event_callback_lock );
  150.         if( p_instance->p_vlm )
  151.             vlm_Delete( p_instance->p_vlm );
  152.         libvlc_InternalCleanup( p_instance->p_libvlc_int );
  153.         libvlc_InternalDestroy( p_instance->p_libvlc_int );
  154.         free( p_instance );
  155.     }
  156. }
  157. void libvlc_add_intf( libvlc_instance_t *p_i, const char *name,
  158.                       libvlc_exception_t *p_e )
  159. {
  160.     if( libvlc_InternalAddIntf( p_i->p_libvlc_int, name ) )
  161.         RAISEVOID( "Interface initialization failed" );
  162. }
  163. void libvlc_wait( libvlc_instance_t *p_i )
  164. {
  165.     libvlc_int_t *p_libvlc = p_i->p_libvlc_int;
  166.     libvlc_InternalWait( p_libvlc );
  167. }
  168. int libvlc_get_vlc_id( libvlc_instance_t *p_instance )
  169. {
  170.     assert( p_instance );
  171.     return 1;
  172. }
  173. const char * libvlc_get_version(void)
  174. {
  175.     return VLC_Version();
  176. }
  177. const char * libvlc_get_compiler(void)
  178. {
  179.     return VLC_Compiler();
  180. }
  181. const char * libvlc_get_changeset(void)
  182. {
  183.     return "exported";
  184. }
  185. /* export internal libvlc_instance for ugly hacks with libvlccore */
  186. vlc_object_t *libvlc_get_vlc_instance( libvlc_instance_t* p_instance )
  187. {
  188.     vlc_object_hold( p_instance->p_libvlc_int ) ;
  189.     return (vlc_object_t*) p_instance->p_libvlc_int ;
  190. }
  191. void libvlc_free( void *ptr )
  192. {
  193.     free( ptr );
  194. }