X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Flirc.c;h=467f48229a948ddcd3ff50fec94368c58f82c8f5;hb=ff283ead4a3ec930becc2b382a175df13dee8cb9;hp=67cd2962ed4b5e52a36bb9eb474953c45be30bae;hpb=99fab9089e9e1709d9c3a4bc5ced0c137ac59134;p=vlc diff --git a/modules/control/lirc.c b/modules/control/lirc.c index 67cd2962ed..467f48229a 100644 --- a/modules/control/lirc.c +++ b/modules/control/lirc.c @@ -31,10 +31,15 @@ # include "config.h" #endif -#include +#include +#include #include #include +#ifdef HAVE_POLL +# include +#endif + #include #define LIRC_TEXT N_("Change the lirc configuration file.") @@ -42,6 +47,24 @@ "Tell lirc to read this configuration file. By default it " \ "searches in the users home directory." ) +/***************************************************************************** + * Module descriptor + *****************************************************************************/ +static int Open ( vlc_object_t * ); +static void Close ( vlc_object_t * ); + +vlc_module_begin () + set_shortname( N_("Infrared") ) + set_category( CAT_INTERFACE ) + set_subcategory( SUBCAT_INTERFACE_CONTROL ) + set_description( N_("Infrared remote control interface") ) + set_capability( "interface", 0 ) + set_callbacks( Open, Close ) + + add_string( "lirc-file", NULL, NULL, + LIRC_TEXT, LIRC_LONGTEXT, true ); +vlc_module_end () + /***************************************************************************** * intf_sys_t: description and status of FB interface *****************************************************************************/ @@ -49,29 +72,16 @@ struct intf_sys_t { char *psz_file; struct lirc_config *config; + + int i_fd; }; /***************************************************************************** * Local prototypes *****************************************************************************/ -static int Open ( vlc_object_t * ); -static void Close ( vlc_object_t * ); -static void Run ( intf_thread_t * ); - -/***************************************************************************** - * Module descriptor - *****************************************************************************/ -vlc_module_begin(); - set_shortname( _("Infrared") ); - set_category( CAT_INTERFACE ); - set_subcategory( SUBCAT_INTERFACE_CONTROL ); - set_description( _("Infrared remote control interface") ); - set_capability( "interface", 0 ); - set_callbacks( Open, Close ); +static void Run( intf_thread_t * ); - add_string( "lirc-file", NULL, NULL, - LIRC_TEXT, LIRC_LONGTEXT, VLC_TRUE ); -vlc_module_end(); +static int Process( intf_thread_t * ); /***************************************************************************** * Open: initialize interface @@ -79,40 +89,41 @@ vlc_module_end(); static int Open( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; - int i_fd; + intf_sys_t *p_sys; /* Allocate instance and initialize some members */ - p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); - if( p_intf->p_sys == NULL ) - { - msg_Err( p_intf, "out of memory" ); - return 1; - } + p_intf->p_sys = p_sys = malloc( sizeof( intf_sys_t ) ); + if( p_sys == NULL ) + return VLC_ENOMEM; p_intf->pf_run = Run; - p_intf->p_sys->psz_file = var_CreateGetNonEmptyString( p_intf, "lirc-file" ); - - i_fd = lirc_init( "vlc", 1 ); - if( i_fd == -1 ) + p_sys->psz_file = var_CreateGetNonEmptyString( p_intf, "lirc-file" ); + p_sys->i_fd = lirc_init( "vlc", 1 ); + if( p_sys->i_fd == -1 ) { msg_Err( p_intf, "lirc initialisation failed" ); - free( p_intf->p_sys ); - return 1; + goto exit; } /* We want polling */ - fcntl( i_fd, F_SETFL, fcntl( i_fd, F_GETFL ) | O_NONBLOCK ); + fcntl( p_sys->i_fd, F_SETFL, fcntl( p_sys->i_fd, F_GETFL ) | O_NONBLOCK ); - if( lirc_readconfig( p_intf->p_sys->psz_file, &p_intf->p_sys->config, NULL ) != 0 ) + /* */ + if( lirc_readconfig( p_sys->psz_file, &p_sys->config, NULL ) != 0 ) { msg_Err( p_intf, "failure while reading lirc config" ); - lirc_deinit(); - free( p_intf->p_sys ); - return 1; + goto exit; } - return 0; + return VLC_SUCCESS; + +exit: + if( p_sys->i_fd != -1 ) + lirc_deinit(); + free( p_sys->psz_file ); + free( p_sys ); + return VLC_EGENERIC; } /***************************************************************************** @@ -121,13 +132,13 @@ static int Open( vlc_object_t *p_this ) static void Close( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; + intf_sys_t *p_sys = p_intf->p_sys; /* Destroy structure */ - if( p_intf->p_sys->psz_file ) - free( p_intf->p_sys->psz_file ); - lirc_freeconfig( p_intf->p_sys->config ); + lirc_freeconfig( p_sys->config ); lirc_deinit(); - free( p_intf->p_sys ); + free( p_sys->psz_file ); + free( p_sys ); } /***************************************************************************** @@ -135,25 +146,36 @@ static void Close( vlc_object_t *p_this ) *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { - char *code, *c; + intf_sys_t *p_sys = p_intf->p_sys; - while( !intf_ShouldDie( p_intf ) ) + for( ;; ) { - /* Sleep a bit */ - msleep( INTF_IDLE_SLEEP ); - - /* We poll the lircsocket */ - if( lirc_nextcode(&code) != 0 ) - { + /* Wait for data */ + struct pollfd ufd = { .fd = p_sys->i_fd, .events = POLLIN, .revents = 0 }; + if( poll( &ufd, 1, -1 ) == -1 ) break; - } + + /* Process */ + int canc = vlc_savecancel(); + Process( p_intf ); + vlc_restorecancel(canc); + } +} + +static int Process( intf_thread_t *p_intf ) +{ + for( ;; ) + { + char *code, *c; + int i_ret = lirc_nextcode( &code ); + + if( i_ret ) + return i_ret; if( code == NULL ) - { - continue; - } + return 0; - while( !intf_ShouldDie( p_intf ) + while( vlc_object_alive( p_intf ) && (lirc_code2char( p_intf->p_sys->config, code, &c ) == 0) && (c != NULL) ) { @@ -184,7 +206,7 @@ static void Run( intf_thread_t *p_intf ) osd_MenuActivate( VLC_OBJECT(p_intf) ); else { - msg_Err( p_intf, _("Please provide one of the following parameters:") ); + msg_Err( p_intf, "Please provide one of the following parameters:" ); msg_Err( p_intf, "[on|off|up|down|left|right|select]" ); break; }