X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fvlm.c;h=0bc74afded1e366780609ba989f287aa895744d4;hb=9d3c74196326f8f81dbb8929bd7b58903c75011c;hp=72779c8eddf44002fa0782d24a287ef6943914e0;hpb=4ea25c4d8b32bcd9e76e996bc55e272dec2eddf5;p=vlc diff --git a/src/misc/vlm.c b/src/misc/vlm.c index 72779c8edd..0bc74afded 100644 --- a/src/misc/vlm.c +++ b/src/misc/vlm.c @@ -1,7 +1,7 @@ /***************************************************************************** * vlm.c: VLM interface plugin ***************************************************************************** - * Copyright (C) 2000, 2001 the VideoLAN team + * Copyright (C) 2000-2005 the VideoLAN team * $Id$ * * Authors: Simon Latapie @@ -20,7 +20,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -41,8 +41,9 @@ # include /* ftime() */ #endif -#include "vlc_vlm.h" -#include "vlc_vod.h" +#include +#include +#include #define FREE( p ) \ if( p ) { free( p ); (p) = NULL; } @@ -53,17 +54,16 @@ static vlm_message_t *vlm_Show( vlm_t *, vlm_media_t *, vlm_schedule_t *, char * ); static vlm_message_t *vlm_Help( vlm_t *, char * ); -static vlm_media_t *vlm_MediaSearch ( vlm_t *, char * ); -static vlm_media_instance_t *vlm_MediaInstanceSearch( vlm_t *, vlm_media_t *, char * ); +static vlm_media_instance_t *vlm_MediaInstanceSearch( vlm_t *, vlm_media_t *, const char * ); static vlm_message_t *vlm_MessageNew( char *, const char *, ... ); static vlm_message_t *vlm_MessageAdd( vlm_message_t *, vlm_message_t * ); -static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *, char * ); +static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *, const char * ); static char *Save( vlm_t * ); static int Load( vlm_t *, char * ); -static int ExecuteCommand( vlm_t *, char *, vlm_message_t ** ); +static int ExecuteCommand( vlm_t *, const char *, vlm_message_t ** ); static int Manage( vlc_object_t * ); /***************************************************************************** @@ -125,7 +125,7 @@ vlm_t *__vlm_New ( vlc_object_t *p_this ) if( vlm_ExecuteCommand( p_vlm, psz_buffer, &p_message ) ){ msg_Warn( p_this, "error while loading the vlm conf file" ); } - free(p_message); + vlm_MessageDelete(p_message); free(psz_buffer); } } @@ -172,7 +172,7 @@ void vlm_Delete( vlm_t *p_vlm ) /***************************************************************************** * vlm_ExecuteCommand: *****************************************************************************/ -int vlm_ExecuteCommand( vlm_t *p_vlm, char *psz_command, +int vlm_ExecuteCommand( vlm_t *p_vlm, const char *psz_command, vlm_message_t **pp_message) { int i_result; @@ -187,14 +187,14 @@ int vlm_ExecuteCommand( vlm_t *p_vlm, char *psz_command, /***************************************************************************** * vlm_Save: *****************************************************************************/ -int vlm_Save( vlm_t *p_vlm, char *psz_file ) +int vlm_Save( vlm_t *p_vlm, const char *psz_file ) { FILE *file; char *psz_save; if( !p_vlm || !psz_file ) return 1; - file = fopen( psz_file, "wt" ); + file = utf8_fopen( psz_file, "wt" ); if( file == NULL ) return 1; psz_save = Save( p_vlm ); @@ -213,42 +213,44 @@ int vlm_Save( vlm_t *p_vlm, char *psz_file ) /***************************************************************************** * vlm_Load: *****************************************************************************/ -int vlm_Load( vlm_t *p_vlm, char *psz_file ) +int vlm_Load( vlm_t *p_vlm, const char *psz_file ) { - FILE *file; + stream_t *p_stream; int64_t i_size; char *psz_buffer; if( !p_vlm || !psz_file ) return 1; - file = fopen( psz_file, "r" ); - if( file == NULL ) return 1; + p_stream = stream_UrlNew( p_vlm, psz_file ); + if( p_stream == NULL ) return 1; - if( fseek( file, 0, SEEK_END) != 0 ) + if( stream_Seek( p_stream, 0 ) != 0 ) { - fclose( file ); + stream_Delete( p_stream ); return 2; } - i_size = ftell( file ); - fseek( file, 0, SEEK_SET ); + i_size = stream_Size( p_stream ); + psz_buffer = malloc( i_size + 1 ); if( !psz_buffer ) { - fclose( file ); + stream_Delete( p_stream ); return 2; } - fread( psz_buffer, 1, i_size, file ); + + stream_Read( p_stream, psz_buffer, i_size ); psz_buffer[ i_size ] = '\0'; + + stream_Delete( p_stream ); + if( Load( p_vlm, psz_buffer ) ) { - fclose( file ); free( psz_buffer ); return 3; } free( psz_buffer ); - fclose( file ); return 0; } @@ -256,10 +258,8 @@ int vlm_Load( vlm_t *p_vlm, char *psz_file ) /***************************************************************************** * FindEndCommand *****************************************************************************/ -static char *FindEndCommand( char *psz ) +static const char *FindEndCommand( const char *psz_sent ) { - char *psz_sent = psz; - switch( *psz_sent ) { case '\"': @@ -316,6 +316,7 @@ static char *FindEndCommand( char *psz ) if( ( *psz_sent == '\'' ) || ( *psz_sent == '\"' ) ) { psz_sent = FindEndCommand( psz_sent ); + if( psz_sent == NULL ) return NULL; } else psz_sent++; } @@ -329,12 +330,12 @@ static char *FindEndCommand( char *psz ) ***************************************************************************** * Execute a command which ends with '\0' (string) *****************************************************************************/ -static int ExecuteCommand( vlm_t *p_vlm, char *psz_command, +static int ExecuteCommand( vlm_t *p_vlm, const char *psz_command, vlm_message_t **pp_message ) { int i_command = 0; char **ppsz_command = NULL; - char *psz_cmd = psz_command; + const char *psz_cmd = psz_command; vlm_message_t *p_message = NULL; int i, j; @@ -348,7 +349,7 @@ static int ExecuteCommand( vlm_t *p_vlm, char *psz_command, } else { - char *psz_temp; + const char *psz_temp; int i_temp; /* support for comments */ @@ -618,6 +619,18 @@ static int ExecuteCommand( vlm_t *p_vlm, char *psz_command, } } + else if( !strcmp(ppsz_command[0], "export" ) ) + { + char *psz_buf; + + if( i_command != 1 ) goto syntax_error; + + p_message = vlm_MessageNew( "export", psz_buf = Save( p_vlm ) ); + free( psz_buf ); + + goto success; + } + else if( !strcmp(ppsz_command[0], "load") ) { if( i_command != 2 ) goto syntax_error; @@ -760,7 +773,7 @@ static int ExecuteCommand( vlm_t *p_vlm, char *psz_command, } else { - if( i + 1 >= i_command && + if( ( (i + 1) >= i_command ) && !strcmp(ppsz_command[0], "new") ) { vlm_MediaDelete( p_vlm, p_media, NULL ); @@ -769,7 +782,7 @@ static int ExecuteCommand( vlm_t *p_vlm, char *psz_command, "Wrong properties syntax" ); goto error; } - else if( i + 1 >= i_command ) + else if( (i + 1) >= i_command ) { p_message = vlm_MessageNew( ppsz_command[0], @@ -806,7 +819,7 @@ error: return VLC_EGENERIC; } -static vlm_media_t *vlm_MediaSearch( vlm_t *vlm, char *psz_name ) +vlm_media_t *vlm_MediaSearch( vlm_t *vlm, const char *psz_name ) { int i; @@ -825,7 +838,8 @@ static vlm_media_t *vlm_MediaSearch( vlm_t *vlm, char *psz_name ) * Media handling *****************************************************************************/ static vlm_media_instance_t * -vlm_MediaInstanceSearch( vlm_t *vlm, vlm_media_t *media, char *psz_name ) +vlm_MediaInstanceSearch( vlm_t *vlm, vlm_media_t *media, + const char *psz_name ) { int i; @@ -842,7 +856,7 @@ vlm_MediaInstanceSearch( vlm_t *vlm, vlm_media_t *media, char *psz_name ) return NULL; } -vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type ) +vlm_media_t *vlm_MediaNew( vlm_t *vlm, const char *psz_name, int i_type ) { vlm_media_t *media = malloc( sizeof( vlm_media_t ) ); @@ -889,7 +903,6 @@ vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type ) media->i_instance = 0; media->instance = NULL; - media->item.psz_uri = strdup( psz_name ); vlc_input_item_Init( VLC_OBJECT(vlm), &media->item ); TAB_APPEND( vlm->i_media, vlm->media, media ); @@ -898,7 +911,7 @@ vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type ) } /* for now, simple delete. After, del with options (last arg) */ -void vlm_MediaDelete( vlm_t *vlm, vlm_media_t *media, char *psz_name ) +void vlm_MediaDelete( vlm_t *vlm, vlm_media_t *media, const char *psz_name ) { if( media == NULL ) return; @@ -943,8 +956,8 @@ void vlm_MediaDelete( vlm_t *vlm, vlm_media_t *media, char *psz_name ) free( media ); } -int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, - char *psz_value ) +int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, const char *psz_cmd, + const char *psz_value ) { if( !psz_cmd) return VLC_EGENERIC; @@ -1068,6 +1081,7 @@ int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, /* Pre-parse the input */ input_thread_t *p_input; char *psz_output; + char *psz_header; int i; vlc_input_item_Clean( &media->item ); @@ -1092,7 +1106,10 @@ int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, strdup( media->option[i] ); } - if( (p_input = input_CreateThread( vlm, &media->item ) ) ) + asprintf( &psz_header, _("Media: %s"), media->psz_name ); + + if( (p_input = input_CreateThread2( vlm, &media->item, psz_header + ) ) ) { while( !p_input->b_eof && !p_input->b_error ) msleep( 100000 ); @@ -1102,6 +1119,7 @@ int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, vlc_object_destroy( p_input ); } free( psz_output ); + free( psz_header ); if( media->psz_mux ) { @@ -1132,11 +1150,12 @@ int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, return VLC_SUCCESS; } -int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, char *psz_id, - char *psz_command, char *psz_args ) +int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, const char *psz_id, + const char *psz_command, const char *psz_args ) { vlm_media_instance_t *p_instance; int i; + char *psz_header; p_instance = vlm_MediaInstanceSearch( vlm, media, psz_id ); @@ -1152,7 +1171,7 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, char *psz_id, vlc_input_item_Init( VLC_OBJECT(vlm), &p_instance->item ); p_instance->p_input = NULL; - if( media->psz_output != NULL || media->psz_vod_output != NULL ) + if( ( media->psz_output != NULL ) || ( media->psz_vod_output != NULL ) ) { p_instance->item.ppsz_options = malloc( sizeof( char* ) ); asprintf( &p_instance->item.ppsz_options[0], "sout=%s%s%s", @@ -1177,7 +1196,7 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, char *psz_id, TAB_APPEND( media->i_instance, media->instance, p_instance ); } - if( psz_args && sscanf(psz_args, "%d", &i) == 1 && i < media->i_input ) + if( ( psz_args && sscanf(psz_args, "%d", &i) == 1 ) && ( i < media->i_input ) ) { p_instance->i_index = i; } @@ -1194,13 +1213,16 @@ int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, char *psz_id, vlc_object_destroy( p_instance->p_input ); } - p_instance->p_input = input_CreateThread( vlm, &p_instance->item ); + asprintf( &psz_header, _("Media: %s"), media->psz_name ); + p_instance->p_input = input_CreateThread2( vlm, &p_instance->item, + psz_header ); if( !p_instance->p_input ) { TAB_REMOVE( media->i_instance, media->instance, p_instance ); vlc_input_item_Clean( &p_instance->item ); if( p_instance->psz_name ) free( p_instance->psz_name ); } + free( psz_header ); return VLC_SUCCESS; } @@ -1269,7 +1291,7 @@ static int64_t vlm_Date() #endif } -vlm_schedule_t *vlm_ScheduleNew( vlm_t *vlm, char *psz_name ) +vlm_schedule_t *vlm_ScheduleNew( vlm_t *vlm, const char *psz_name ) { vlm_schedule_t *p_sched = malloc( sizeof( vlm_schedule_t ) ); @@ -1298,7 +1320,7 @@ vlm_schedule_t *vlm_ScheduleNew( vlm_t *vlm, char *psz_name ) /* for now, simple delete. After, del with options (last arg) */ void vlm_ScheduleDelete( vlm_t *vlm, vlm_schedule_t *sched, - char *psz_name ) + const char *psz_name ) { if( sched == NULL ) return; @@ -1306,11 +1328,16 @@ void vlm_ScheduleDelete( vlm_t *vlm, vlm_schedule_t *sched, if( vlm->i_schedule == 0 && vlm->schedule ) free( vlm->schedule ); free( sched->psz_name ); - while( sched->i_command-- ) free( sched->command[sched->i_command] ); + while( sched->i_command ) + { + char *psz_cmd = sched->command[0]; + TAB_REMOVE( sched->i_command, sched->command, psz_cmd ); + free( psz_cmd ); + } free( sched ); } -static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *vlm, char *psz_name ) +static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *vlm, const char *psz_name ) { int i; @@ -1326,8 +1353,8 @@ static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *vlm, char *psz_name ) } /* Ok, setup schedule command will be able to support only one (argument value) at a time */ -int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, - char *psz_value ) +int vlm_ScheduleSetup( vlm_schedule_t *schedule, const char *psz_cmd, + const char *psz_value ) { if( !strcmp( psz_cmd, "enabled" ) ) { @@ -1341,7 +1368,7 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, else if( !strcmp( psz_cmd, "date" ) ) { struct tm time; - char *p; + const char *p; time_t date; time.tm_sec = 0; /* seconds */ @@ -1361,15 +1388,17 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, { schedule->i_date = 0; } - else if( p == NULL && sscanf( psz_value, "%d:%d:%d", &time.tm_hour, &time.tm_min, &time.tm_sec ) != 3 ) /* it must be a hour:minutes:seconds */ + else if( (p == NULL) && sscanf( psz_value, "%d:%d:%d", &time.tm_hour, + &time.tm_min, &time.tm_sec ) != 3 ) + /* it must be a hour:minutes:seconds */ { return 1; } else { - int i,j,k; + unsigned i,j,k; - switch( sscanf( p + 1, "%d:%d:%d", &i, &j, &k ) ) + switch( sscanf( p + 1, "%u:%u:%u", &i, &j, &k ) ) { case 1: time.tm_sec = i; @@ -1387,8 +1416,6 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, return 1; } - *p = '\0'; - switch( sscanf( psz_value, "%d/%d/%d", &i, &j, &k ) ) { case 1: @@ -1414,10 +1441,10 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, else if( !strcmp( psz_cmd, "period" ) ) { struct tm time; - char *p; - char *psz_time = NULL, *psz_date = NULL; + const char *p; + const char *psz_time = NULL, *psz_date = NULL; time_t date; - int i,j,k; + unsigned i,j,k; /* First, if date or period are modified, repeat should be equal to -1 */ schedule->i_repeat = -1; @@ -1438,16 +1465,13 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, { psz_date = psz_value; psz_time = p + 1; - - *p = '\0'; } else { psz_time = psz_value; } - - switch( sscanf( psz_time, "%d:%d:%d", &i, &j, &k ) ) + switch( sscanf( psz_time, "%u:%u:%u", &i, &j, &k ) ) { case 1: time.tm_sec = i; @@ -1466,7 +1490,7 @@ int vlm_ScheduleSetup( vlm_schedule_t *schedule, char *psz_cmd, } if( psz_date ) { - switch( sscanf( psz_date, "%d/%d/%d", &i, &j, &k ) ) + switch( sscanf( psz_date, "%u/%u/%u", &i, &j, &k ) ) { case 1: time.tm_mday = i; @@ -1636,16 +1660,35 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, { vlm_media_instance_t *p_instance = media->instance[i]; vlc_value_t val; + vlm_message_t *msg_instance; + char *psz_tmp; if( !p_instance->p_input ) val.i_int = END_S; else var_Get( p_instance->p_input, "state", &val ); - vlm_MessageAdd( msg_child, - vlm_MessageNew( p_instance->psz_name ? - p_instance->psz_name : "default", + msg_instance = vlm_MessageNew( "instance" , NULL ); + vlm_MessageAdd( msg_instance, vlm_MessageNew( "name" , p_instance->psz_name ? p_instance->psz_name : "default" ) ); + vlm_MessageAdd( msg_instance, vlm_MessageNew( "state", val.i_int == PLAYING_S ? "playing" : val.i_int == PAUSE_S ? "paused" : "stopped" ) ); +#define APPEND_INPUT_INFO( a, format, type ) \ + asprintf( &psz_tmp, format, \ + var_Get ## type( p_instance->p_input, a ) ); \ + vlm_MessageAdd( msg_instance, vlm_MessageNew( a, psz_tmp ) ); \ + free( psz_tmp ); + APPEND_INPUT_INFO( "position", "%f", Float ); + APPEND_INPUT_INFO( "time", "%d", Integer ); + APPEND_INPUT_INFO( "length", "%d", Integer ); + APPEND_INPUT_INFO( "rate", "%d", Integer ); + APPEND_INPUT_INFO( "title", "%d", Integer ); + APPEND_INPUT_INFO( "chapter", "%d", Integer ); + APPEND_INPUT_INFO( "seekable", "%d", Bool ); +#undef APPEND_INPUT_INFO + asprintf( &psz_tmp, "%d", p_instance->i_index + 1 ); + vlm_MessageAdd( msg_instance, vlm_MessageNew( "playlistindex", psz_tmp ) ); + free( psz_tmp ); + vlm_MessageAdd( msg_child, msg_instance ); } return msg; @@ -1828,12 +1871,6 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, vlm_MessageNew( "enabled", s->b_enabled ? "yes" : "no" ) ); - if( !s->b_enabled ) return msg; - - - vlm_MessageAdd( msg_schedule, - vlm_MessageNew( "enabled", "yes" ) ); - /* calculate next date */ i_time = vlm_Date(); i_next_date = s->i_date; @@ -1871,7 +1908,7 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, return msg; } - else if( psz_filter == NULL && media == NULL && schedule == NULL ) + else if( ( psz_filter == NULL ) && ( media == NULL ) && ( schedule == NULL ) ) { vlm_message_t *show1 = vlm_Show( vlm, NULL, NULL, "media" ); vlm_message_t *show2 = vlm_Show( vlm, NULL, NULL, "schedule" ); @@ -1912,6 +1949,7 @@ static vlm_message_t *vlm_Help( vlm_t *vlm, char *psz_filter ) MessageAddChild( "del (name)|all|media|schedule" ); MessageAddChild( "control (name) [instance_name] (command)" ); MessageAddChild( "save (config_file)" ); + MessageAddChild( "export" ); MessageAddChild( "load (config_file)" ); message_child = MessageAdd( "Media Proprieties Syntax:" ); @@ -1951,6 +1989,7 @@ static vlm_message_t *vlm_Help( vlm_t *vlm, char *psz_filter ) static int Load( vlm_t *vlm, char *file ) { char *pf = file; + int i_line = 1; while( *pf != '\0' ) { @@ -1971,12 +2010,19 @@ static int Load( vlm_t *vlm, char *file ) if( *pf && ExecuteCommand( vlm, pf, &message ) ) { - if( message ) free( message ); + if( message ) + { + if( message->psz_value ) + msg_Err( vlm, "Load error on line %d: %s: %s", + i_line, message->psz_name, message->psz_value ); + vlm_MessageDelete( message ); + } return 1; } - if( message ) free( message ); + if( message ) vlm_MessageDelete( message ); pf += i_end; + i_line++; } return 0; @@ -1985,9 +2031,12 @@ static int Load( vlm_t *vlm, char *file ) static char *Save( vlm_t *vlm ) { char *save = NULL; + char psz_header[] = "\n" + "# VLC media player VLM command batch\n" + "# http://www.videolan.org/vlc/\n\n" ; char *p; int i,j; - int i_length = 0; + int i_length = strlen( psz_header ); for( i = 0; i < vlm->i_media; i++ ) { @@ -2089,6 +2138,8 @@ static char *Save( vlm_t *vlm ) p = save = malloc( i_length ); *save = '\0'; + p += sprintf( p, "%s", psz_header ); + /* finally we can write in it */ for( i = 0; i < vlm->i_media; i++ ) { @@ -2220,7 +2271,7 @@ static char *Save( vlm_t *vlm ) * Manage: *****************************************************************************/ int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media, - char *psz_id, int i_query, va_list args ) + const char *psz_id, int i_query, va_list args ) { vlm_t *vlm = (vlm_t *)p_private; int i, i_ret = VLC_EGENERIC; @@ -2292,6 +2343,8 @@ static int Manage( vlc_object_t* p_object ) while( !vlm->b_die ) { + char **ppsz_scheduled_commands = NULL; + int i_scheduled_commands = 0; vlc_mutex_lock( &vlm->lock ); /* destroy the inputs that wants to die, and launch the next input */ @@ -2365,17 +2418,26 @@ static int Manage( vlc_object_t* p_object ) { for( j = 0; j < vlm->schedule[i]->i_command; j++ ) { - vlm_message_t *message = NULL; - - ExecuteCommand( vlm, vlm->schedule[i]->command[j], - &message ); - - /* for now, drop the message */ - free( message ); + TAB_APPEND( i_scheduled_commands, + ppsz_scheduled_commands, + strdup(vlm->schedule[i]->command[j] ) ); } } } } + while( i_scheduled_commands ) + { + vlm_message_t *message = NULL; + char *psz_command = ppsz_scheduled_commands[0]; + ExecuteCommand( vlm, psz_command,&message ); + + /* for now, drop the message */ + vlm_MessageDelete( message ); + TAB_REMOVE( i_scheduled_commands, + ppsz_scheduled_commands, + psz_command ); + free( psz_command ); + } i_lastcheck = i_time; @@ -2399,6 +2461,7 @@ void vlm_Delete( vlm_t *a ){} int vlm_ExecuteCommand( vlm_t *a, char *b, vlm_message_t **c ){ return -1; } void vlm_MessageDelete( vlm_message_t *a ){} vlm_media_t *vlm_MediaNew( vlm_t *a, char *b, int c ){ return NULL; } +vlm_media_t *vlm_MediaSearch (vlm_t *a, const char *b ) { return NULL; } void vlm_MediaDelete( vlm_t *a, vlm_media_t *b, char *c ){} int vlm_MediaSetup( vlm_t *a, vlm_media_t *b, char *c, char *d ){ return -1; } int vlm_MediaControl( vlm_t *a, vlm_media_t *b, char *c, char *d, char *e )