📄 rc.c
字号:
/* logo on the fly items */ var_Create( p_intf, "logo-file", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "logo-file", Other, NULL ); var_Create( p_intf, "logo-x", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "logo-x", Other, NULL ); var_Create( p_intf, "logo-y", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "logo-y", Other, NULL ); var_Create( p_intf, "logo-position", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "logo-position", Other, NULL ); var_Create( p_intf, "logo-transparency", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "logo-transparency", Other, NULL ); var_Create( p_intf, "pause", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "pause", Input, NULL ); var_Create( p_intf, "seek", VLC_VAR_INTEGER | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "seek", Input, NULL ); var_Create( p_intf, "title", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "title", Input, NULL ); var_Create( p_intf, "title_n", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "title_n", Input, NULL ); var_Create( p_intf, "title_p", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "title_p", Input, NULL ); var_Create( p_intf, "chapter", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "chapter", Input, NULL ); var_Create( p_intf, "chapter_n", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "chapter_n", Input, NULL ); var_Create( p_intf, "chapter_p", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "chapter_p", Input, NULL ); var_Create( p_intf, "fastforward", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "fastforward", Input, NULL ); var_Create( p_intf, "rewind", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "rewind", Input, NULL ); var_Create( p_intf, "volume", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "volume", Volume, NULL ); var_Create( p_intf, "volup", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "volup", VolumeMove, NULL ); var_Create( p_intf, "voldown", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "voldown", VolumeMove, NULL ); var_Create( p_intf, "adev", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "adev", AudioConfig, NULL ); var_Create( p_intf, "achan", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "achan", AudioConfig, NULL );#ifdef WIN32 /* Get the file descriptor of the console input */ p_intf->p_sys->hConsoleIn = GetStdHandle(STD_INPUT_HANDLE); if( p_intf->p_sys->hConsoleIn == INVALID_HANDLE_VALUE ) { msg_Err( p_intf, "Couldn't open STD_INPUT_HANDLE" ); p_intf->b_die = VLC_TRUE; }#endif while( !p_intf->b_die ) { char *psz_cmd, *psz_arg; vlc_bool_t b_complete; if( p_intf->p_sys->i_socket_listen != - 1 && p_intf->p_sys->i_socket == -1 ) { p_intf->p_sys->i_socket = net_Accept( p_intf, p_intf->p_sys->i_socket_listen, 0 ); } b_complete = ReadCommand( p_intf, p_buffer, &i_size ); /* Manage the input part */ if( p_input == NULL ) { if( p_playlist ) { p_input = vlc_object_find( p_playlist, VLC_OBJECT_INPUT, FIND_CHILD ); } else { p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); if( p_input ) { p_playlist = vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_PARENT ); } } } else if( p_input->b_dead ) { vlc_object_release( p_input ); p_input = NULL; } if( p_input && b_showpos ) { i_newpos = 100 * var_GetFloat( p_input, "position" ); if( i_oldpos != i_newpos ) { i_oldpos = i_newpos; msg_rc( "pos: %d%%\n", i_newpos ); } } /* Is there something to do? */ if( !b_complete ) continue; /* Skip heading spaces */ psz_cmd = p_buffer; while( *psz_cmd == ' ' ) { psz_cmd++; } /* Split psz_cmd at the first space and make sure that * psz_arg is valid */ psz_arg = strchr( psz_cmd, ' ' ); if( psz_arg ) { *psz_arg++ = 0; while( *psz_arg == ' ' ) { psz_arg++; } } else { psz_arg = ""; } /* If the user typed a registered local command, try it */ if( var_Type( p_intf, psz_cmd ) & VLC_VAR_ISCOMMAND ) { vlc_value_t val; int i_ret; val.psz_string = psz_arg; i_ret = var_Set( p_intf, psz_cmd, val ); msg_rc( "%s: returned %i (%s)\n", psz_cmd, i_ret, vlc_error( i_ret ) ); } /* Or maybe it's a global command */ else if( var_Type( p_intf->p_libvlc, psz_cmd ) & VLC_VAR_ISCOMMAND ) { vlc_value_t val; int i_ret; val.psz_string = psz_arg; /* FIXME: it's a global command, but we should pass the * local object as an argument, not p_intf->p_libvlc. */ i_ret = var_Set( p_intf->p_libvlc, psz_cmd, val ); if( i_ret != 0 ) { msg_rc( "%s: returned %i (%s)\n", psz_cmd, i_ret, vlc_error( i_ret ) ); } } else if( !strcmp( psz_cmd, "logout" ) ) { /* Close connection */ if( p_intf->p_sys->i_socket != -1 ) { net_Close( p_intf->p_sys->i_socket ); } p_intf->p_sys->i_socket = -1; } else if( !strcmp( psz_cmd, "info" ) ) { if( p_input ) { int i, j; vlc_mutex_lock( &p_input->input.p_item->lock ); for ( i = 0; i < p_input->input.p_item->i_categories; i++ ) { info_category_t *p_category = p_input->input.p_item->pp_categories[i]; msg_rc( "+----[ %s ]\n", p_category->psz_name ); msg_rc( "| \n" ); for ( j = 0; j < p_category->i_infos; j++ ) { info_t *p_info = p_category->pp_infos[j]; msg_rc( "| %s: %s\n", p_info->psz_name, p_info->psz_value ); } msg_rc( "| \n" ); } msg_rc( "+----[ end of stream info ]\n" ); vlc_mutex_unlock( &p_input->input.p_item->lock ); } else { msg_rc( "no input\n" ); } } else if( !strcmp( psz_cmd, "is_playing" ) ) { if( ! p_input ) { msg_rc( "0\n" ); } else { msg_rc( "1\n" ); } } else if( !strcmp( psz_cmd, "get_time" ) ) { if( ! p_input ) { msg_rc("0\n"); } else { vlc_value_t time; var_Get( p_input, "time", &time ); msg_rc( "%i\n", time.i_time / 1000000); } } else if( !strcmp( psz_cmd, "get_length" ) ) { if( ! p_input ) { msg_rc("0\n"); } else { vlc_value_t time; var_Get( p_input, "length", &time ); msg_rc( "%i\n", time.i_time / 1000000); } } else if( !strcmp( psz_cmd, "get_title" ) ) { if( ! p_input ) { msg_rc("\n"); } else { msg_rc( "%s\n", p_input->input.p_item->psz_name ); } } else if( !strcmp( psz_cmd, "longhelp" ) || !strncmp( psz_cmd, "h", 1 ) || !strncmp( psz_cmd, "H", 1 ) || !strncmp( psz_cmd, "?", 1 ) ) { if( !strcmp( psz_cmd, "longhelp" ) || !strncmp( psz_cmd, "H", 1 ) ) b_longhelp = VLC_TRUE; else b_longhelp = VLC_FALSE; msg_rc(_("+----[ Remote control commands ]\n")); msg_rc( "| \n"); msg_rc(_("| add XYZ . . . . . . . . . . add XYZ to playlist\n")); msg_rc(_("| playlist . . . show items currently in playlist\n")); msg_rc(_("| play . . . . . . . . . . . . . . . . play stream\n")); msg_rc(_("| stop . . . . . . . . . . . . . . . . stop stream\n")); msg_rc(_("| next . . . . . . . . . . . . next playlist item\n")); msg_rc(_("| prev . . . . . . . . . . previous playlist item\n")); msg_rc(_("| goto . . . . . . . . . . . . goto item at index\n")); msg_rc(_("| title [X] . . . . set/get title in current item\n")); msg_rc(_("| title_n . . . . . . next title in current item\n")); msg_rc(_("| title_p . . . . previous title in current item\n")); msg_rc(_("| chapter [X] . . set/get chapter in current item\n")); msg_rc(_("| chapter_n . . . . next chapter in current item\n")); msg_rc(_("| chapter_p . . previous chapter in current item\n")); msg_rc( "| \n"); msg_rc(_("| seek X . seek in seconds, for instance `seek 12'\n")); msg_rc(_("| pause . . . . . . . . . . . . . . toggle pause\n")); msg_rc(_("| fastforward . . . . . . . set to maximum rate\n")); msg_rc(_("| rewind . . . . . . . . . . set to minimum rate\n")); msg_rc(_("| f . . . . . . . . . . . . . . toggle fullscreen\n")); msg_rc(_("| info . . . information about the current stream\n")); msg_rc( "| \n"); msg_rc(_("| volume [X] . . . . . . . . set/get audio volume\n")); msg_rc(_("| volup [X] . . . . . raise audio volume X steps\n")); msg_rc(_("| voldown [X] . . . . lower audio volume X steps\n")); msg_rc(_("| adev [X] . . . . . . . . . set/get audio device\n")); msg_rc(_("| achan [X]. . . . . . . . set/get audio channels\n")); msg_rc( "| \n"); if (b_longhelp) { msg_rc(_("| marq-marquee STRING . . overlay STRING in video\n")); msg_rc(_("| marq-x X . . . . . . . . . . . .offset from left\n")); msg_rc(_("| marq-y Y . . . . . . . . . . . . offset from top\n")); msg_rc(_("| marq-position #. . . .relative position control\n")); msg_rc(_("| marq-color # . . . . . . . . . . font color, RGB\n")); msg_rc(_("| marq-opacity # . . . . . . . . . . . . . opacity\n")); msg_rc(_("| marq-timeout T. . . . . . . . . . timeout, in ms\n")); msg_rc(_("| marq-size # . . . . . . . . font size, in pixels\n")); msg_rc( "| \n"); msg_rc(_("| time-format STRING . . . overlay STRING in video\n")); msg_rc(_("| time-x X . . . . . . . . . . . .offset from left\n")); msg_rc(_("| time-y Y . . . . . . . . . . . . offset from top\n")); msg_rc(_("| time-position #. . . . . . . . relative position\n")); msg_rc(_("| time-color # . . . . . . . . . . font color, RGB\n")); msg_rc(_("| time-opacity # . . . . . . . . . . . . . opacity\n")); msg_rc(_("| time-size # . . . . . . . . font size, in pixels\n")); msg_rc( "| \n"); msg_rc(_("| logo-file STRING . . . the overlay file path/name\n")); msg_rc(_("| logo-x X . . . . . . . . . . . .offset from left\n")); msg_rc(_("| logo-y Y . . . . . . . . . . . . offset from top\n")); msg_rc(_("| logo-position #. . . . . . . . relative position\n")); msg_rc(_("| logo-transparency #. . . . . . . . .transparency\n")); msg_rc( "| \n"); msg_rc(_("| mosaic-alpha # . . . . . . . . . . . . . . alpha\n")); msg_rc(_("| mosaic-height #. . . . . . . . . . . . . .height\n")); msg_rc(_("| mosaic-width # . . . . . . . . . . . . . . width\n")); msg_rc(_("| mosaic-xoffset # . . . .top left corner position\n")); msg_rc(_("| mosaic-yoffset # . . . .top left corner position\n")); msg_rc(_("| mosaic-align 0..2,4..6,8..10. . .mosaic alignment\n")); msg_rc(_("| mosaic-vborder # . . . . . . . . vertical border\n")); msg_rc(_("| mosaic-hborder # . . . . . . . horizontal border\n")); msg_rc(_("| mosaic-position {0=auto,1=fixed} . . . .position\n")); msg_rc(_("| mosaic-rows #. . . . . . . . . . .number of rows\n")); msg_rc(_("| mosaic-cols #. . . . . . . . . . .number of cols\n")); msg_rc(_("| mosaic-keep-aspect-ratio {0,1} . . .aspect ratio\n")); msg_rc( "| \n"); } msg_rc(_("| help . . . . . . . . . . . . . this help message\n")); msg_rc(_("| longhelp . . . . . . . . . a longer help message\n")); msg_rc(_("| logout . . . . . exit (if in socket connection)\n")); msg_rc(_("| quit . . . . . . . . . . . . . . . . . quit vlc\n")); msg_rc( "| \n"); msg_rc(_("+----[ end of help ]\n")); } else switch( psz_cmd[0] ) { case 'f': case 'F': if( p_input ) { vout_thread_t *p_vout; p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( p_vout ) { p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; vlc_object_release( p_vout ); } } break; case 's': case 'S': ; break; case '\0': /* Ignore empty lines */ break; default: msg_rc(_("unknown command `%s', type `help' for help\n"), psz_cmd); break; } /* Command processed */ i_size = 0; p_buffer[0] = 0; } if( p_input ) { vlc_object_release( p_input ); p_input = NULL; } if( p_playlist ) { vlc_object_release( p_playlist ); p_playlist = NULL; }}static int Input( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ intf_thread_t *p_intf = (intf_thread_t*)p_this; input_thread_t *p_input; vlc_value_t val; p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE ); if( !p_input ) return VLC_ENOOBJ; /* Parse commands that only require an input */ if( !strcmp( psz_cmd, "pause" ) ) { val.i_int = PAUSE_S; var_Set( p_input, "state", val ); vlc_object_release( p_input ); return VLC_SUCCESS; } else if( !strcmp( psz_cmd, "seek" ) ) { if( strlen( newval.psz_string ) > 0 && newval.psz_string[strlen( newval.psz_string ) - 1] == '%' ) { val.f_float = (float)atoi( newval.psz_string ) / 100.0; var_Set( p_input, "position", val ); } else { val.i_time = ((int64_t)atoi( newval.psz_string )) * 1000000; var_Set( p_input, "time", val ); } vlc_object_release( p_input ); return VLC_SUCCESS; } else if ( !strcmp( psz_cmd, "fastforward" ) ) { val.i_int = INPUT_RATE_MAX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -