/**
* Input rate.
*
- * It is an integer used by the variable "rate" in the
- * range [INPUT_RATE_MIN, INPUT_RATE_MAX] the default value
- * being INPUT_RATE_DEFAULT.
+ * It is an float used by the variable "rate" in the
+ * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MAX]
+ * the default value being 1. It represents the ratio of playback speed to
+ * nominal speed (bigger is faster).
*
- * A value lower than INPUT_RATE_DEFAULT plays faster.
- * A value higher than INPUT_RATE_DEFAULT plays slower.
+ * Internally, the rate is stored as a value in the range
+ * [INPUT_RATE_MIN, INPUT_RATE_MAX].
+ * internal rate = INPUT_RATE_DEFAULT / rate variable
*/
/**
INPUT_GET_TIME, /* arg1= int64_t * res= */
INPUT_SET_TIME, /* arg1= int64_t res=can fail */
- /* input variable "rate" (1 is DEFAULT_RATE) */
+ /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */
INPUT_GET_RATE, /* arg1= int * res= */
INPUT_SET_RATE, /* arg1= int res=can fail */
}
else if( i_action == ACTIONID_RATE_NORMAL )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
+ var_SetFloat( p_input, "rate", 1. );
vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN,
"%s", _("1.00x") );
}
* and we want to increase/decrease it by 0.1 while making sure
* that the resulting playback rate is a multiple of 0.1
*/
- int i_rate = var_GetInteger( p_input, "rate" );
- if( i_rate == 0 )
+ int i_rate = 1. * INPUT_RATE_DEFAULT
+ / var_GetFloat( p_input, "rate" );
+ if( i_rate < INPUT_RATE_MIN )
i_rate = INPUT_RATE_MIN;
+ else if( i_rate > INPUT_RATE_MAX )
+ i_rate = INPUT_RATE_MAX;
int i_sign = i_rate < 0 ? -1 : 1;
const int i_dir = i_action == ACTIONID_RATE_FASTER_FINE ? 1 : -1;
i_rate = i_sign * __MIN( __MAX( i_rate, INPUT_RATE_MIN ), INPUT_RATE_MAX );
- var_SetInteger( p_input, "rate", i_rate );
+ var_SetFloat( p_input, "rate", i_rate );
char psz_msg[7+1];
snprintf( psz_msg, sizeof(psz_msg), _("%.2fx"), (double)INPUT_RATE_DEFAULT / i_rate );
}
else if( i_action == ACTIONID_PLAY )
{
- if( var_GetInteger( p_input, "rate" ) != INPUT_RATE_DEFAULT )
+ if( var_GetFloat( p_input, "rate" ) != 1. )
/* Return to normal speed */
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
+ var_SetFloat( p_input, "rate", 1. );
else
{
ClearChannels( p_intf, p_vout );
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" ) );
+ msg_rc( STATUS_CHANGE "( new rate: %.3f )",
+ var_GetFloat( p_input, "rate" ) );
vlc_mutex_unlock( &p_intf->p_sys->status_lock );
}
static void PositionChanged( intf_thread_t *p_intf,
{
if( var_GetBool( p_input, "can-rate" ) )
{
- int i_rate = var_GetInteger( p_input, "rate" );
- i_rate = (i_rate < 0) ? -i_rate : i_rate * 2;
- var_SetInteger( p_input, "rate", i_rate );
+ float f_rate = var_GetFloat( p_input, "rate" );
+ f_rate = (f_rate < 0) ? -f_rate : f_rate * 2;
+ var_SetFloat( p_input, "rate", f_rate );
}
else
{
{
if( var_GetBool( p_input, "can-rewind" ) )
{
- int i_rate = var_GetInteger( p_input, "rate" );
- i_rate = (i_rate > 0) ? -i_rate : i_rate / 2;
- var_SetInteger( p_input, "rate", i_rate );
+ float f_rate = var_GetFloat( p_input, "rate" );
+ f_rate = (f_rate > 0) ? -f_rate : f_rate * 2;
+ var_SetFloat( p_input, "rate", f_rate );
}
else
{
case HEIGHTH_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 8 );
+ var_SetFloat( p_input, "rate", .125 );
}
break;
case QUARTER_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 4 );
+ var_SetFloat( p_input, "rate", .25 );
}
break;
case HALF_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT * 2 );
+ var_SetFloat( p_input, "rate", .5 );
}
break;
case NORMAL_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
+ var_SetFloat( p_input, "rate", 1. );
}
break;
case TWICE_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 2 );
+ var_SetFloat( p_input, "rate", 2. );
}
break;
case FOUR_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 4 );
+ var_SetFloat( p_input, "rate", 4. );
}
break;
case HEIGHT_PLAY:
if( p_input )
{
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT / 8 );
+ var_SetFloat( p_input, "rate", 8. );
}
break;
p_mediaControl->SetEnabled( true );
bool hasTitles = !var_Get( p_input, "title", &val );
bool hasChapters = !var_Get( p_input, "chapter", &val );
- p_mediaControl->SetStatus( var_GetInteger( p_input, "state" ),
- var_GetInteger( p_input, "rate" ) );
+ p_mediaControl->SetStatus( INPUT_RATE_DEFAULT / var_GetFloat( p_input, "state" ),
+ INPUT_RATE_DEFAULT / var_GetFloat( p_input, "rate" ) );
var_Get( p_input, "position", &val );
p_mediaControl->SetProgress( val.f_float );
_SetMenusEnabled( true, hasChapters, hasTitles );
- _UpdateSpeedMenu( var_GetInteger( p_input, "rate" ) );
+ _UpdateSpeedMenu( INPUT_RATE_DEFAULT / var_GetFloat( p_input, "rate" ) );
// enable/disable skip buttons
#if 0
void InputManager::UpdateRate()
{
/* Update Rate */
- int i_new_rate = var_GetInteger( p_input, "rate");
+ int i_new_rate = INPUT_RATE_DEFAULT / var_GetFloat( p_input, "rate" );
if( i_new_rate != i_rate )
{
i_rate = i_new_rate;
{
if( hasInput() )
{
- int i_rate = var_GetInteger( p_input, "rate" );
- var_SetInteger( p_input, "rate", -i_rate );
+ float f_rate = var_GetFloat( p_input, "rate" );
+ var_SetFloat( p_input, "rate", -f_rate );
}
}
void InputManager::normalRate()
{
if( hasInput() )
- var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
+ var_SetFloat( p_input, "rate", 1. );
}
void InputManager::setRate( int new_rate )
{
if( hasInput() )
- var_SetInteger( p_input, "rate", new_rate );
+ var_SetFloat( p_input, "rate",
+ (float)INPUT_RATE_DEFAULT / (float)new_rate );
}
void InputManager::jumpFwd()
/* Manage Speed status */
var_Get( p_input, "rate", &val );
- if( i_old_rate != val.i_int )
+ if( i_old_rate != (int)((float)INPUT_RATE_DEFAULT / val.f_float) )
{
TCHAR psz_text[15];
_stprintf( psz_text + 2, _T("x%.2f"), 1000.0 / val.i_int );
function rate(name,client)
local input = vlc.object.input()
if name == "normal" then
- vlc.var.set(input,"rate",1000) -- FIXME: INPUT_RATE_DEFAULT
+ vlc.var.set(input,"rate",1)
else
vlc.var.set(input,"rate-"..name,nil)
end
return;
}
- var_SetInteger( p_input_thread, "rate", 1000.0f/rate );
+ var_SetFloat( p_input_thread, "rate", rate );
vlc_object_release( p_input_thread );
}
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- int i_rate;
+ float f_rate;
bool b_can_rewind;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return 0.0; /* rate < 0 indicates rewind */
- i_rate = var_GetInteger( p_input_thread, "rate" );
+ f_rate = var_GetFloat( p_input_thread, "rate" );
b_can_rewind = var_GetBool( p_input_thread, "can-rewind" );
- if( i_rate < 0 && !b_can_rewind )
+ /* FIXME: why are negative values forbidden ?? (rewinding) */
+ if( f_rate < 0 && !b_can_rewind )
{
vlc_object_release( p_input_thread );
return 0.0;
}
vlc_object_release( p_input_thread );
- return (float)1000.0f/i_rate;
+ return f_rate;
}
libvlc_state_t libvlc_media_player_get_state(
case INPUT_GET_RATE:
pi_int = (int*)va_arg( args, int * );
- *pi_int = var_GetInteger( p_input, "rate" );
+ *pi_int = INPUT_RATE_DEFAULT / var_GetFloat( p_input, "rate" );
return VLC_SUCCESS;
case INPUT_SET_RATE:
i_int = (int)va_arg( args, int );
- return var_SetInteger( p_input, "rate", i_int );
+ return var_SetFloat( p_input, "rate",
+ (float)INPUT_RATE_DEFAULT / (float)i_int );
case INPUT_GET_STATE:
pi_int = (int*)va_arg( args, int * );
}
void input_SendEventRate( input_thread_t *p_input, int i_rate )
{
- vlc_value_t val;
+ vlc_value_t val;
- val.i_int = i_rate;
- var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
+ val.f_float = (float)INPUT_RATE_DEFAULT / (float)i_rate;
+ var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
Trigger( p_input, INPUT_EVENT_RATE );
}
var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL );
/* Rate */
- var_Create( p_input, "rate", VLC_VAR_INTEGER );
- val.i_int = p_input->p->i_rate;
+ var_Create( p_input, "rate", VLC_VAR_FLOAT );
+ val.f_float = (float)INPUT_RATE_DEFAULT / (float)p_input->p->i_rate;
var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
var_Create( p_input, "rate-slower", VLC_VAR_VOID );
}
else
{
+ int i_rate = INPUT_RATE_DEFAULT / newval.f_float;
input_ControlPush( p_input, INPUT_CONTROL_SET_RATE, &newval );
}
return VLC_SUCCESS;
p_idsc->d_position = var_GetFloat( p_instance->p_input, "position" );
if( var_GetInteger( p_instance->p_input, "state" ) == PAUSE_S )
p_idsc->b_paused = true;
- p_idsc->i_rate = var_GetInteger( p_instance->p_input, "rate" );
+ p_idsc->i_rate = INPUT_RATE_DEFAULT
+ / var_GetFloat( p_instance->p_input, "rate" );
}
TAB_APPEND( i_idsc, pp_idsc, p_idsc );
APPEND_INPUT_INFO( "position", "%f", Float );
APPEND_INPUT_INFO( "time", "%"PRIi64, Time );
APPEND_INPUT_INFO( "length", "%"PRIi64, Time );
- APPEND_INPUT_INFO( "rate", "%d", Integer );
+ APPEND_INPUT_INFO( "rate", "%f", Float );
APPEND_INPUT_INFO( "title", "%d", Integer );
APPEND_INPUT_INFO( "chapter", "%d", Integer );
APPEND_INPUT_INFO( "can-seek", "%d", Bool );
case 'R':
if( p_input )
{
- int r = var_GetInteger( p_input, "rate" );
- snprintf( buf, 10, "%d.%d", r/1000, r%1000 );
+ float f = var_GetFloat( p_input, "rate" );
+ snprintf( buf, 10, "%.3f", f );
}
else
{