#include <sys/types.h>
#include <vlc_network.h>
-#include "vlc_url.h"
+#include <vlc_url.h>
#include <vlc_charset.h>
-#if defined(AF_UNIX) && !defined(AF_LOCAL)
-# define AF_LOCAL AF_UNIX
+#if defined(PF_UNIX) && !defined(PF_LOCAL)
+# define PF_LOCAL PF_UNIX
#endif
#if defined(AF_LOCAL) && ! defined(WIN32)
static int updateStatistics( intf_thread_t *, input_item_t *);
/* Status Callbacks */
-static int TimeOffsetChanged( vlc_object_t *, char const *,
- vlc_value_t, vlc_value_t , void * );
-static int VolumeChanged ( vlc_object_t *, char const *,
- vlc_value_t, vlc_value_t, void * );
-static int StateChanged ( vlc_object_t *, char const *,
- vlc_value_t, vlc_value_t, void * );
-static int RateChanged ( vlc_object_t *, char const *,
- vlc_value_t, vlc_value_t, void * );
+static int VolumeChanged( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
+static int InputEvent( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
struct intf_sys_t
{
/* status changes */
vlc_mutex_t status_lock;
playlist_status_t i_last_state;
- playlist_t *p_playlist;
+ playlist_t *p_playlist;
+ bool b_input_buffering;
#ifdef WIN32
HANDLE hConsoleIn;
set_category( CAT_INTERFACE )
set_subcategory( SUBCAT_INTERFACE_MAIN )
set_description( N_("Remote control interface") )
- add_bool( "rc-show-pos", 0, NULL, POS_TEXT, POS_LONGTEXT, true )
+ add_bool( "rc-show-pos", false, NULL, POS_TEXT, POS_LONGTEXT, true )
#ifdef WIN32
- add_bool( "rc-quiet", 0, NULL, QUIET_TEXT, QUIET_LONGTEXT, false )
+ add_bool( "rc-quiet", false, NULL, QUIET_TEXT, QUIET_LONGTEXT, false )
#else
#if defined (HAVE_ISATTY)
- add_bool( "rc-fake-tty", 0, NULL, TTY_TEXT, TTY_LONGTEXT, true )
+ add_bool( "rc-fake-tty", false, NULL, TTY_TEXT, TTY_LONGTEXT, true )
#endif
- add_string( "rc-unix", 0, NULL, UNIX_TEXT, UNIX_LONGTEXT, true )
+ add_string( "rc-unix", NULL, NULL, UNIX_TEXT, UNIX_LONGTEXT, true )
#endif
- add_string( "rc-host", 0, NULL, HOST_TEXT, HOST_LONGTEXT, true )
+ add_string( "rc-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, true )
set_capability( "interface", 20 )
msg_Dbg( p_intf, "trying UNIX socket" );
- if( (i_socket = socket( AF_LOCAL, SOCK_STREAM, 0 ) ) < 0 )
+ if( (i_socket = socket( PF_LOCAL, SOCK_STREAM, 0 ) ) < 0 )
{
msg_Warn( p_intf, "can't open socket: %m" );
free( psz_unix_path );
p_intf->p_sys->psz_unix_path = psz_unix_path;
vlc_mutex_init( &p_intf->p_sys->status_lock );
p_intf->p_sys->i_last_state = PLAYLIST_STOPPED;
+ p_intf->p_sys->b_input_buffering = false;
/* Non-buffered stdout */
setvbuf( stdout, (char *)NULL, _IOLBF, 0 );
ADD( "faster", VOID, Input )
ADD( "slower", VOID, Input )
ADD( "normal", VOID, Input )
+ ADD( "frame", VOID, Input )
ADD( "atrack", STRING, Input )
ADD( "vtrack", STRING, Input )
p_intf->p_sys->i_socket == -1 )
{
p_intf->p_sys->i_socket =
- net_Accept( p_intf, p_intf->p_sys->pi_socket_listen,
- INTF_IDLE_SLEEP );
+ net_Accept( p_intf, p_intf->p_sys->pi_socket_listen );
if( p_intf->p_sys->i_socket == -1 ) continue;
}
msg_rc( STATUS_CHANGE "( audio volume: %d )",
config_GetInt( p_intf, "volume" ));
}
- var_AddCallback( p_input, "state", StateChanged, p_intf );
- var_AddCallback( p_input, "rate-faster", RateChanged, p_intf );
- var_AddCallback( p_input, "rate-slower", RateChanged, p_intf );
- var_AddCallback( p_input, "rate", RateChanged, p_intf );
- var_AddCallback( p_input, "time-offset", TimeOffsetChanged,
- p_intf );
+ var_AddCallback( p_input, "intf-event", InputEvent, p_intf );
}
}
else if( p_input->b_dead )
{
- var_DelCallback( p_input, "state", StateChanged, p_intf );
- var_DelCallback( p_input, "rate-faster", RateChanged, p_intf );
- var_DelCallback( p_input, "rate-slower", RateChanged, p_intf );
- var_DelCallback( p_input, "rate", RateChanged, p_intf );
- var_DelCallback( p_input, "time-offset", TimeOffsetChanged,
- p_intf );
+ var_DelCallback( p_input, "intf-event", InputEvent, p_intf );
vlc_object_release( p_input );
p_input = NULL;
if( p_input )
{
- var_DelCallback( p_input, "state", StateChanged, p_intf );
- var_DelCallback( p_input, "rate-faster", RateChanged, p_intf );
- var_DelCallback( p_input, "rate-slower", RateChanged, p_intf );
- var_DelCallback( p_input, "rate", RateChanged, p_intf );
- var_DelCallback( p_input, "time-offset", TimeOffsetChanged, p_intf );
+ var_DelCallback( p_input, "intf-event", InputEvent, p_intf );
vlc_object_release( p_input );
}
msg_rc("%s", _("| faster . . . . . . . . . . faster playing of stream"));
msg_rc("%s", _("| slower . . . . . . . . . . slower playing of stream"));
msg_rc("%s", _("| normal . . . . . . . . . . normal playing of stream"));
+ msg_rc("%s", _("| frame. . . . . . . . . . play frame by frame"));
msg_rc("%s", _("| f [on|off] . . . . . . . . . . . . toggle fullscreen"));
msg_rc("%s", _("| info . . . . . information about the current stream"));
msg_rc("%s", _("| stats . . . . . . . . show statistical information"));
/********************************************************************
* Status callback routines
********************************************************************/
-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 =
- playlist_CurrentInput( p_intf->p_sys->p_playlist );
-
- if( p_input )
- {
- vlc_mutex_lock( &p_intf->p_sys->status_lock );
- msg_rc( STATUS_CHANGE "( time-offset: %"PRId64"s )",
- (var_GetTime( p_input, "time-offset" )/1000000) );
- vlc_mutex_unlock( &p_intf->p_sys->status_lock );
- vlc_object_release( p_input );
- }
- return VLC_SUCCESS;
-}
-
static int VolumeChanged( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data )
{
return VLC_SUCCESS;
}
-static int StateChanged( vlc_object_t *p_this, char const *psz_cmd,
- vlc_value_t oldval, vlc_value_t newval, void *p_data )
+static void StateChanged( intf_thread_t *p_intf, input_thread_t *p_input )
{
- 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 = p_intf->p_sys->p_playlist;
- int i_status;
- char cmd[6];
+ playlist_t *p_playlist = p_intf->p_sys->p_playlist;
PL_LOCK;
- i_status = playlist_Status( p_playlist );
+ const int i_status = playlist_Status( p_playlist );
PL_UNLOCK;
+ /* */
+ const char *psz_cmd;
switch( i_status )
{
case PLAYLIST_STOPPED:
- strcpy( cmd, "stop" );
+ psz_cmd = "stop";
break;
case PLAYLIST_RUNNING:
- strcpy( cmd, "play" );
+ psz_cmd = "play";
break;
case PLAYLIST_PAUSED:
- strcpy( cmd, "pause" );
+ psz_cmd = "pause";
break;
default:
- cmd[0] = '\0';
- } /* var_GetInteger( p_input, "state" ) */
- vlc_mutex_lock( &p_intf->p_sys->status_lock );
- msg_rc( STATUS_CHANGE "( %s state: %d ): %s", cmd, newval.i_int,
- ppsz_input_state[ newval.i_int ] );
+ psz_cmd = "";
+ break;
+ }
+
+ /* */
+ const int i_state = var_GetInteger( p_input, "state" );
+ vlc_mutex_lock( &p_intf->p_sys->status_lock );
+ msg_rc( STATUS_CHANGE "( %s state: %d ): %s", psz_cmd,
+ i_state, ppsz_input_state[i_state] );
+ vlc_mutex_unlock( &p_intf->p_sys->status_lock );
+}
+static void RateChanged( intf_thread_t *p_intf,
+ input_thread_t *p_input )
+{
+ vlc_mutex_lock( &p_intf->p_sys->status_lock );
+ msg_rc( STATUS_CHANGE "( new rate: %d )",
+ var_GetInteger( p_input, "rate" ) );
+ vlc_mutex_unlock( &p_intf->p_sys->status_lock );
+}
+static void PositionChanged( intf_thread_t *p_intf,
+ input_thread_t *p_input )
+{
+ vlc_mutex_lock( &p_intf->p_sys->status_lock );
+ if( p_intf->p_sys->b_input_buffering )
+ msg_rc( STATUS_CHANGE "( time: %"PRId64"s )",
+ (var_GetTime( p_input, "time" )/1000000) );
+ p_intf->p_sys->b_input_buffering = false;
+ vlc_mutex_unlock( &p_intf->p_sys->status_lock );
+}
+static void CacheChanged( intf_thread_t *p_intf )
+{
+ vlc_mutex_lock( &p_intf->p_sys->status_lock );
+ p_intf->p_sys->b_input_buffering = true;
vlc_mutex_unlock( &p_intf->p_sys->status_lock );
- return VLC_SUCCESS;
}
-static int RateChanged( vlc_object_t *p_this, char const *psz_cmd,
- vlc_value_t oldval, vlc_value_t newval, void *p_data )
+static int InputEvent( 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 = playlist_CurrentInput( p_intf->p_sys->p_playlist );
+ VLC_UNUSED(psz_cmd);
+ VLC_UNUSED(oldval);
+ input_thread_t *p_input = (input_thread_t*)p_this;
+ intf_thread_t *p_intf = p_data;
- if( p_input )
+ switch( newval.i_int )
{
- vlc_mutex_lock( &p_intf->p_sys->status_lock );
- msg_rc( STATUS_CHANGE "( new rate: %d )",
- var_GetInteger( p_input, "rate" ) );
- vlc_mutex_unlock( &p_intf->p_sys->status_lock );
- vlc_object_release( p_input );
+ case INPUT_EVENT_STATE:
+ case INPUT_EVENT_DEAD:
+ StateChanged( p_intf, p_input );
+ break;
+ case INPUT_EVENT_RATE:
+ RateChanged( p_intf, p_input );
+ break;
+ case INPUT_EVENT_POSITION:
+ PositionChanged( p_intf, p_input );
+ break;
+ case INPUT_EVENT_CACHE:
+ CacheChanged( p_intf );
+ break;
+ default:
+ break;
}
return VLC_SUCCESS;
}
int state = var_GetInteger( p_input, "state" );
if( ( state == PAUSE_S ) &&
- ( strcmp( psz_cmd, "pause" ) != 0 ) )
+ ( strcmp( psz_cmd, "pause" ) != 0 ) && (strcmp( psz_cmd,"frame") != 0 ) )
{
msg_rc( "%s", _("Press menu select or pause to continue.") );
}
}
else if ( !strcmp( psz_cmd, "faster" ) )
{
- var_SetVoid( p_input, "rate-faster" );
+ var_TriggerCallback( p_input, "rate-faster" );
i_error = VLC_SUCCESS;
}
else if ( !strcmp( psz_cmd, "slower" ) )
{
- var_SetVoid( p_input, "rate-slower" );
+ var_TriggerCallback( p_input, "rate-slower" );
i_error = VLC_SUCCESS;
}
else if ( !strcmp( psz_cmd, "normal" ) )
var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
i_error = VLC_SUCCESS;
}
+ else if ( !strcmp( psz_cmd, "frame" ) )
+ {
+ var_TriggerCallback( p_input, "frame-next" );
+ i_error = VLC_SUCCESS;
+ }
else if( !strcmp( psz_cmd, "chapter" ) ||
!strcmp( psz_cmd, "chapter_n" ) ||
!strcmp( psz_cmd, "chapter_p" ) )
}
}
else if( !strcmp( psz_cmd, "chapter_n" ) )
- var_SetVoid( p_input, "next-chapter" );
+ var_TriggerCallback( p_input, "next-chapter" );
else if( !strcmp( psz_cmd, "chapter_p" ) )
- var_SetVoid( p_input, "prev-chapter" );
+ var_TriggerCallback( p_input, "prev-chapter" );
i_error = VLC_SUCCESS;
}
else if( !strcmp( psz_cmd, "title" ) ||
}
}
else if( !strcmp( psz_cmd, "title_n" ) )
- var_SetVoid( p_input, "next-title" );
+ var_TriggerCallback( p_input, "next-title" );
else if( !strcmp( psz_cmd, "title_p" ) )
- var_SetVoid( p_input, "prev-title" );
+ var_TriggerCallback( p_input, "prev-title" );
i_error = VLC_SUCCESS;
}