X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finterface%2Finterface.c;h=15ed2a7a6fa610028e47e0eff05dc96a0bb3ba3d;hb=57e189eb5d1d387f2036c31720e1e9aa8cb3ea78;hp=c9573fa71c8b61dc0a018224ebfcd9f14f3214ae;hpb=36ac163c85ad618a41f903da87c1e8e3eeb458af;p=vlc diff --git a/src/interface/interface.c b/src/interface/interface.c index c9573fa71c..15ed2a7a6f 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -1,36 +1,59 @@ /***************************************************************************** * interface.c: interface access for other threads - * (c)1998 VideoLAN - ***************************************************************************** * This library provides basic functions for threads to interact with user * interface, such as command line. + ***************************************************************************** + * Copyright (C) 1998, 1999, 2000 VideoLAN + * + * Authors: + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include -#include -#include /* for input.h */ +#include "defs.h" -#include /* plugins */ +#include /* ENOMEM */ +#include /* free(), strtol() */ +#include /* FILE */ +#include /* strerror() */ +#include /* on BSD, uio.h needs types.h */ +#include /* for input.h */ #include "config.h" #include "common.h" +#include "threads.h" #include "mtime.h" -#include "vlc_thread.h" +#include "plugins.h" +#include "playlist.h" #include "input.h" + +#include "audio_output.h" + #include "intf_msg.h" #include "interface.h" #include "intf_cmd.h" #include "intf_console.h" -#include "main.h" + #include "video.h" #include "video_output.h" +#include "main.h" + /***************************************************************************** * intf_channel_t: channel description ***************************************************************************** @@ -67,9 +90,9 @@ static int ParseChannel ( intf_channel_t *p_channel, char *psz_str ); *****************************************************************************/ intf_thread_t* intf_Create( void ) { - intf_thread_t *p_intf; - char * psz_method; - char * psz_plugin; + intf_thread_t * p_intf; + typedef void ( intf_getplugin_t ) ( intf_thread_t * p_intf ); + int i_index; /* Allocate structure */ p_intf = malloc( sizeof( intf_thread_t ) ); @@ -79,27 +102,21 @@ intf_thread_t* intf_Create( void ) return( NULL ); } - /* Initialize method-dependent functions */ - psz_method = main_GetPszVariable( VOUT_METHOD_VAR, VOUT_DEFAULT_METHOD ); - - psz_plugin = malloc( sizeof("./interface/intf_.so") + strlen(psz_method) ); - sprintf( psz_plugin, "./interface/intf_%s.so", psz_method ); - - p_intf->p_intf_plugin = dlopen( psz_plugin, RTLD_NOW | RTLD_GLOBAL ); - - if( p_intf->p_intf_plugin == NULL ) + /* Get a suitable interface plugin */ + for( i_index = 0 ; i_index < p_main->p_bank->i_plugin_count ; i_index++ ) { - intf_ErrMsg( "error: could not open interface plugin %s\n", psz_plugin ); - free( psz_plugin ); - free( p_intf ); - return( NULL ); + /* If there's a plugin in p_info ... */ + if( p_main->p_bank->p_info[ i_index ] != NULL ) + { + /* ... and if this plugin provides the functions we want ... */ + if( p_main->p_bank->p_info[ i_index ]->intf_GetPlugin != NULL ) + { + /* ... then get these functions */ + ( (intf_getplugin_t *) + p_main->p_bank->p_info[ i_index ]->intf_GetPlugin )( p_intf ); + } + } } - free( psz_plugin ); - - /* Get plugins */ - p_intf->p_sys_create = dlsym(p_intf->p_intf_plugin, "intf_SysCreate"); - p_intf->p_sys_manage = dlsym(p_intf->p_intf_plugin, "intf_SysManage"); - p_intf->p_sys_destroy = dlsym(p_intf->p_intf_plugin, "intf_SysDestroy"); /* Initialize structure */ p_intf->b_die = 0; @@ -116,7 +133,6 @@ intf_thread_t* intf_Create( void ) if( p_intf->p_console == NULL ) { intf_ErrMsg("error: can't create control console\n"); - dlclose( p_intf->p_intf_plugin ); free( p_intf ); return( NULL ); } @@ -124,7 +140,6 @@ intf_thread_t* intf_Create( void ) { intf_ErrMsg("error: can't create interface\n"); intf_ConsoleDestroy( p_intf->p_console ); - dlclose( p_intf->p_intf_plugin ); free( p_intf ); return( NULL ); } @@ -140,9 +155,13 @@ intf_thread_t* intf_Create( void ) *****************************************************************************/ void intf_Run( intf_thread_t *p_intf ) { + if( p_main->p_playlist->p_list ) + { + p_intf->p_input = input_CreateThread( INPUT_METHOD_TS_FILE, NULL, 0, 0, p_main->p_intf->p_vout, p_main->p_aout, NULL ); + } /* Execute the initialization script - if a positive number is returned, * the script could be executed but failed */ - if( intf_ExecScript( main_GetPszVariable( INTF_INIT_SCRIPT_VAR, INTF_INIT_SCRIPT_DEFAULT ) ) > 0 ) + else if( intf_ExecScript( main_GetPszVariable( INTF_INIT_SCRIPT_VAR, INTF_INIT_SCRIPT_DEFAULT ) ) > 0 ) { intf_ErrMsg("warning: error(s) during startup script\n"); } @@ -189,9 +208,6 @@ void intf_Destroy( intf_thread_t *p_intf ) /* Unload channels */ UnloadChannels( p_intf ); - /* Close plugin */ - dlclose( p_intf->p_intf_plugin ); - /* Free structure */ free( p_intf ); } @@ -247,6 +263,8 @@ int intf_SelectChannel( intf_thread_t * p_intf, int i_channel ) *****************************************************************************/ int intf_ProcessKey( intf_thread_t *p_intf, int i_key ) { + static int i_volbackup; + switch( i_key ) { case 'Q': /* quit order */ @@ -270,14 +288,22 @@ int intf_ProcessKey( intf_thread_t *p_intf, int i_key ) intf_SelectChannel( p_intf, i_key - '0' ); break; case '+': /* volume + */ - /* XXX?? */ + if( (p_main->p_aout != NULL) && (p_main->p_aout->vol < VOLMAX) ) + p_main->p_aout->vol += VOLSTEP; break; case '-': /* volume - */ - /* XXX?? */ + if( (p_main->p_aout != NULL) && (p_main->p_aout->vol > VOLSTEP) ) + p_main->p_aout->vol -= VOLSTEP; break; case 'M': /* toggle mute */ case 'm': - /* XXX?? */ + if( (p_main->p_aout != NULL) && (p_main->p_aout->vol)) + { + i_volbackup = p_main->p_aout->vol; + p_main->p_aout->vol = 0; + } + else if( (p_main->p_aout != NULL) && (!p_main->p_aout->vol)) + p_main->p_aout->vol = i_volbackup; break; case 'g': /* gamma - */ if( (p_intf->p_vout != NULL) && (p_intf->p_vout->f_gamma > -INTF_GAMMA_LIMIT) ) @@ -403,10 +429,11 @@ static int LoadChannels( intf_thread_t *p_intf, char *psz_filename ) { if( !ParseChannel( p_channel, psz_line ) ) { - intf_DbgMsg("channel [%d] %s : method %d (%s:%d vlan %d)\n", - p_channel->i_channel, p_channel->psz_description, - p_channel->i_input_method, p_channel->psz_input_source, - p_channel->i_input_port, p_channel->i_input_vlan ); + intf_DbgMsg( "channel [%d] %s : method %d (%s:%d vlan %d)\n", + p_channel->i_channel, p_channel->psz_description, + p_channel->i_input_method, + p_channel->psz_input_source, + p_channel->i_input_port, p_channel->i_input_vlan ); p_channel++; } }