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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * lirc.c : lirc module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2005 the VideoLAN team
  5.  * $Id: 8b3325768ce4dab32bc3baede2949c9e4939c461 $
  6.  *
  7.  * Author: Sigmund Augdal Helberg <dnumgis@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. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <fcntl.h>
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_plugin.h>
  32. #include <vlc_interface.h>
  33. #include <vlc_osd.h>
  34. #ifdef HAVE_POLL
  35. # include <poll.h>
  36. #endif
  37. #include <lirc/lirc_client.h>
  38. #define LIRC_TEXT N_("Change the lirc configuration file.")
  39. #define LIRC_LONGTEXT N_( 
  40.     "Tell lirc to read this configuration file. By default it " 
  41.     "searches in the users home directory." )
  42. /*****************************************************************************
  43.  * Module descriptor
  44.  *****************************************************************************/
  45. static int  Open    ( vlc_object_t * );
  46. static void Close   ( vlc_object_t * );
  47. vlc_module_begin ()
  48.     set_shortname( N_("Infrared") )
  49.     set_category( CAT_INTERFACE )
  50.     set_subcategory( SUBCAT_INTERFACE_CONTROL )
  51.     set_description( N_("Infrared remote control interface") )
  52.     set_capability( "interface", 0 )
  53.     set_callbacks( Open, Close )
  54.     add_string( "lirc-file", NULL, NULL,
  55.                 LIRC_TEXT, LIRC_LONGTEXT, true )
  56. vlc_module_end ()
  57. /*****************************************************************************
  58.  * intf_sys_t: description and status of FB interface
  59.  *****************************************************************************/
  60. struct intf_sys_t
  61. {
  62.     char *psz_file;
  63.     struct lirc_config *config;
  64.     int i_fd;
  65. };
  66. /*****************************************************************************
  67.  * Local prototypes
  68.  *****************************************************************************/
  69. static void Run( intf_thread_t * );
  70. static int  Process( intf_thread_t * );
  71. /*****************************************************************************
  72.  * Open: initialize interface
  73.  *****************************************************************************/
  74. static int Open( vlc_object_t *p_this )
  75. {
  76.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  77.     intf_sys_t *p_sys;
  78.     /* Allocate instance and initialize some members */
  79.     p_intf->p_sys = p_sys = malloc( sizeof( intf_sys_t ) );
  80.     if( p_sys == NULL )
  81.         return VLC_ENOMEM;
  82.     p_intf->pf_run = Run;
  83.     p_sys->psz_file = var_CreateGetNonEmptyString( p_intf, "lirc-file" );
  84.     p_sys->i_fd = lirc_init( "vlc", 1 );
  85.     if( p_sys->i_fd == -1 )
  86.     {
  87.         msg_Err( p_intf, "lirc initialisation failed" );
  88.         goto exit;
  89.     }
  90.     /* We want polling */
  91.     fcntl( p_sys->i_fd, F_SETFL, fcntl( p_sys->i_fd, F_GETFL ) | O_NONBLOCK );
  92.     /* */
  93.     if( lirc_readconfig( p_sys->psz_file, &p_sys->config, NULL ) != 0 )
  94.     {
  95.         msg_Err( p_intf, "failure while reading lirc config" );
  96.         goto exit;
  97.     }
  98.     return VLC_SUCCESS;
  99. exit:
  100.     if( p_sys->i_fd != -1 )
  101.         lirc_deinit();
  102.     free( p_sys->psz_file );
  103.     free( p_sys );
  104.     return VLC_EGENERIC;
  105. }
  106. /*****************************************************************************
  107.  * Close: destroy interface
  108.  *****************************************************************************/
  109. static void Close( vlc_object_t *p_this )
  110. {
  111.     intf_thread_t *p_intf = (intf_thread_t *)p_this;
  112.     intf_sys_t *p_sys = p_intf->p_sys;
  113.     /* Destroy structure */
  114.     lirc_freeconfig( p_sys->config );
  115.     lirc_deinit();
  116.     free( p_sys->psz_file );
  117.     free( p_sys );
  118. }
  119. /*****************************************************************************
  120.  * Run: main loop
  121.  *****************************************************************************/
  122. static void Run( intf_thread_t *p_intf )
  123. {
  124.     intf_sys_t *p_sys = p_intf->p_sys;
  125.     for( ;; )
  126.     {
  127.         /* Wait for data */
  128.         struct pollfd ufd = { .fd = p_sys->i_fd, .events = POLLIN, .revents = 0 };
  129.         if( poll( &ufd, 1, -1 ) == -1 )
  130.             break;
  131.         /* Process */
  132.         int canc = vlc_savecancel();
  133.         Process( p_intf );
  134.         vlc_restorecancel(canc);
  135.     }
  136. }
  137. static int Process( intf_thread_t *p_intf )
  138. {
  139.     for( ;; )
  140.     {
  141.         char *code, *c;
  142.         int i_ret = lirc_nextcode( &code );
  143.         if( i_ret )
  144.             return i_ret;
  145.         if( code == NULL )
  146.             return 0;
  147.         while( vlc_object_alive( p_intf )
  148.                 && (lirc_code2char( p_intf->p_sys->config, code, &c ) == 0)
  149.                 && (c != NULL) )
  150.         {
  151.             vlc_value_t keyval;
  152.             if( !strncmp( "key-", c, 4 ) )
  153.             {
  154.                 keyval.i_int = config_GetInt( p_intf, c );
  155.                 var_Set( p_intf->p_libvlc, "key-pressed", keyval );
  156.             }
  157.             else if( !strncmp( "menu ", c, 5)  )
  158.             {
  159.                 if( !strncmp( c, "menu on", 7 ) ||
  160.                     !strncmp( c, "menu show", 9 ))
  161.                     osd_MenuShow( VLC_OBJECT(p_intf) );
  162.                 else if( !strncmp( c, "menu off", 8 ) ||
  163.                          !strncmp( c, "menu hide", 9 ) )
  164.                     osd_MenuHide( VLC_OBJECT(p_intf) );
  165.                 else if( !strncmp( c, "menu up", 7 ) )
  166.                     osd_MenuUp( VLC_OBJECT(p_intf) );
  167.                 else if( !strncmp( c, "menu down", 9 ) )
  168.                     osd_MenuDown( VLC_OBJECT(p_intf) );
  169.                 else if( !strncmp( c, "menu left", 9 ) )
  170.                     osd_MenuPrev( VLC_OBJECT(p_intf) );
  171.                 else if( !strncmp( c, "menu right", 10 ) )
  172.                     osd_MenuNext( VLC_OBJECT(p_intf) );
  173.                 else if( !strncmp( c, "menu select", 11 ) )
  174.                     osd_MenuActivate( VLC_OBJECT(p_intf) );
  175.                 else
  176.                 {
  177.                     msg_Err( p_intf, "Please provide one of the following parameters:" );
  178.                     msg_Err( p_intf, "[on|off|up|down|left|right|select]" );
  179.                     break;
  180.                 }
  181.             }
  182.             else
  183.             {
  184.                 msg_Err( p_intf, "this doesn't appear to be a valid keycombo lirc sent us. Please look at the doc/lirc/example.lirc file in VLC" );
  185.                 break;
  186.             }
  187.         }
  188.         free( code );
  189.     }
  190. }