X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Frc.c;h=e771248ddc2d9235d5c8858cef1b2b5c2441c381;hb=0274be8790164dccf71b9f4574b57a47e4a88c70;hp=94c485816525fa684f07366e99b0c627ebb7d774;hpb=48c2ac8c879a83c4f8737b978ca9c3232bb2e70d;p=vlc diff --git a/modules/control/rc.c b/modules/control/rc.c index 94c4858165..e771248ddc 100644 --- a/modules/control/rc.c +++ b/modules/control/rc.c @@ -25,8 +25,11 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include #include /* ENOMEM */ #include @@ -96,7 +99,11 @@ static int AudioConfig ( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); static int Menu ( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); -#ifdef UPDATE_CHECK +static int Statistics ( vlc_object_t *, char const *, + vlc_value_t, vlc_value_t, void * ); + +static int updateStatistics( intf_thread_t *, input_item_t *); +#if 0 && defined( UPDATE_CHECK ) static void checkUpdates( intf_thread_t *p_intf ); #endif @@ -126,10 +133,7 @@ struct intf_sys_t #endif }; -#ifdef HAVE_VARIADIC_MACROS -# define msg_rc( psz_format, args... ) \ - __msg_rc( p_intf, psz_format, ## args ) -#endif +#define msg_rc( ... ) __msg_rc( p_intf, __VA_ARGS__ ) static void __msg_rc( intf_thread_t *p_intf, const char *psz_fmt, ... ) { @@ -420,6 +424,9 @@ static void RegisterCallbacks( intf_thread_t *p_intf ) ADD( "adev", STRING, AudioConfig ) ADD( "achan", STRING, AudioConfig ) + /* misc menu commands */ + ADD( "stats", BOOL, Statistics ) + #undef ADD } @@ -577,7 +584,6 @@ static void Run( intf_thread_t *p_intf ) /* Is there something to do? */ if( !b_complete ) continue; - /* Skip heading spaces */ psz_cmd = p_buffer; while( *psz_cmd == ' ' ) @@ -598,7 +604,7 @@ static void Run( intf_thread_t *p_intf ) } else { - psz_arg = ""; + psz_arg = (char*)""; } /* module specfic commands: @ */ @@ -752,7 +758,7 @@ static void Run( intf_thread_t *p_intf ) Help( p_intf, b_longhelp ); } -#ifdef UPDATE_CHECK +#if 0 && defined( UPDATE_CHECK ) else if( !strcmp( psz_cmd, "check-updates" ) ) { checkUpdates( p_intf ); @@ -874,6 +880,7 @@ static void Help( intf_thread_t *p_intf, vlc_bool_t b_longhelp) msg_rc(_("| normal . . . . . . . . . . normal playing of stream")); msg_rc(_("| f [on|off] . . . . . . . . . . . . toggle fullscreen")); msg_rc(_("| info . . . . . information about the current stream")); + msg_rc(_("| stats . . . . . . . . show statistical information")); msg_rc(_("| get_time . . seconds elapsed since stream's beginning")); msg_rc(_("| is_playing . . . . 1 if a stream plays, 0 otherwise")); msg_rc(_("| get_title . . . . . the title of the current stream")); @@ -926,7 +933,7 @@ static void Help( intf_thread_t *p_intf, vlc_bool_t b_longhelp) msg_rc(_("| @name mosaic-cols #. . . . . . . . . . .number of cols")); msg_rc(_("| @name mosaic-order id(,id)* . . . . order of pictures ")); msg_rc(_("| @name mosaic-keep-aspect-ratio {0,1} . . .aspect ratio")); -#ifdef UPDATE_CHECK +#if 0 && defined( UPDATE_CHECK ) msg_rc( "| "); msg_rc(_("| check-updates [newer] [equal] [older]\n" "| [undef] [info] [source] [binary] [plugin]")); @@ -947,6 +954,8 @@ static void Help( intf_thread_t *p_intf, vlc_bool_t b_longhelp) static int TimeOffsetChanged( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); + VLC_UNUSED(oldval); VLC_UNUSED(newval); intf_thread_t *p_intf = (intf_thread_t*)p_data; input_thread_t *p_input = NULL; @@ -965,6 +974,7 @@ static int TimeOffsetChanged( vlc_object_t *p_this, char const *psz_cmd, static int VolumeChanged( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(newval); intf_thread_t *p_intf = (intf_thread_t*)p_data; vlc_mutex_lock( &p_intf->p_sys->status_lock ); @@ -977,6 +987,7 @@ static int VolumeChanged( vlc_object_t *p_this, char const *psz_cmd, static int StateChanged( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); intf_thread_t *p_intf = (intf_thread_t*)p_data; playlist_t *p_playlist = NULL; input_thread_t *p_input = NULL; @@ -988,21 +999,20 @@ static int StateChanged( vlc_object_t *p_this, char const *psz_cmd, p_playlist = vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_PARENT ); if( p_playlist ) { - char cmd[5] = ""; + char cmd[6]; switch( p_playlist->status.i_status ) { case PLAYLIST_STOPPED: - strncpy( &cmd[0], "stop", 4); - cmd[4] = '\0'; + strcpy( cmd, "stop" ); break; case PLAYLIST_RUNNING: - strncpy( &cmd[0], "play", 4); - cmd[4] = '\0'; + strcpy( cmd, "play" ); break; case PLAYLIST_PAUSED: - strncpy( &cmd[0], "pause", 5); - cmd[5] = '\0'; + strcpy( cmd, "pause" ); break; + default: + cmd[0] = '\0'; } /* var_GetInteger( p_input, "state" ) */ msg_rc( STATUS_CHANGE "( %s state: %d )", &cmd[0], newval.i_int ); vlc_object_release( p_playlist ); @@ -1016,6 +1026,8 @@ static int StateChanged( vlc_object_t *p_this, char const *psz_cmd, static int RateChanged( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); + VLC_UNUSED(oldval); VLC_UNUSED(newval); intf_thread_t *p_intf = (intf_thread_t*)p_data; input_thread_t *p_input = NULL; @@ -1037,6 +1049,7 @@ static int RateChanged( vlc_object_t *p_this, char const *psz_cmd, static int Input( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; input_thread_t *p_input; vlc_value_t val; @@ -1257,7 +1270,7 @@ static int Input( vlc_object_t *p_this, char const *psz_cmd, &val, &text ); msg_rc( "+----[ end of %s ]", val_name.psz_string ); - if( val_name.psz_string ) free( val_name.psz_string ); + free( val_name.psz_string ); i_error = VLC_SUCCESS; } @@ -1273,6 +1286,7 @@ static int Input( vlc_object_t *p_this, char const *psz_cmd, static int Playlist( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(oldval); VLC_UNUSED(p_data); vlc_value_t val; intf_thread_t *p_intf = (intf_thread_t*)p_this; @@ -1409,9 +1423,12 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, if( p_item ) { msg_rc( "Trying to add %s to playlist.", newval.psz_string ); - playlist_AddInput( p_playlist, p_item, + if( playlist_AddInput( p_playlist, p_item, PLAYLIST_GO|PLAYLIST_APPEND, PLAYLIST_END, VLC_TRUE, - VLC_FALSE ); + VLC_FALSE ) != VLC_SUCCESS ); + { + return VLC_EGENERIC; + } } } else if( !strcmp( psz_cmd, "enqueue" ) && @@ -1422,9 +1439,12 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, if( p_item ) { msg_rc( "trying to enqueue %s to playlist", newval.psz_string ); - playlist_AddInput( p_playlist, p_item, + if( playlist_AddInput( p_playlist, p_item, PLAYLIST_APPEND, PLAYLIST_END, VLC_TRUE, - VLC_FALSE); + VLC_FALSE ) != VLC_SUCCESS ) + { + return VLC_EGENERIC; + } } } else if( !strcmp( psz_cmd, "playlist" ) ) @@ -1451,7 +1471,7 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, msg_rc( STATUS_CHANGE "( audio volume: %d )", config_GetInt( p_intf, "volume" )); - vlc_mutex_lock( &p_playlist->object_lock ); + PL_LOCK; switch( p_playlist->status.i_status ) { case PLAYLIST_STOPPED: @@ -1467,7 +1487,7 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, msg_rc( STATUS_CHANGE "( state unknown )" ); break; } - vlc_mutex_unlock( &p_playlist->object_lock ); + PL_UNLOCK; } } @@ -1486,6 +1506,8 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, static int Quit( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(p_data); VLC_UNUSED(psz_cmd); + VLC_UNUSED(oldval); VLC_UNUSED(newval); playlist_t *p_playlist; p_playlist = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); @@ -1501,6 +1523,7 @@ static int Quit( vlc_object_t *p_this, char const *psz_cmd, static int Intf( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_newintf = NULL; p_newintf = intf_Create( p_this->p_libvlc, newval.psz_string, 0, NULL ); @@ -1519,6 +1542,7 @@ static int Intf( vlc_object_t *p_this, char const *psz_cmd, static int Volume( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; input_thread_t *p_input = NULL; int i_error = VLC_EGENERIC; @@ -1586,6 +1610,7 @@ static int Volume( vlc_object_t *p_this, char const *psz_cmd, static int VolumeMove( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; audio_volume_t i_volume; input_thread_t *p_input = NULL; @@ -1637,6 +1662,7 @@ static int VolumeMove( vlc_object_t *p_this, char const *psz_cmd, static int VideoConfig( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; input_thread_t *p_input = NULL; vout_thread_t * p_vout; @@ -1752,7 +1778,7 @@ static int VideoConfig( vlc_object_t *p_this, char const *psz_cmd, &val, &text ); msg_rc( "+----[ end of %s ]", val_name.psz_string ); - if( val_name.psz_string ) free( val_name.psz_string ); + free( val_name.psz_string ); i_error = VLC_SUCCESS; } @@ -1763,6 +1789,7 @@ static int VideoConfig( vlc_object_t *p_this, char const *psz_cmd, static int AudioConfig( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; input_thread_t *p_input = NULL; aout_instance_t * p_aout; @@ -1838,7 +1865,7 @@ static int AudioConfig( vlc_object_t *p_this, char const *psz_cmd, &val, &text ); msg_rc( "+----[ end of %s ]", val_name.psz_string ); - if( val_name.psz_string ) free( val_name.psz_string ); + free( val_name.psz_string ); i_error = VLC_SUCCESS; } else @@ -1857,6 +1884,7 @@ static int AudioConfig( vlc_object_t *p_this, char const *psz_cmd, static int Menu( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ) { + VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data); intf_thread_t *p_intf = (intf_thread_t*)p_this; playlist_t *p_playlist = NULL; vlc_value_t val; @@ -1905,15 +1933,96 @@ static int Menu( vlc_object_t *p_this, char const *psz_cmd, { msg_rc( _("Please provide one of the following parameters:") ); msg_rc( "[on|off|up|down|left|right|select]" ); - if( val.psz_string ) free( val.psz_string ); - return i_error; + free( val.psz_string ); + return i_error; } i_error = VLC_SUCCESS; - if( val.psz_string ) free( val.psz_string ); + free( val.psz_string ); return i_error; } +static int Statistics ( vlc_object_t *p_this, char const *psz_cmd, + vlc_value_t oldval, vlc_value_t newval, void *p_data ) +{ + VLC_UNUSED(oldval); VLC_UNUSED(newval); VLC_UNUSED(p_data); + intf_thread_t *p_intf = (intf_thread_t*)p_this; + input_thread_t *p_input = NULL; + int i_error; + + p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( !p_input ) + return VLC_ENOOBJ; + + if( !strcmp( psz_cmd, "stats" ) ) + { + vlc_mutex_lock( &input_GetItem(p_input)->lock ); + updateStatistics( p_intf, input_GetItem(p_input) ); + vlc_mutex_unlock( &input_GetItem(p_input)->lock ); + } + /* + * sanity check + */ + else + { + msg_rc(_("Unknown command!") ); + } + + vlc_object_release( p_input ); + i_error = VLC_SUCCESS; + return i_error; +} + +static int updateStatistics( intf_thread_t *p_intf, input_item_t *p_item ) +{ + if( !p_item ) return VLC_EGENERIC; + + vlc_mutex_lock( &p_item->p_stats->lock ); + msg_rc( "+----[ begin of statistical info ]" ); + + /* Input */ + msg_rc(_("+-[Incoming]")); + msg_rc(_("| input bytes read : %8.0f kB"), + (float)(p_item->p_stats->i_read_bytes)/1000 ); + msg_rc(_("| input bitrate : %6.0f kb/s"), + (float)(p_item->p_stats->f_input_bitrate)*8000 ); + msg_rc(_("| demux bytes read : %8.0f kB"), + (float)(p_item->p_stats->i_demux_read_bytes)/1000 ); + msg_rc(_("| demux bitrate : %6.0f kb/s"), + (float)(p_item->p_stats->f_demux_bitrate)*8000 ); + msg_rc("|"); + /* Video */ + msg_rc(_("+-[Video Decoding]")); + msg_rc(_("| video decoded : %5i"), + p_item->p_stats->i_decoded_video ); + msg_rc(_("| frames displayed : %5i"), + p_item->p_stats->i_displayed_pictures ); + msg_rc(_("| frames lost : %5i"), + p_item->p_stats->i_lost_pictures ); + msg_rc("|"); + /* Audio*/ + msg_rc(_("+-[Audio Decoding]")); + msg_rc(_("| audio decoded : %5i"), + p_item->p_stats->i_decoded_audio ); + msg_rc(_("| buffers played : %5i"), + p_item->p_stats->i_played_abuffers ); + msg_rc(_("| buffers lost : %5i"), + p_item->p_stats->i_lost_abuffers ); + msg_rc("|"); + /* Sout */ + msg_rc(_("+-[Streaming]")); + msg_rc(_("| packets sent : %5i"), p_item->p_stats->i_sent_packets ); + msg_rc(_("| bytes sent : %8.0f kB"), + (float)(p_item->p_stats->i_sent_bytes)/1000 ); + msg_rc(_("| sending bitrate : %6.0f kb/s"), + (float)(p_item->p_stats->f_send_bitrate*8)*1000 ); + msg_rc("|"); + msg_rc( "+----[ end of statistical info ]" ); + vlc_mutex_unlock( &p_item->p_stats->lock ); + + return VLC_SUCCESS; +} + #ifdef WIN32 vlc_bool_t ReadWin32( intf_thread_t *p_intf, char *p_buffer, int *pi_size ) { @@ -2111,22 +2220,15 @@ static input_item_t *parse_MRL( intf_thread_t *p_intf, char *psz_mrl ) /***************************************************************************** * checkUpdates : check for updates ****************************************************************************/ -#ifdef UPDATE_CHECK +#if 0 && defined( UPDATE_CHECK ) static void checkUpdates( intf_thread_t *p_intf ) { + /*TODO: - modify this to delete p_update to avoid a memory leak ! + - complete the function wich is not working obiously ! update_t *p_u = update_New( p_intf ); - if( p_u == NULL ) return; + var_AddCallback( p_intf->p_libvlc, "update-notify", updatesCallback, p_intf ); - update_Check( p_u ); msg_rc( "\nChecking for updates" ); - - if( update_CompareReleaseToCurrent( p_u ) == UpdateReleaseStatusNewer ) - msg_rc( "\n+----[ VLC %i.%i.%i%s ] ", p_u->release.i_major, - p_u->release.i_minor, - p_u->release.i_revision, - p_u->release.psz_extra ); - else - msg_rc( "\n+----Last version" ); - update_Delete( p_u ); + update_Check( p_u );*/ } #endif