X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhotkeys.c;h=0d77fab74a68a4c0b5e168cf9aa848c322562c71;hb=e17d5ecd8918a78c8ecbff36110292c1caaafd26;hp=7ecd11587904eee52ec32731c65c7694a9c92068;hpb=152b1687c0ec112f3ab1360006d048d6b9cf7258;p=vlc diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index 7ecd115879..0d77fab74a 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -38,11 +38,9 @@ #include #include #include -#include "vlc_keys.h" +#include #include "math.h" -#define BUFFER_SIZE 10 - #define CHANNELS_NUMBER 4 #define VOLUME_TEXT_CHAN p_intf->p_sys->p_channels[ 0 ] #define VOLUME_WIDGET_CHAN p_intf->p_sys->p_channels[ 1 ] @@ -54,15 +52,9 @@ *****************************************************************************/ struct intf_sys_t { - int p_actions[ BUFFER_SIZE ]; /* buffer that contains - * action events */ - int i_size; /* number of events in buffer */ + vout_thread_t *p_last_vout; int p_channels[ CHANNELS_NUMBER ]; /* contains registered * channel IDs */ - input_thread_t * p_input; /* pointer to input */ - vout_thread_t * p_vout; /* pointer to vout object */ - vlc_mutex_t lock; /* callback lock */ - vlc_cond_t wait; /* callback event */ int i_mousewheel_mode; }; @@ -71,8 +63,6 @@ struct intf_sys_t *****************************************************************************/ static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); -static void Run ( intf_thread_t * ); -static int GetAction( intf_thread_t *); static int ActionEvent( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * ); static int SpecialKeyEvent( vlc_object_t *, char const *, @@ -104,6 +94,8 @@ vlc_module_begin () set_description( N_("Hotkeys management interface") ) set_capability( "interface", 0 ) set_callbacks( Open, Close ) + set_category( CAT_INTERFACE ) + set_subcategory( SUBCAT_INTERFACE_HOTKEYS ) add_integer( "hotkeys-mousewheel-mode", MOUSEWHEEL_VOLUME, NULL, N_("MouseWheel x-axis Control"), @@ -125,13 +117,11 @@ static int Open( vlc_object_t *p_this ) return VLC_ENOMEM; p_intf->p_sys = p_sys; - p_intf->pf_run = Run; + p_intf->pf_run = NULL; - p_sys->i_size = 0; - vlc_mutex_init( &p_sys->lock ); - vlc_cond_init( &p_sys->wait ); + 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 ); @@ -149,89 +139,65 @@ static void Close( vlc_object_t *p_this ) var_DelCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf ); var_DelCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf ); - vlc_cond_destroy( &p_sys->wait ); - vlc_mutex_destroy( &p_sys->lock ); - /* Destroy structure */ - free( p_intf->p_sys ); + free( p_sys ); } -/***************************************************************************** - * Run: main loop - *****************************************************************************/ -static void Run( intf_thread_t *p_intf ) +static int PutAction( intf_thread_t *p_intf, int i_action ) { - vout_thread_t *p_vout = NULL; - aout_instance_t *p_aout = NULL; - playlist_t *p_playlist = pl_Hold( p_intf ); - int canc = vlc_savecancel(); - - vlc_cleanup_push( __pl_Release, p_intf ); - - for( ;; ) - { - input_thread_t *p_input; - vout_thread_t *p_last_vout; - int i_action; - - vlc_restorecancel( canc ); - i_action = GetAction( p_intf ); - - canc = vlc_savecancel(); + intf_sys_t *p_sys = p_intf->p_sys; + playlist_t *p_playlist = pl_Get( p_intf ); - /* Update the input */ - p_input = playlist_CurrentInput( p_playlist ); + /* Update the input */ + input_thread_t *p_input = playlist_CurrentInput( p_playlist ); - /* Update the vout */ - p_last_vout = p_vout; - p_vout = p_input ? input_GetVout( p_input ) : NULL; + /* Update the vout */ + vout_thread_t *p_vout = p_input ? input_GetVout( p_input ) : NULL; - /* Update the aout */ - p_aout = p_input ? input_GetAout( p_input ) : NULL; + /* Update the aout */ + aout_instance_t *p_aout = p_input ? input_GetAout( p_input ) : NULL; - /* Register OSD channels */ - if( p_vout && p_vout != p_last_vout ) - { - int i; - for( i = 0; i < CHANNELS_NUMBER; i++ ) - { - spu_Control( p_vout->p_spu, SPU_CHANNEL_REGISTER, - &p_intf->p_sys->p_channels[ i ] ); - } - } + /* Register OSD channels */ + /* FIXME: this check can fail if the new vout is reallocated at the same + * address as the old one... We should rather listen to vout events. + * 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_sys->p_last_vout = p_vout; - /* Quit */ - if( i_action == ACTIONID_QUIT ) - { + /* Quit */ + switch( i_action ) + { + case ACTIONID_QUIT: libvlc_Quit( p_intf->p_libvlc ); ClearChannels( p_intf, p_vout ); - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Quit" ) ); - if( p_aout ) - vlc_object_release( p_aout ); - if( p_vout ) - vlc_object_release( p_vout ); - if( p_input ) - vlc_object_release( p_input ); - continue; - } + vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _( "Quit" ) ); + break; + /* Volume and audio actions */ - else if( i_action == ACTIONID_VOL_UP ) + case ACTIONID_VOL_UP: { audio_volume_t i_newvol; - aout_VolumeUp( p_intf, 1, &i_newvol ); + aout_VolumeUp( p_playlist, 1, &i_newvol ); DisplayVolume( p_intf, p_vout, i_newvol ); + break; } - else if( i_action == ACTIONID_VOL_DOWN ) + + case ACTIONID_VOL_DOWN: { audio_volume_t i_newvol; - aout_VolumeDown( p_intf, 1, &i_newvol ); + aout_VolumeDown( p_playlist, 1, &i_newvol ); DisplayVolume( p_intf, p_vout, i_newvol ); + break; } - else if( i_action == ACTIONID_VOL_MUTE ) + + case ACTIONID_VOL_MUTE: { audio_volume_t i_newvol = -1; - aout_VolumeMute( p_intf, &i_newvol ); + aout_ToggleMute( p_playlist, &i_newvol ); if( p_vout ) { if( i_newvol == 0 ) @@ -241,40 +207,44 @@ static void Run( intf_thread_t *p_intf ) OSD_MUTE_ICON ); } else - { DisplayVolume( p_intf, p_vout, i_newvol ); - } } + break; } + /* Interface showing */ - else if( i_action == ACTIONID_INTF_SHOW ) + case ACTIONID_INTF_SHOW: var_SetBool( p_intf->p_libvlc, "intf-show", true ); - else if( i_action == ACTIONID_INTF_HIDE ) + break; + + case ACTIONID_INTF_HIDE: var_SetBool( p_intf->p_libvlc, "intf-show", false ); + break; + /* Video Output actions */ - else if( i_action == ACTIONID_SNAPSHOT ) - { - if( p_vout ) var_TriggerCallback( p_vout, "video-snapshot" ); - } - else if( i_action == ACTIONID_TOGGLE_FULLSCREEN ) + case ACTIONID_SNAPSHOT: + if( p_vout ) + var_TriggerCallback( p_vout, "video-snapshot" ); + break; + + case ACTIONID_TOGGLE_FULLSCREEN: { - vlc_object_t *obj = p_vout ? VLC_OBJECT(p_vout) - : VLC_OBJECT(p_playlist); - bool b = var_GetBool( obj, "fullscreen" ); - var_SetBool( obj, "fullscreen", !b ); + bool fs = var_ToggleBool( p_playlist, "fullscreen" ); + if( p_vout ) + var_SetBool( p_vout, "fullscreen", fs ); + break; } - else if( i_action == ACTIONID_LEAVE_FULLSCREEN ) - { - if( p_vout && var_GetBool( p_vout, "fullscreen" ) ) - { + + case ACTIONID_LEAVE_FULLSCREEN: + if( p_vout ) var_SetBool( p_vout, "fullscreen", false ); - } - } - else if( i_action == ACTIONID_ZOOM_QUARTER || - i_action == ACTIONID_ZOOM_HALF || - i_action == ACTIONID_ZOOM_ORIGINAL || - i_action == ACTIONID_ZOOM_DOUBLE ) - { + var_SetBool( p_playlist, "fullscreen", false ); + break; + + case ACTIONID_ZOOM_QUARTER: + case ACTIONID_ZOOM_HALF: + case ACTIONID_ZOOM_ORIGINAL: + case ACTIONID_ZOOM_DOUBLE: if( p_vout ) { float f; @@ -288,19 +258,18 @@ static void Run( intf_thread_t *p_intf ) } var_SetFloat( p_vout, "zoom", f ); } - } -#ifdef WIN32 - else if( i_action == ACTIONID_WALLPAPER ) + break; + + case ACTIONID_WALLPAPER: { /* FIXME: this is invalid if not using DirectX output!!! */ vlc_object_t *obj = p_vout ? VLC_OBJECT(p_vout) : VLC_OBJECT(p_playlist); - bool b = var_GetBool( obj, "directx-wallpaper" ); - var_SetBool( obj, "directx-wallpaper", !b ); + var_ToggleBool( obj, "video-wallpaper" ); + break; } -#endif + /* Playlist actions */ - else if( i_action == ACTIONID_LOOP ) - { + case ACTIONID_LOOP: /* Toggle Normal -> Loop -> Repeat -> Normal ... */ if( var_GetBool( p_playlist, "repeat" ) ) var_SetBool( p_playlist, "repeat", false ); @@ -312,14 +281,15 @@ static void Run( intf_thread_t *p_intf ) } else var_SetBool( p_playlist, "loop", true ); - } - else if( i_action == ACTIONID_RANDOM ) + break; + + case ACTIONID_RANDOM: { - bool b = var_GetBool( p_playlist, "random" ); - var_SetBool( p_playlist, "random", !b ); + var_ToggleBool( p_playlist, "random" ); + break; } - else if( i_action == ACTIONID_PLAY_PAUSE ) - { + + case ACTIONID_PLAY_PAUSE: if( p_input ) { ClearChannels( p_intf, p_vout ); @@ -340,12 +310,14 @@ static void Run( intf_thread_t *p_intf ) var_SetInteger( p_input, "state", state ); } else - { playlist_Play( p_playlist ); - } - } - else if( ( i_action == ACTIONID_AUDIODEVICE_CYCLE ) && p_aout ) + break; + + case ACTIONID_AUDIODEVICE_CYCLE: { + if( !p_aout ) + break; + vlc_value_t val, list, list2; int i_count, i; @@ -387,10 +359,16 @@ static void Run( intf_thread_t *p_intf ) _("Audio Device: %s"), list2.p_list->p_values[i].psz_string); } + var_FreeList( &list, &list2 ); + break; } + /* Input options */ - else if( p_input ) + default: { + if( !p_input ) + break; + bool b_seekable = var_GetBool( p_input, "can-seek" ); int i_interval =0; @@ -408,7 +386,7 @@ static void Run( intf_thread_t *p_intf ) && 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 ); \ @@ -478,6 +456,7 @@ static void Run( intf_thread_t *p_intf ) _("Audio track: %s"), list2.p_list->p_values[i].psz_string ); } + var_FreeList( &list, &list2 ); } else if( i_action == ACTIONID_SUBTITLE_TRACK ) { @@ -492,7 +471,8 @@ static void Run( intf_thread_t *p_intf ) { vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), _("N/A") ); - continue; + var_FreeList( &list, &list2 ); + goto cleanup_and_continue; } for( i = 0; i < i_count; i++ ) { @@ -516,6 +496,7 @@ static void Run( intf_thread_t *p_intf ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), list2.p_list->p_values[i].psz_string ); + var_FreeList( &list, &list2 ); } else if( i_action == ACTIONID_ASPECT_RATIO && p_vout ) { @@ -580,7 +561,7 @@ static void Run( intf_thread_t *p_intf ) { var_SetFloat( p_vout, "scale", 1.0 ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Zooming reset") ); + "%s", _("Zooming reset") ); } else { @@ -588,10 +569,10 @@ static void Run( intf_thread_t *p_intf ) var_SetBool( p_vout, "autoscale", b_autoscale ); if( b_autoscale ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Scaled to screen") ); + "%s", _("Scaled to screen") ); else vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Original Size") ); + "%s", _("Original Size") ); } } else if( i_action == ACTIONID_SCALE_UP && p_vout ) @@ -614,33 +595,40 @@ static void Run( intf_thread_t *p_intf ) } else if( i_action == ACTIONID_DEINTERLACE && p_vout ) { - vlc_value_t val={0}, val_list, text_list; - var_Get( p_vout, "deinterlace", &val ); - if( var_Change( p_vout, "deinterlace", VLC_VAR_GETLIST, - &val_list, &text_list ) >= 0 ) + int i_deinterlace = var_GetInteger( p_vout, "deinterlace" ); + if( i_deinterlace != 0 ) { - int i; - for( i = 0; i < val_list.p_list->i_count; i++ ) + var_SetInteger( p_vout, "deinterlace", 0 ); + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, + "%s", _("Deinterlace off") ); + } + else + { + var_SetInteger( p_vout, "deinterlace", 1 ); + + char *psz_mode = var_GetString( p_vout, "deinterlace-mode" ); + vlc_value_t vlist, tlist; + if( psz_mode && !var_Change( p_vout, "deinterlace-mode", VLC_VAR_GETCHOICES, &vlist, &tlist ) >= 0 ) { - if( !strcmp( val_list.p_list->p_values[i].psz_string, - val.psz_string ) ) + const char *psz_text = NULL; + for( int i = 0; i < vlist.p_list->i_count; i++ ) { - i++; - break; + if( !strcmp( vlist.p_list->p_values[i].psz_string, psz_mode ) ) + { + psz_text = tlist.p_list->p_values[i].psz_string; + break; + } } - } - if( i == val_list.p_list->i_count ) i = 0; - var_SetString( p_vout, "deinterlace", - val_list.p_list->p_values[i].psz_string ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Deinterlace mode: %s"), - text_list.p_list->p_values[i].psz_string ); + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, + "%s (%s)", _("Deinterlace on"), psz_text ? psz_text : psz_mode ); - var_FreeList( &val_list, &text_list ); + var_FreeList( &vlist, &tlist ); + } + free( psz_mode ); } - free( val.psz_string ); } - else if( ( i_action == ACTIONID_ZOOM || i_action == ACTIONID_UNZOOM ) && p_vout ) + else if( ( i_action == ACTIONID_ZOOM || + i_action == ACTIONID_UNZOOM ) && p_vout ) { vlc_value_t val={0}, val_list, text_list; var_Get( p_vout, "zoom", &val ); @@ -666,7 +654,7 @@ static void Run( intf_thread_t *p_intf ) 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 ); + text_list.p_list->p_values[i].psz_string ); var_FreeList( &val_list, &text_list ); } @@ -690,12 +678,12 @@ static void Run( intf_thread_t *p_intf ) else if( i_action == ACTIONID_NEXT ) { - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Next") ); + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", _("Next") ); playlist_Next( p_playlist ); } else if( i_action == ACTIONID_PREV ) { - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", _("Previous") ); playlist_Prev( p_playlist ); } @@ -705,58 +693,55 @@ static void Run( intf_thread_t *p_intf ) } else if( i_action == ACTIONID_FRAME_NEXT ) { - var_SetVoid( p_input, "frame-next" ); + var_TriggerCallback( p_input, "frame-next" ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Next frame") ); + "%s", _("Next frame") ); } else if( i_action == ACTIONID_FASTER ) { - var_SetVoid( p_input, "rate-faster" ); + var_TriggerCallback( p_input, "rate-faster" ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Faster") ); + "%s", _("Faster") ); } else if( i_action == ACTIONID_SLOWER ) { - var_SetVoid( p_input, "rate-slower" ); + var_TriggerCallback( p_input, "rate-slower" ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, - _("Slower") ); + "%s", _("Slower") ); } 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, - _("1.00x") ); + "%s", _("1.00x") ); } else if( i_action == ACTIONID_RATE_FASTER_FINE || i_action == ACTIONID_RATE_SLOWER_FINE ) { - /* The playback rate is defined by INPUT_RATE_DEFAULT / "rate" - * 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 ) - i_rate = INPUT_RATE_MIN; - int i_sign = i_rate < 0 ? -1 : 1; - const int i_dir = i_action == ACTIONID_RATE_FASTER_FINE ? 1 : -1; + 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" ); - const double f_speed = floor( ( (double)INPUT_RATE_DEFAULT / abs(i_rate) + 0.05 ) / 0.1 + i_dir ) * 0.1; - if( f_speed <= (double)INPUT_RATE_DEFAULT / INPUT_RATE_MAX ) /* Needed to avoid infinity */ - i_rate = INPUT_RATE_MAX; - else - i_rate = INPUT_RATE_DEFAULT / f_speed + 0.5; + int i_sign = f_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 ); + 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_SetInteger( p_input, "rate", i_rate ); + var_SetFloat( p_input, "rate", f_rate ); char psz_msg[7+1]; - snprintf( psz_msg, sizeof(psz_msg), _("%.2fx"), (double)INPUT_RATE_DEFAULT / i_rate ); - vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, psz_msg ); + snprintf( psz_msg, sizeof(psz_msg), _("%.2fx"), f_rate ); + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, "%s", psz_msg ); } - 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 ) @@ -770,13 +755,13 @@ static void Run( intf_thread_t *p_intf ) } /* Only makes sense with DVD */ else if( i_action == ACTIONID_TITLE_PREV ) - var_SetVoid( p_input, "prev-title" ); + var_TriggerCallback( p_input, "prev-title" ); else if( i_action == ACTIONID_TITLE_NEXT ) - var_SetVoid( p_input, "next-title" ); + var_TriggerCallback( p_input, "next-title" ); else if( i_action == ACTIONID_CHAPTER_PREV ) - var_SetVoid( p_input, "prev-chapter" ); + var_TriggerCallback( p_input, "prev-chapter" ); else if( i_action == ACTIONID_CHAPTER_NEXT ) - var_SetVoid( p_input, "next-chapter" ); + var_TriggerCallback( p_input, "next-chapter" ); else if( i_action == ACTIONID_DISC_MENU ) var_SetInteger( p_input, "title 0", 2 ); @@ -800,6 +785,26 @@ static void Run( intf_thread_t *p_intf ) _( "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 ) + { + 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_AUDIODELAY_DOWN ) { int64_t i_delay = var_GetTime( p_input, "audio-delay" ); @@ -822,9 +827,9 @@ static void Run( intf_thread_t *p_intf ) } 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 ); @@ -865,63 +870,24 @@ static void Run( intf_thread_t *p_intf ) { 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, _("Recording") ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording") ); else - vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Recording done") ); - var_SetBool( p_input, "record", b_record ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, "%s", _("Recording done") ); } } } - if( p_aout ) - vlc_object_release( p_aout ); - if( p_vout ) - vlc_object_release( p_vout ); - if( p_input ) - vlc_object_release( p_input ); } - - /* dead code */ - abort(); - vlc_cleanup_pop(); -} - -static int GetAction( intf_thread_t *p_intf ) -{ - intf_sys_t *p_sys = p_intf->p_sys; - int i_ret; - - vlc_mutex_lock( &p_sys->lock ); - mutex_cleanup_push( &p_sys->lock ); - - while( p_sys->i_size == 0 ) - vlc_cond_wait( &p_sys->wait, &p_sys->lock ); - - i_ret = p_sys->p_actions[ 0 ]; - p_sys->i_size--; - for( int i = 0; i < p_sys->i_size; i++ ) - p_sys->p_actions[i] = p_sys->p_actions[i + 1]; - - vlc_cleanup_run(); - return i_ret; -} - -static int PutAction( intf_thread_t *p_intf, int i_action ) -{ - intf_sys_t *p_sys = p_intf->p_sys; - int i_ret = VLC_EGENERIC; - - vlc_mutex_lock( &p_sys->lock ); - if ( p_sys->i_size >= BUFFER_SIZE ) - msg_Warn( p_intf, "event buffer full, dropping key actions" ); - else - p_sys->p_actions[p_sys->i_size++] = i_action; - - vlc_cond_signal( &p_sys->wait ); - vlc_mutex_unlock( &p_sys->lock ); - return i_ret; +cleanup_and_continue: + if( p_aout ) + vlc_object_release( p_aout ); + if( p_vout ) + vlc_object_release( p_vout ); + if( p_input ) + vlc_object_release( p_input ); + return VLC_SUCCESS; } /***************************************************************************** @@ -993,7 +959,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; @@ -1013,7 +979,6 @@ 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 ) @@ -1022,7 +987,7 @@ static void SetBookmark( 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 ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); playlist_item_t * p_item = playlist_CurrentPlayingItem( p_playlist ); @@ -1035,7 +1000,6 @@ static void SetBookmark( intf_thread_t *p_intf, int i_num ) config_SaveConfigFile( p_intf, "hotkeys" ); } - pl_Release( p_intf ); free( psz_bookmark_name ); } @@ -1067,7 +1031,7 @@ static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout, vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s", psz_time ); } - if( p_vout->b_fullscreen ) + if( var_GetBool( p_vout, "fullscreen" ) ) { var_Get( p_input, "position", &pos ); vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN, @@ -1084,7 +1048,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, } ClearChannels( p_intf, p_vout ); - if( p_vout->b_fullscreen ) + if( var_GetBool( p_vout, "fullscreen" ) ) { vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN, i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER ); @@ -1102,10 +1066,11 @@ static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ) if( p_vout ) { - spu_Control( p_vout->p_spu, SPU_CHANNEL_CLEAR, DEFAULT_CHAN ); + 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_vout->p_spu, SPU_CHANNEL_CLEAR, + spu_Control( p_spu, SPU_CHANNEL_CLEAR, p_intf->p_sys->p_channels[ i ] ); } }