X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhotkeys.c;h=810fffa31181f85083745fecf23e7869a6d8cc16;hb=f659703fb4033420e0607d34bc7cd880a5802ea7;hp=801abe66b6df900765f10e6c2586323b90c1a043;hpb=40d199a49334bba38ac01010b23155e2572999dc;p=vlc diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index 801abe66b6..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 *****************************************************************************/ @@ -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 ); @@ -297,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 ); @@ -313,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 ) @@ -355,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; @@ -377,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 ); } } @@ -452,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 ); } @@ -469,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; } @@ -493,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 ) @@ -518,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 ); } @@ -546,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 ); } @@ -560,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 ) @@ -599,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 { @@ -619,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 ); } @@ -652,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 ); } @@ -678,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 ) @@ -694,49 +708,33 @@ 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 ) { @@ -771,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 ) { @@ -781,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 ) - { - 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 ) + 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 ); + 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) ); } @@ -811,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) ); } @@ -821,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) ); @@ -873,9 +852,9 @@ static int PutAction( intf_thread_t *p_intf, int i_action ) 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") ); + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _("Recording done") ); } } } @@ -984,22 +963,27 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) 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_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" ); } + free( psz_uri ); free( psz_bookmark_name ); } @@ -1023,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 ); } } @@ -1050,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 ) +{ + DisplayMessage( p_vout, SPU_DEFAULT_CHANNEL, _("Speed: %.2fx"), f_rate ); +} + +static float AdjustRateFine( input_thread_t *p_input, const int i_dir ) { - int i; + 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] ); } }