⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "../config.h"#include <stdlib.h>#include <string.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <signal.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>#include <fcntl.h>#include <ctype.h>#include "input.h"#include "mouse.h"#ifdef MP_DEBUG#include <assert.h>#endif#include "../osdep/getch2.h"#include "../osdep/keycodes.h"#include "../osdep/timer.h"#include "../mp_msg.h"#include "../m_config.h"#include "../m_option.h"#include "joystick.h"#ifdef HAVE_LIRC#include "lirc.h"#endif#ifdef HAVE_LIRCC#include <lirc/lircc.h>#endif/// This array defines all known commands./// The first field is an id used to recognize the command without too many strcmp./// The second is obviously the command name./// The third is the minimum number of arguments this command needs./// Then comes the definition of each argument, terminated with an arg of type -1./// A command can take a maximum of MP_CMD_MAX_ARGS-1 arguments (-1 because of/// the last one) which is actually 9./// For the args, the first field is the type (actually int, float or string), the second/// is the default value wich is used for optional argumentsstatic mp_cmd_t mp_cmds[] = {  { MP_CMD_SEEK, "seek", 1, { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },#ifdef USE_EDL  { MP_CMD_EDL_MARK, "edl_mark", 0, { {-1,{0}} } },#endif  { MP_CMD_AUDIO_DELAY, "audio_delay", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_SPEED_INCR, "speed_incr", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_SPEED_MULT, "speed_mult", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_SPEED_SET, "speed_set", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_QUIT, "quit", 0, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_PAUSE, "pause", 0, { {-1,{0}} } },  { MP_CMD_FRAME_STEP, "frame_step", 0, { {-1,{0}} } },  { MP_CMD_GRAB_FRAMES, "grab_frames",0, { {-1,{0}} }  },  { MP_CMD_PLAY_TREE_STEP, "pt_step",1, { { MP_CMD_ARG_INT ,{0}}, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } },  { MP_CMD_PLAY_TREE_UP_STEP, "pt_up_step",1,  { { MP_CMD_ARG_INT,{0} }, { MP_CMD_ARG_INT ,{0}}, {-1,{0}} } },  { MP_CMD_PLAY_ALT_SRC_STEP, "alt_src_step",1, { { MP_CMD_ARG_INT,{0} }, {-1,{0}} } },  { MP_CMD_SUB_DELAY, "sub_delay",1,  { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_SUB_STEP, "sub_step",1,  { { MP_CMD_ARG_INT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_OSD, "osd",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },  { MP_CMD_OSD_SHOW_TEXT, "osd_show_text", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },  { MP_CMD_VOLUME, "volume", 1, { { MP_CMD_ARG_INT,{0} }, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_MIXER_USEMASTER, "use_master", 0, { {-1,{0}} } },  { MP_CMD_MUTE, "mute", 0, { {-1,{0}} } },  { MP_CMD_CONTRAST, "contrast",1,  { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_GAMMA, "gamma", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} }  },  { MP_CMD_BRIGHTNESS, "brightness",1,  { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} }  },  { MP_CMD_HUE, "hue",1,  { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_SATURATION, "saturation",1,  { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} }  },  { MP_CMD_FRAMEDROPPING, "frame_drop",0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } },  { MP_CMD_SUB_POS, "sub_pos", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_SUB_ALIGNMENT, "sub_alignment",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },  { MP_CMD_SUB_VISIBILITY, "sub_visibility", 0, { {-1,{0}} } },  { MP_CMD_SUB_SELECT, "vobsub_lang", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } }, // for compatibility  { MP_CMD_SUB_SELECT, "sub_select", 0, { { MP_CMD_ARG_INT,{-2} }, {-1,{0}} } },  { MP_CMD_SUB_LOG, "sub_log", 0, { {-1,{0}} } },  { MP_CMD_GET_PERCENT_POS, "get_percent_pos", 0, { {-1,{0}} } },  { MP_CMD_GET_TIME_LENGTH, "get_time_length", 0, { {-1,{0}} } },  { MP_CMD_SWITCH_AUDIO, "switch_audio", 0, { {-1,{0}} } },#ifdef USE_TV  { MP_CMD_TV_STEP_CHANNEL, "tv_step_channel", 1,  { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }},  { MP_CMD_TV_STEP_NORM, "tv_step_norm",0, { {-1,{0}} }  },  { MP_CMD_TV_STEP_CHANNEL_LIST, "tv_step_chanlist", 0, { {-1,{0}} }  },  { MP_CMD_TV_SET_CHANNEL, "tv_set_channel", 1, { { MP_CMD_ARG_STRING, {0}}, {-1,{0}}  }},  { MP_CMD_TV_LAST_CHANNEL, "tv_last_channel", 0, { {-1,{0}} } },  { MP_CMD_TV_SET_FREQ, "tv_set_freq", 1, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_TV_SET_NORM, "tv_set_norm", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } },  { MP_CMD_TV_SET_BRIGHTNESS, "tv_set_brightness", 1,  { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }},  { MP_CMD_TV_SET_CONTRAST, "tv_set_contrast", 1,  { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }},  { MP_CMD_TV_SET_HUE, "tv_set_hue", 1,  { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }},  { MP_CMD_TV_SET_SATURATION, "tv_set_saturation", 1,  { { MP_CMD_ARG_INT ,{0}}, {-1,{0}} }},#endif  { MP_CMD_SUB_FORCED_ONLY, "forced_subs_only",  0, { {-1,{0}} } },#ifdef HAS_DVBIN_SUPPORT  { MP_CMD_DVB_SET_CHANNEL, "dvb_set_channel", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}},#endif  { MP_CMD_SWITCH_RATIO, "switch_ratio", 0, { {MP_CMD_ARG_FLOAT,{0}}, {-1,{0}} } },  { MP_CMD_VO_FULLSCREEN, "vo_fullscreen", 0, { {-1,{0}} } },  { MP_CMD_VO_ONTOP, "vo_ontop", 0, { {-1,{0}} } },  { MP_CMD_VO_ROOTWIN, "vo_rootwin", 0, { {-1,{0}} } },  { MP_CMD_SCREENSHOT, "screenshot", 0, { {-1,{0}} } },  { MP_CMD_PANSCAN, "panscan",1,  { {MP_CMD_ARG_FLOAT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_SWITCH_VSYNC, "switch_vsync", 0, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_LOADFILE, "loadfile", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },  { MP_CMD_LOADLIST, "loadlist", 1, { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },  { MP_CMD_RUN, "run", 1, { {MP_CMD_ARG_STRING,{0}}, {-1,{0}} } },  { MP_CMD_VF_CHANGE_RECTANGLE, "change_rectangle", 2, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}}}},#ifdef HAVE_NEW_GUI    { MP_CMD_GUI_LOADFILE, "gui_loadfile", 0, { {-1,{0}} } },  { MP_CMD_GUI_LOADSUBTITLE, "gui_loadsubtitle", 0, { {-1,{0}} } },  { MP_CMD_GUI_ABOUT, "gui_about", 0, { {-1,{0}} } },  { MP_CMD_GUI_PLAY, "gui_play", 0, { {-1,{0}} } },  { MP_CMD_GUI_STOP, "gui_stop", 0, { {-1,{0}} } },  { MP_CMD_GUI_PLAYLIST, "gui_playlist", 0, { {-1,{0}} } },  { MP_CMD_GUI_PREFERENCES, "gui_preferences", 0, { {-1,{0}} } },  { MP_CMD_GUI_SKINBROWSER, "gui_skinbrowser", 0, { {-1,{0}} } },#endif#ifdef USE_DVDNAV  { MP_CMD_DVDNAV, "dvdnav", 1, { {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },  { MP_CMD_DVDNAV_EVENT, "dvdnav_event", 1, { { MP_CMD_ARG_VOID, {0}}, {-1, {0}} } },#endif#ifdef HAVE_MENU  { MP_CMD_MENU, "menu",1,  { {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },  { MP_CMD_SET_MENU, "set_menu",1,  { {MP_CMD_ARG_STRING, {0}},  {MP_CMD_ARG_STRING, {0}}, {-1,{0}} } },  { MP_CMD_CHELP, "help", 0, { {-1,{0}} } },  { MP_CMD_CEXIT, "exit", 0, { {-1,{0}} } },  { MP_CMD_CHIDE, "hide", 0, { {MP_CMD_ARG_INT,{3000}}, {-1,{0}} } },#endif   { MP_CMD_GET_VO_FULLSCREEN, "get_vo_fullscreen", 0, { {-1,{0}} } },  { MP_CMD_GET_SUB_VISIBILITY, "get_sub_visibility", 0, { {-1,{0}} } },    { 0, NULL, 0, {} }};/// The names of the keys as used in input.conf/// If you add some new keys, you also need to add them herestatic mp_key_name_t key_names[] = {  { ' ', "SPACE" },  { KEY_ENTER, "ENTER" },  { KEY_TAB, "TAB" },  { KEY_CTRL, "CTRL" },  { KEY_BACKSPACE, "BS" },  { KEY_DELETE, "DEL" },  { KEY_INSERT, "INS" },  { KEY_HOME, "HOME" },  { KEY_END, "END" },  { KEY_PAGE_UP, "PGUP" },  { KEY_PAGE_DOWN, "PGDWN" },  { KEY_ESC, "ESC" },  { KEY_RIGHT, "RIGHT" },  { KEY_LEFT, "LEFT" },  { KEY_DOWN, "DOWN" },  { KEY_UP, "UP" },  { KEY_F+1, "F1" },  { KEY_F+2, "F2" },  { KEY_F+3, "F3" },  { KEY_F+4, "F4" },  { KEY_F+5, "F5" },  { KEY_F+6, "F6" },  { KEY_F+7, "F7" },  { KEY_F+8, "F8" },  { KEY_F+9, "F9" },  { KEY_F+10, "F10" },  { KEY_F+11, "F11" },  { KEY_F+12, "F12" },  { KEY_KP0, "KP0" },  { KEY_KP1, "KP1" },  { KEY_KP2, "KP2" },  { KEY_KP3, "KP3" },  { KEY_KP4, "KP4" },  { KEY_KP5, "KP5" },  { KEY_KP6, "KP6" },  { KEY_KP7, "KP7" },  { KEY_KP8, "KP8" },  { KEY_KP9, "KP9" },  { KEY_KPDEL, "KP_DEL" },  { KEY_KPDEC, "KP_DEC" },  { KEY_KPINS, "KP_INS" },  { KEY_KPENTER, "KP_ENTER" },  { MOUSE_BTN0, "MOUSE_BTN0" },  { MOUSE_BTN1, "MOUSE_BTN1" },  { MOUSE_BTN2, "MOUSE_BTN2" },  { MOUSE_BTN3, "MOUSE_BTN3" },  { MOUSE_BTN4, "MOUSE_BTN4" },  { MOUSE_BTN5, "MOUSE_BTN5" },  { MOUSE_BTN6, "MOUSE_BTN6" },  { MOUSE_BTN7, "MOUSE_BTN7" },  { MOUSE_BTN8, "MOUSE_BTN8" },  { MOUSE_BTN9, "MOUSE_BTN9" },  { JOY_AXIS1_MINUS, "JOY_UP" },  { JOY_AXIS1_PLUS, "JOY_DOWN" },  { JOY_AXIS0_MINUS, "JOY_LEFT" },  { JOY_AXIS0_PLUS, "JOY_RIGHT" },  { JOY_AXIS0_PLUS, "JOY_AXIS0_PLUS" },  { JOY_AXIS0_MINUS, "JOY_AXIS0_MINUS" },  { JOY_AXIS1_PLUS, "JOY_AXIS1_PLUS" },  { JOY_AXIS1_MINUS, "JOY_AXIS1_MINUS" },  { JOY_AXIS2_PLUS, "JOY_AXIS2_PLUS" },  { JOY_AXIS2_MINUS, "JOY_AXIS2_MINUS" },  { JOY_AXIS3_PLUS, "JOY_AXIS3_PLUS" },  { JOY_AXIS3_MINUS, "JOY_AXIS3_MINUS" },  { JOY_AXIS4_PLUS, "JOY_AXIS4_PLUS" },  { JOY_AXIS4_MINUS, "JOY_AXIS4_MINUS" },  { JOY_AXIS5_PLUS, "JOY_AXIS5_PLUS" },  { JOY_AXIS5_MINUS, "JOY_AXIS5_MINUS" },  { JOY_AXIS6_PLUS, "JOY_AXIS6_PLUS" },  { JOY_AXIS6_MINUS, "JOY_AXIS6_MINUS" },  { JOY_AXIS7_PLUS, "JOY_AXIS7_PLUS" },  { JOY_AXIS7_MINUS, "JOY_AXIS7_MINUS" },  { JOY_AXIS8_PLUS, "JOY_AXIS8_PLUS" },  { JOY_AXIS8_MINUS, "JOY_AXIS8_MINUS" },  { JOY_AXIS9_PLUS, "JOY_AXIS9_PLUS" },  { JOY_AXIS9_MINUS, "JOY_AXIS9_MINUS" },  { JOY_BTN0, "JOY_BTN0" },  { JOY_BTN1, "JOY_BTN1" },  { JOY_BTN2, "JOY_BTN2" },  { JOY_BTN3, "JOY_BTN3" },  { JOY_BTN4, "JOY_BTN4" },  { JOY_BTN5, "JOY_BTN5" },  { JOY_BTN6, "JOY_BTN6" },  { JOY_BTN7, "JOY_BTN7" },  { JOY_BTN8, "JOY_BTN8" },  { JOY_BTN9, "JOY_BTN9" },  { KEY_XF86_PAUSE, "XF86_PAUSE" },  { KEY_XF86_STOP, "XF86_STOP" },  { KEY_XF86_PREV, "XF86_PREV" },  { KEY_XF86_NEXT, "XF86_NEXT" },  { 0, NULL }};// This is the default binding. The content of input.conf overrides these.// The first arg is a null terminated array of key codes.// The second is the commandstatic mp_cmd_bind_t def_cmd_binds[] = {  { {  MOUSE_BTN3, 0 }, "seek 10" },  { {  MOUSE_BTN4, 0 }, "seek -10" },  { {  MOUSE_BTN5, 0 }, "volume 1" },  { {  MOUSE_BTN6, 0 }, "volume -1" },  #ifdef USE_DVDNAV  { { 'K', 0 }, "dvdnav 1" },   // up  { { 'J', 0 }, "dvdnav 2" },   // down  { { 'H', 0 }, "dvdnav 3" },   // left  { { 'L', 0 }, "dvdnav 4" },   // right  { { 'M', 0 }, "dvdnav 5" },   // menu  { { 'S', 0 }, "dvdnav 6" },   // select#endif  { { KEY_RIGHT, 0 }, "seek 10" },  { {  KEY_LEFT, 0 }, "seek -10" },  { {  KEY_UP, 0 }, "seek 60" },  { {  KEY_DOWN, 0 }, "seek -60" },  { {  KEY_PAGE_UP, 0 }, "seek 600" },  { { KEY_PAGE_DOWN, 0 }, "seek -600" },  { { '-', 0 }, "audio_delay 0.100" },  { { '+', 0 }, "audio_delay -0.100" },  { { '[', 0 }, "speed_mult 0.9091" },  { { ']', 0 }, "speed_mult 1.1" },  { { '{', 0 }, "speed_mult 0.5" },  { { '}', 0 }, "speed_mult 2.0" },  { { KEY_BACKSPACE, 0 }, "speed_set 1.0" },  { { 'q', 0 }, "quit" },  { { KEY_ESC, 0 }, "quit" },#ifndef HAVE_NEW_GUI  { { 'p', 0 }, "pause" },#endif  { { ' ', 0 }, "pause" },  { { '.', 0 }, "frame_step" },  { { KEY_HOME, 0 }, "pt_up_step 1" },  { { KEY_END, 0 }, "pt_up_step -1" },  { { '>', 0 }, "pt_step 1" },#ifndef HAVE_NEW_GUI  { { KEY_ENTER, 0 }, "pt_step 1 1" },#endif  { { '<', 0 }, "pt_step -1" },  { { KEY_INS, 0 }, "alt_src_step 1" },  { { KEY_DEL, 0 }, "alt_src_step -1" },  { { 'o', 0 }, "osd" },  { { 'z', 0 }, "sub_delay -0.1" },  { { 'x', 0 }, "sub_delay +0.1" },  { { 'g', 0 }, "sub_step -1" },  { { 'y', 0 }, "sub_step +1" },  { { '9', 0 }, "volume -1" },  { { '/', 0 }, "volume -1" },  { { '0', 0 }, "volume 1" },  { { '*', 0 }, "volume 1" },  { { 'm', 0 }, "mute" },  { { '1', 0 }, "contrast -1" },  { { '2', 0 }, "contrast 1" },  { { '3', 0 }, "brightness -1" },  { { '4', 0 }, "brightness 1" },  { { '5', 0 }, "hue -1" },  { { '6', 0 }, "hue 1" },  { { '7', 0 }, "saturation -1" },  { { '8', 0 }, "saturation 1" },  { { 'd', 0 }, "frame_drop" },  { { 'r', 0 }, "sub_pos -1" },  { { 't', 0 }, "sub_pos +1" },  { { 'a', 0 }, "sub_alignment" },  { { 'v', 0 }, "sub_visibility" },  { { 'b', 0 }, "sub_select" },  { { 'j', 0 }, "vobsub_lang" },  { { 'F', 0 }, "forced_subs_only" },  { { '#', 0 }, "switch_audio" },#ifdef USE_EDL  { { 'i', 0 }, "edl_mark" },#endif#ifdef USE_TV  { { 'h', 0 }, "tv_step_channel 1" },  { { 'k', 0 }, "tv_step_channel -1" },  { { 'n', 0 }, "tv_step_norm" },  { { 'u', 0 }, "tv_step_chanlist" },#endif#ifdef HAVE_NEW_GUI  { { 'l', 0 }, "gui_loadfile" },  { { 't', 0 }, "gui_loadsubtitle" },  { { KEY_ENTER, 0 }, "gui_play" },  { { 's', 0 }, "gui_stop" },  { { 'p', 0 }, "gui_playlist" },  { { 'r', 0 }, "gui_preferences" },  { { 'c', 0 }, "gui_skinbrowser" },#endif#ifdef HAVE_JOYSTICK  { { JOY_AXIS0_PLUS, 0 }, "seek 10" },  { { JOY_AXIS0_MINUS, 0 }, "seek -10" },  { { JOY_AXIS1_MINUS, 0 }, "seek 60" },  { { JOY_AXIS1_PLUS, 0 }, "seek -60" },  { { JOY_BTN0, 0 }, "pause" },  { { JOY_BTN1, 0 }, "osd" },  { { JOY_BTN2, 0 }, "volume 1"},  { { JOY_BTN3, 0 }, "volume -1"},#endif  { { 'T', 0 }, "vo_ontop" },  { { 'f', 0 }, "vo_fullscreen" },  { { 's', 0 }, "screenshot" },  { { 'w', 0 }, "panscan -0.1" },  { { 'e', 0 }, "panscan +0.1" },  { { KEY_XF86_PAUSE, 0 }, "pause" },  { { KEY_XF86_STOP, 0 }, "quit" },  { { KEY_XF86_PREV, 0 }, "seek -60" },  { { KEY_XF86_NEXT, 0 }, "seek +60" },  { { 0 }, NULL }};#ifndef MP_MAX_KEY_FD#define MP_MAX_KEY_FD 10#endif#ifndef MP_MAX_CMD_FD#define MP_MAX_CMD_FD 10#endif#define MP_FD_EOF (1<<0)#define MP_FD_DROP (1<<1)#define MP_FD_DEAD (1<<2)#define MP_FD_GOT_CMD (1<<3)#define MP_FD_NO_SELECT (1<<4)#define CMD_QUEUE_SIZE 100typedef struct mp_input_fd {  int fd;  void* read_func;  mp_close_func_t close_func;  int flags;  // These fields are for the cmd fds.  char* buffer;  int pos,size;} mp_input_fd_t;typedef struct mp_cmd_filter_st mp_cmd_filter_t;struct mp_cmd_filter_st {  mp_input_cmd_filter filter;  void* ctx;  mp_cmd_filter_t* next;};// These are the user defined bindsstatic mp_cmd_bind_t* cmd_binds = NULL;static mp_cmd_filter_t* cmd_filters = NULL;// Callback to allow the menu filter to grab the incoming keysvoid (*mp_input_key_cb)(int code) = NULL;static mp_input_fd_t key_fds[MP_MAX_KEY_FD];static unsigned int num_key_fd = 0;static mp_input_fd_t cmd_fds[MP_MAX_CMD_FD];static unsigned int num_cmd_fd = 0;static mp_cmd_t* cmd_queue[CMD_QUEUE_SIZE];static unsigned int cmd_queue_length = 0,cmd_queue_start = 0, cmd_queue_end = 0;// this is the key currently downstatic int key_down[MP_MAX_KEY_DOWN];static unsigned int num_key_down = 0, last_key_down = 0;// Autorepeat stuffstatic short ar_state = -1;static mp_cmd_t* ar_cmd = NULL;static unsigned int ar_delay = 100, ar_rate = 8, last_ar = 0;static int use_joystick = 1, use_lirc = 1, use_lircc = 1;static char* config_file = "input.conf";static char* js_dev = NULL;static char* in_file = NULL;static int in_file_fd = -1;static int mp_input_print_key_list(m_option_t* cfg);static int mp_input_print_cmd_list(m_option_t* cfg);// Our command line optionsstatic m_option_t input_conf[] = {  { "conf", &config_file, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL },  { "ar-delay", &ar_delay, CONF_TYPE_INT, CONF_GLOBAL, 0, 0, NULL },  { "ar-rate", &ar_rate, CONF_TYPE_INT, CONF_GLOBAL, 0, 0, NULL },  { "keylist", mp_input_print_key_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },  { "cmdlist", mp_input_print_cmd_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },  { "js-dev", &js_dev, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL },  { "file", &in_file, CONF_TYPE_STRING, CONF_GLOBAL, 0, 0, NULL },  { NULL, NULL, 0, 0, 0, 0, NULL}};static m_option_t mp_input_opts[] = {  { "input", &input_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},  { "nojoystick", &use_joystick,  CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL },  { "joystick", &use_joystick,  CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL },  { "nolirc", &use_lirc, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL },  { "lirc", &use_lirc, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL },  { "nolircc", &use_lircc, CONF_TYPE_FLAG, CONF_GLOBAL, 1, 0, NULL },  { "lircc", &use_lircc, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL },  { NULL, NULL, 0, 0, 0, 0, NULL}};static intmp_input_default_key_func(int fd);static intmp_input_default_cmd_func(int fd,char* buf, int l);static char*mp_input_get_key_name(int key);intmp_input_add_cmd_fd(int fd, int select, mp_cmd_func_t read_func, mp_close_func_t close_func) {  if(num_cmd_fd == MP_MAX_CMD_FD) {    mp_msg(MSGT_INPUT,MSGL_ERR,"Too many command fds, unable to register fd %d.\n",fd);    return 0;  }  memset(&cmd_fds[num_cmd_fd],0,sizeof(mp_input_fd_t));  cmd_fds[num_cmd_fd].fd = fd;  cmd_fds[num_cmd_fd].read_func = read_func ? read_func : mp_input_default_cmd_func;  cmd_fds[num_cmd_fd].close_func = close_func;  if(!select)    cmd_fds[num_cmd_fd].flags = MP_FD_NO_SELECT;  num_cmd_fd++;  return 1;}voidmp_input_rm_cmd_fd(int fd) {  unsigned int i;  for(i = 0; i < num_cmd_fd; i++) {    if(cmd_fds[i].fd == fd)      break;  }  if(i == num_cmd_fd)    return;  if(cmd_fds[i].close_func)    cmd_fds[i].close_func(cmd_fds[i].fd);  if(cmd_fds[i].buffer)    free(cmd_fds[i].buffer);  if(i + 1 < num_cmd_fd)    memmove(&cmd_fds[i],&cmd_fds[i+1],(num_cmd_fd - i - 1)*sizeof(mp_input_fd_t));  num_cmd_fd--;}voidmp_input_rm_key_fd(int fd) {  unsigned int i;  for(i = 0; i < num_key_fd; i++) {    if(key_fds[i].fd == fd)      break;  }  if(i == num_key_fd)    return;  if(key_fds[i].close_func)    key_fds[i].close_func(key_fds[i].fd);  if(i + 1 < num_key_fd)    memmove(&key_fds[i],&key_fds[i+1],(num_key_fd - i - 1)*sizeof(mp_input_fd_t));  num_key_fd--;}intmp_input_add_key_fd(int fd, int select, mp_key_func_t read_func, mp_close_func_t close_func) {  if(num_key_fd == MP_MAX_KEY_FD) {    mp_msg(MSGT_INPUT,MSGL_ERR,"Too many key fds, unable to register fd %d.\n",fd);    return 0;  }  memset(&key_fds[num_key_fd],0,sizeof(mp_input_fd_t));  key_fds[num_key_fd].fd = fd;  key_fds[num_key_fd].read_func = read_func ? read_func : mp_input_default_key_func;  key_fds[num_key_fd].close_func = close_func;  if(!select)    key_fds[num_key_fd].flags |= MP_FD_NO_SELECT;  num_key_fd++;  return 1;}mp_cmd_t*mp_input_parse_cmd(char* str) {  int i,l;  int pausing = 0;  char *ptr,*e;  mp_cmd_t *cmd, *cmd_def;#ifdef MP_DEBUG  assert(str != NULL);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -