X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhotkeys.c;h=810fffa31181f85083745fecf23e7869a6d8cc16;hb=f659703fb4033420e0607d34bc7cd880a5802ea7;hp=8b12520affacd556542d26f3bad5ff8a248bd3b7;hpb=1d288a105d764cf9575c884d540f3135273f9fb5;p=vlc diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index 8b12520aff..810fffa311 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -71,8 +71,15 @@ static void PlayBookmark( intf_thread_t *, int ); static void SetBookmark ( intf_thread_t *, int ); static void DisplayPosition( intf_thread_t *, vout_thread_t *, input_thread_t * ); static void DisplayVolume ( intf_thread_t *, vout_thread_t *, audio_volume_t ); +static void DisplayRate ( vout_thread_t *, float ); +static float AdjustRateFine( input_thread_t *, const int ); static void ClearChannels ( intf_thread_t *, vout_thread_t * ); +#define DisplayMessage(vout, fmt, ...) \ + do { if(vout) vout_OSDMessage(vout, fmt, __VA_ARGS__); } while(0) +#define DisplayIcon(vout, icon) \ + do { if(vout) vout_OSDIcon(vout, SPU_DEFAULT_CHANNEL, icon); } while(0) + /***************************************************************************** * Module descriptor *****************************************************************************/ @@ -121,7 +128,7 @@ static int Open( vlc_object_t *p_this ) p_sys->p_last_vout = NULL; p_intf->p_sys->i_mousewheel_mode = - config_GetInt( p_intf, "hotkeys-mousewheel-mode" ); + var_InheritInteger( p_intf, "hotkeys-mousewheel-mode" ); var_AddCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf ); var_AddCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf ); @@ -146,7 +153,7 @@ static void Close( vlc_object_t *p_this ) static int PutAction( intf_thread_t *p_intf, int i_action ) { intf_sys_t *p_sys = p_intf->p_sys; - playlist_t *p_playlist = pl_Hold( p_intf ); + playlist_t *p_playlist = pl_Get( p_intf ); /* Update the input */ input_thread_t *p_input = playlist_CurrentInput( p_playlist ); @@ -163,8 +170,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) * Alternatively, we should keep a reference to the vout thread. */ if( p_vout && p_vout != p_sys->p_last_vout ) for( unsigned i = 0; i < CHANNELS_NUMBER; i++ ) - spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_REGISTER, - &p_intf->p_sys->p_channels[ i ] ); + p_intf->p_sys->p_channels[i] = vout_RegisterSubpictureChannel( p_vout ); p_sys->p_last_vout = p_vout; /* Quit */ @@ -174,7 +180,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) libvlc_Quit( p_intf->p_libvlc ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Quit" ) ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Quit" ) ); break; /* Volume and audio actions */ @@ -203,8 +209,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( i_newvol == 0 ) { ClearChannels( p_intf, p_vout ); - vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, - OSD_MUTE_ICON ); + DisplayIcon( p_vout, OSD_MUTE_ICON ); } else DisplayVolume( p_intf, p_vout, i_newvol ); @@ -229,15 +234,16 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) case ACTIONID_TOGGLE_FULLSCREEN: { - vlc_object_t *obj = p_vout ? VLC_OBJECT(p_vout) - : VLC_OBJECT(p_playlist); - var_ToggleBool( obj, "fullscreen" ); + bool fs = var_ToggleBool( p_playlist, "fullscreen" ); + if( p_vout ) + var_SetBool( p_vout, "fullscreen", fs ); break; } case ACTIONID_LEAVE_FULLSCREEN: - if( p_vout && var_GetBool( p_vout, "fullscreen" ) ) + if( p_vout ) var_SetBool( p_vout, "fullscreen", false ); + var_SetBool( p_playlist, "fullscreen", false ); break; case ACTIONID_ZOOM_QUARTER: @@ -296,14 +302,12 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) int state = var_GetInteger( p_input, "state" ); if( state != PAUSE_S ) { - vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, - OSD_PAUSE_ICON ); + DisplayIcon( p_vout, OSD_PAUSE_ICON ); state = PAUSE_S; } else { - vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, - OSD_PLAY_ICON ); + DisplayIcon( p_vout, OSD_PLAY_ICON ); state = PLAYING_S; } var_SetInteger( p_input, "state", state ); @@ -312,6 +316,18 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) playlist_Play( p_playlist ); break; + case ACTIONID_PLAY: + if( p_input && var_GetFloat( p_input, "rate" ) != 1. ) + /* Return to normal speed */ + var_SetFloat( p_input, "rate", 1. ); + else + { + ClearChannels( p_intf, p_vout ); + DisplayIcon( p_vout, OSD_PLAY_ICON ); + playlist_Play( p_playlist ); + } + break; + case ACTIONID_AUDIODEVICE_CYCLE: { if( !p_aout ) @@ -354,9 +370,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) list.p_list->p_values[i+1] ); i++; } - vout_OSDMessage( p_intf, DEFAULT_CHAN, - _("Audio Device: %s"), - list2.p_list->p_values[i].psz_string); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Audio Device: %s"), + list2.p_list->p_values[i].psz_string); } var_FreeList( &list, &list2 ); break; @@ -376,8 +392,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( var_GetInteger( p_input, "state" ) != PAUSE_S ) { ClearChannels( p_intf, p_vout ); - vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, - OSD_PAUSE_ICON ); + DisplayIcon( p_vout, OSD_PAUSE_ICON ); var_SetInteger( p_input, "state", PAUSE_S ); } } @@ -385,7 +400,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) && b_seekable ) { #define SET_TIME( a, b ) \ - i_interval = config_GetInt( p_input, a "-jump-size" ); \ + i_interval = var_InheritInteger( p_input, a "-jump-size" ); \ if( i_interval > 0 ) { \ mtime_t i_time = (mtime_t)(i_interval * b) * 1000000L; \ var_SetTime( p_input, "time-offset", i_time ); \ @@ -451,9 +466,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) else i++; var_Set( p_input, "audio-es", list.p_list->p_values[i] ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Audio track: %s"), - list2.p_list->p_values[i].psz_string ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Audio track: %s"), + list2.p_list->p_values[i].psz_string ); } var_FreeList( &list, &list2 ); } @@ -468,8 +483,8 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) i_count = list.p_list->i_count; if( i_count <= 1 ) { - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Subtitle track: %s"), _("N/A") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Subtitle track: %s"), _("N/A") ); var_FreeList( &list, &list2 ); goto cleanup_and_continue; } @@ -492,9 +507,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) else i++; var_Set( p_input, "spu-es", list.p_list->p_values[i] ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Subtitle track: %s"), - list2.p_list->p_values[i].psz_string ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Subtitle track: %s"), + list2.p_list->p_values[i].psz_string ); var_FreeList( &list, &list2 ); } else if( i_action == ACTIONID_ASPECT_RATIO && p_vout ) @@ -517,9 +532,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( i == val_list.p_list->i_count ) i = 0; var_SetString( p_vout, "aspect-ratio", val_list.p_list->p_values[i].psz_string ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Aspect ratio: %s"), - text_list.p_list->p_values[i].psz_string ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Aspect ratio: %s"), + text_list.p_list->p_values[i].psz_string ); var_FreeList( &val_list, &text_list ); } @@ -545,9 +560,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( i == val_list.p_list->i_count ) i = 0; var_SetString( p_vout, "crop", val_list.p_list->p_values[i].psz_string ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Crop: %s"), - text_list.p_list->p_values[i].psz_string ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Crop: %s"), + text_list.p_list->p_values[i].psz_string ); var_FreeList( &val_list, &text_list ); } @@ -559,19 +574,19 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if ( f_scalefactor != 1.0 ) { var_SetFloat( p_vout, "scale", 1.0 ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Zooming reset") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("Zooming reset") ); } else { bool b_autoscale = !var_GetBool( p_vout, "autoscale" ); var_SetBool( p_vout, "autoscale", b_autoscale ); if( b_autoscale ) - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Scaled to screen") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("Scaled to screen") ); else - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Original Size") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("Original Size") ); } } else if( i_action == ACTIONID_SCALE_UP && p_vout ) @@ -598,8 +613,8 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( i_deinterlace != 0 ) { var_SetInteger( p_vout, "deinterlace", 0 ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Deinterlace off") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("Deinterlace off") ); } else { @@ -618,8 +633,8 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) break; } } - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s (%s)", _("Deinterlace on"), psz_text ? psz_text : psz_mode ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s (%s)", _("Deinterlace on"), psz_text ? psz_text : psz_mode ); var_FreeList( &vlist, &tlist ); } @@ -651,9 +666,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) if( i == -1 ) i = val_list.p_list->i_count-1; var_SetFloat( p_vout, "zoom", val_list.p_list->p_values[i].f_float ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Zoom mode: %s"), - text_list.p_list->p_values[i].var.psz_name ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _("Zoom mode: %s"), + text_list.p_list->p_values[i].psz_string ); var_FreeList( &val_list, &text_list ); } @@ -677,13 +692,13 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) else if( i_action == ACTIONID_NEXT ) { - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", _("Next") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Next") ); playlist_Next( p_playlist ); } else if( i_action == ACTIONID_PREV ) { - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", - _("Previous") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", + _("Previous") ); playlist_Prev( p_playlist ); } else if( i_action == ACTIONID_STOP ) @@ -693,53 +708,38 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) else if( i_action == ACTIONID_FRAME_NEXT ) { var_TriggerCallback( p_input, "frame-next" ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Next frame") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("Next frame") ); + } + else if( i_action == ACTIONID_RATE_NORMAL ) + { + var_SetFloat( p_input, "rate", 1. ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + "%s", _("1.00x") ); } else if( i_action == ACTIONID_FASTER ) { var_TriggerCallback( p_input, "rate-faster" ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Faster") ); + DisplayRate( p_vout, var_GetFloat( p_input, "rate" ) ); } else if( i_action == ACTIONID_SLOWER ) { var_TriggerCallback( p_input, "rate-slower" ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("Slower") ); - } - else if( i_action == ACTIONID_RATE_NORMAL ) - { - var_SetFloat( p_input, "rate", 1. ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - "%s", _("1.00x") ); + DisplayRate( p_vout, var_GetFloat( p_input, "rate" ) ); } else if( i_action == ACTIONID_RATE_FASTER_FINE || i_action == ACTIONID_RATE_SLOWER_FINE ) { - const double f_rate_min = (double)INPUT_RATE_DEFAULT / INPUT_RATE_MAX; - const double f_rate_max = (double)INPUT_RATE_DEFAULT / INPUT_RATE_MIN; - double f_rate = var_GetFloat( p_input, "rate" ); - - int i_sign = f_rate < 0 ? -1 : 1; const int i_dir = i_action == ACTIONID_RATE_FASTER_FINE ? 1 : -1; + float f_newrate = AdjustRateFine( p_input, i_dir ); - f_rate = floor( fabs(f_rate) / 0.1 + i_dir ) * 0.1; - if( f_rate < f_rate_min ) - f_rate = f_rate_min; - else if( f_rate > f_rate_max ) - f_rate = f_rate_max; - f_rate *= i_sign; - - var_SetFloat( p_input, "rate", f_rate ); - - char psz_msg[7+1]; - snprintf( psz_msg, sizeof(psz_msg), _("%.2fx"), f_rate ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", psz_msg ); + var_SetFloat( p_input, "rate", f_newrate ); + DisplayRate( p_vout, f_newrate ); } - else if( i_action == ACTIONID_POSITION && b_seekable ) + else if( i_action == ACTIONID_POSITION ) { - DisplayPosition( p_intf, p_vout, p_input ); + if( ( !p_vout || vout_OSDEpg( p_vout, input_GetItem( p_input ) ) ) && b_seekable ) + DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action >= ACTIONID_PLAY_BOOKMARK1 && i_action <= ACTIONID_PLAY_BOOKMARK10 ) @@ -769,9 +769,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) i_delay -= 50000; /* 50 ms */ var_SetTime( p_input, "spu-delay", i_delay ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, - _( "Subtitle delay %i ms" ), - (int)(i_delay/1000) ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, + _( "Subtitle delay %i ms" ), + (int)(i_delay/1000) ); } else if( i_action == ACTIONID_SUBDELAY_UP ) { @@ -779,27 +779,21 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) i_delay += 50000; /* 50 ms */ var_SetTime( p_input, "spu-delay", i_delay ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _( "Subtitle delay %i ms" ), (int)(i_delay/1000) ); } - else if( i_action == ACTIONID_SUBPOS_DOWN ) + else if( ( i_action == ACTIONID_SUBPOS_DOWN || + i_action == ACTIONID_SUBPOS_UP ) && p_vout ) { - int i_pos = var_GetInteger( p_input, "sub-margin" ); - --i_pos; - var_SetInteger( p_input, "sub-margin", i_pos ); - ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, - _( "Subtitle position %i px" ), - (int)(i_pos) ); - } - else if( i_action == ACTIONID_SUBPOS_UP ) - { - int i_pos = var_GetInteger( p_input, "sub-margin" ); - ++i_pos; - var_SetInteger( p_input, "sub-margin", i_pos ); + int i_pos; + if( i_action == ACTIONID_SUBPOS_DOWN ) + i_pos = var_DecInteger( p_vout, "sub-margin" ); + else + i_pos = var_IncInteger( p_vout, "sub-margin" ); + ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _( "Subtitle position %i px" ), (int)(i_pos) ); } @@ -809,7 +803,7 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) i_delay -= 50000; /* 50 ms */ var_SetTime( p_input, "audio-delay", i_delay ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _( "Audio delay %i ms" ), (int)(i_delay/1000) ); } @@ -819,23 +813,10 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) i_delay += 50000; /* 50 ms */ var_SetTime( p_input, "audio-delay", i_delay ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _( "Audio delay %i ms" ), (int)(i_delay/1000) ); } - else if( i_action == ACTIONID_PLAY ) - { - if( var_GetFloat( p_input, "rate" ) != 1. ) - /* Return to normal speed */ - var_SetFloat( p_input, "rate", 1. ); - else - { - ClearChannels( p_intf, p_vout ); - vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, - OSD_PLAY_ICON ); - playlist_Play( p_playlist ); - } - } else if( i_action == ACTIONID_MENU_ON ) { osd_MenuShow( VLC_OBJECT(p_intf) ); @@ -868,13 +849,12 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) { if( var_GetBool( p_input, "can-record" ) ) { - const bool b_record = !var_GetBool( p_input, "record" ); + const bool b_record = var_ToggleBool( p_input, "record" ); if( b_record ) - vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Recording") ); else - vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording done") ); - var_SetBool( p_input, "record", b_record ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Recording done") ); } } } @@ -886,7 +866,6 @@ cleanup_and_continue: vlc_object_release( p_vout ); if( p_input ) vlc_object_release( p_input ); - pl_Release( p_intf ); return VLC_SUCCESS; } @@ -959,7 +938,7 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) if( asprintf( &psz_bookmark_name, "bookmark%i", i_num ) == -1 ) return; - playlist_t *p_playlist = pl_Hold( p_intf ); + playlist_t *p_playlist = pl_Get( p_intf ); char *psz_bookmark = var_CreateGetString( p_intf, psz_bookmark_name ); PL_LOCK; @@ -979,29 +958,32 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) free( psz_bookmark ); free( psz_bookmark_name ); - pl_Release( p_intf ); } static void SetBookmark( intf_thread_t *p_intf, int i_num ) { char *psz_bookmark_name; + char *psz_uri = NULL; if( asprintf( &psz_bookmark_name, "bookmark%i", i_num ) == -1 ) return; - playlist_t *p_playlist = pl_Hold( p_intf ); + playlist_t *p_playlist = pl_Get( p_intf ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); + + PL_LOCK; playlist_item_t * p_item = playlist_CurrentPlayingItem( p_playlist ); + if( p_item ) psz_uri = input_item_GetURI( p_item->p_input ); + PL_UNLOCK; + if( p_item ) { - char *psz_uri = input_item_GetURI( p_item->p_input ); config_PutPsz( p_intf, psz_bookmark_name, psz_uri); msg_Info( p_intf, "setting playlist bookmark %i to %s", i_num, psz_uri); - free( psz_uri ); config_SaveConfigFile( p_intf, "hotkeys" ); } - pl_Release( p_intf ); + free( psz_uri ); free( psz_bookmark_name ); } @@ -1025,18 +1007,18 @@ static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout, if( time.i_time > 0 ) { secstotimestr( psz_duration, time.i_time / 1000000 ); - vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s / %s", - psz_time, psz_duration ); + DisplayMessage( p_vout, POSITION_TEXT_CHAN, "%s / %s", + psz_time, psz_duration ); } else if( i_seconds > 0 ) { - vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s", psz_time ); + DisplayMessage( p_vout, POSITION_TEXT_CHAN, "%s", psz_time ); } if( var_GetBool( p_vout, "fullscreen" ) ) { var_Get( p_input, "position", &pos ); - vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN, + vout_OSDSlider( p_vout, POSITION_WIDGET_CHAN, pos.f_float * 100, OSD_HOR_SLIDER ); } } @@ -1052,28 +1034,46 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, if( var_GetBool( p_vout, "fullscreen" ) ) { - vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN, + vout_OSDSlider( p_vout, VOLUME_WIDGET_CHAN, i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER ); } else { - vout_OSDMessage( p_vout, VOLUME_TEXT_CHAN, _( "Volume %d%%" ), - i_vol*400/AOUT_VOLUME_MAX ); + DisplayMessage( p_vout, VOLUME_TEXT_CHAN, _( "Volume %d%%" ), + i_vol*400/AOUT_VOLUME_MAX ); } } -static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ) +static void DisplayRate( vout_thread_t *p_vout, float f_rate ) { - int i; + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _("Speed: %.2fx"), f_rate ); +} + +static float AdjustRateFine( input_thread_t *p_input, const int i_dir ) +{ + const float f_rate_min = (float)INPUT_RATE_DEFAULT / INPUT_RATE_MAX; + const float f_rate_max = (float)INPUT_RATE_DEFAULT / INPUT_RATE_MIN; + float f_rate = var_GetFloat( p_input, "rate" ); + + int i_sign = f_rate < 0 ? -1 : 1; + + f_rate = floor( fabs(f_rate) / 0.1 + i_dir + 0.05 ) * 0.1; + if( f_rate < f_rate_min ) + f_rate = f_rate_min; + else if( f_rate > f_rate_max ) + f_rate = f_rate_max; + f_rate *= i_sign; + + return f_rate; +} + +static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ) +{ if( p_vout ) { - spu_t *p_spu = vout_GetSpu( p_vout ); - spu_Control( p_spu, SPU_CHANNEL_CLEAR, DEFAULT_CHAN ); - for( i = 0; i < CHANNELS_NUMBER; i++ ) - { - spu_Control( p_spu, SPU_CHANNEL_CLEAR, - p_intf->p_sys->p_channels[ i ] ); - } + vout_FlushSubpictureChannel( p_vout, SPU_DEFAULT_CHANNEL ); + for( int i = 0; i < CHANNELS_NUMBER; i++ ) + vout_FlushSubpictureChannel( p_vout, p_intf->p_sys->p_channels[i] ); } }