X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhotkeys.c;h=e3df64ec412b475eeaef4ea3bf994f2d0503b224;hb=937e3f2f6b56c287e9acecfc77d65841300325ca;hp=fe22dba2832378faa59b9d7c595c3a61e06a0db5;hpb=3561b9b28f58eb7a4183e158a8fd973800d31ceb;p=vlc diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index fe22dba283..e3df64ec41 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -59,6 +59,8 @@ struct intf_sys_t * 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 */ }; /***************************************************************************** @@ -93,12 +95,12 @@ static void ClearChannels ( intf_thread_t *, vout_thread_t * ); #define BOOKMARK10_TEXT N_("Playlist bookmark 10") #define BOOKMARK_LONGTEXT N_("Define playlist bookmarks.") -vlc_module_begin(); - set_shortname( N_("Hotkeys") ); - set_description( N_("Hotkeys management interface") ); - set_capability( "interface", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); +vlc_module_begin () + set_shortname( N_("Hotkeys") ) + set_description( N_("Hotkeys management interface") ) + set_capability( "interface", 0 ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Open: initialize interface @@ -106,11 +108,18 @@ vlc_module_end(); static int Open( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; - MALLOC_ERR( p_intf->p_sys, intf_sys_t ); + intf_sys_t *p_sys; + p_sys = malloc( sizeof( intf_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; - p_intf->p_sys->i_size = 0; + p_intf->p_sys = p_sys; p_intf->pf_run = Run; + p_sys->i_size = 0; + vlc_mutex_init( &p_sys->lock ); + vlc_cond_init( &p_sys->wait ); + var_AddCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf ); var_AddCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf ); return VLC_SUCCESS; @@ -122,10 +131,14 @@ static int Open( vlc_object_t *p_this ) static void Close( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t *)p_this; + intf_sys_t *p_sys = p_intf->p_sys; 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 ); } @@ -138,7 +151,10 @@ static void Run( intf_thread_t *p_intf ) vout_thread_t *p_vout = NULL; vlc_value_t val; int i; - playlist_t *p_playlist = pl_Yield( p_intf ); + playlist_t *p_playlist = pl_Hold( p_intf ); + int canc = vlc_savecancel(); + + vlc_cleanup_push( __pl_Release, p_intf ); /* Initialize hotkey structure */ for( struct hotkey *p_hotkey = p_intf->p_libvlc->p_hotkeys; @@ -152,17 +168,15 @@ static void Run( intf_thread_t *p_intf ) { input_thread_t *p_input; vout_thread_t *p_last_vout; - int i_action = GetAction( p_intf ); + int i_action; - if( i_action == -1 ) - break; /* die */ + vlc_restorecancel( canc ); + i_action = GetAction( p_intf ); + + canc = vlc_savecancel(); /* Update the input */ - PL_LOCK; - p_input = p_playlist->p_input; - if( p_input ) - vlc_object_yield( p_input ); - PL_UNLOCK; + p_input = playlist_CurrentInput( p_playlist ); /* Update the vout */ p_last_vout = p_vout; @@ -181,8 +195,7 @@ static void Run( intf_thread_t *p_intf ) /* Quit */ if( i_action == ACTIONID_QUIT ) { - if( p_playlist ) - playlist_Stop( p_playlist ); + playlist_Stop( p_playlist ); vlc_object_kill( p_intf->p_libvlc ); vlc_object_kill( p_intf ); ClearChannels( p_intf, p_vout ); @@ -226,9 +239,9 @@ static void Run( intf_thread_t *p_intf ) } /* Interface showing */ else if( i_action == ACTIONID_INTF_SHOW ) - var_SetBool( p_playlist, "intf-show", true ); + var_SetBool( p_intf->p_libvlc, "intf-show", true ); else if( i_action == ACTIONID_INTF_HIDE ) - var_SetBool( p_playlist, "intf-show", false ); + var_SetBool( p_intf->p_libvlc, "intf-show", false ); /* Video Output actions */ else if( i_action == ACTIONID_SNAPSHOT ) { @@ -397,11 +410,7 @@ static void Run( intf_thread_t *p_intf ) /* Input options */ else if( p_input ) { - /* FIXME --fenrir - * How to get a valid value ? - * That's not that easy with some special stream - */ - bool b_seekable = true; + bool b_seekable = var_GetBool( p_input, "can-seek" ); int i_interval =0; if( i_action == ACTIONID_PAUSE ) @@ -568,6 +577,8 @@ static void Run( intf_thread_t *p_intf ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Aspect ratio: %s"), text_list.p_list->p_values[i].psz_string ); + + var_Change( p_vout, "aspect-ratio", VLC_VAR_FREELIST, &val_list, &text_list ); } free( val.psz_string ); } @@ -594,6 +605,8 @@ static void Run( intf_thread_t *p_intf ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Crop: %s"), text_list.p_list->p_values[i].psz_string ); + + var_Change( p_vout, "crop", VLC_VAR_FREELIST, &val_list, &text_list ); } free( val.psz_string ); } @@ -620,6 +633,8 @@ static void Run( intf_thread_t *p_intf ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Deinterlace mode: %s"), text_list.p_list->p_values[i].psz_string ); + + var_Change( p_vout, "deinterlace", VLC_VAR_FREELIST, &val_list, &text_list ); } free( val.psz_string ); } @@ -650,6 +665,8 @@ static void Run( intf_thread_t *p_intf ) vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Zoom mode: %s"), text_list.p_list->p_values[i].var.psz_name ); + + var_Change( p_vout, "zoom", VLC_VAR_FREELIST, &val_list, &text_list ); } } else if( i_action == ACTIONID_CROP_TOP && p_vout ) @@ -684,6 +701,12 @@ static void Run( intf_thread_t *p_intf ) { playlist_Stop( p_playlist ); } + else if( i_action == ACTIONID_FRAME_NEXT ) + { + var_SetVoid( p_input, "frame-next" ); + vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, + _("Next frame") ); + } else if( i_action == ACTIONID_FASTER ) { var_SetVoid( p_input, "rate-faster" ); @@ -806,35 +829,48 @@ static void Run( intf_thread_t *p_intf ) { osd_MenuActivate( VLC_OBJECT(p_intf) ); } + else if( i_action == ACTIONID_RECORD ) + { + if( var_GetBool( p_input, "can-record" ) ) + { + const bool b_record = !var_GetBool( p_input, "record" ); + + if( b_record ) + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Recording") ); + else + vout_OSDMessage( p_intf, DEFAULT_CHAN, _("Recording done") ); + var_SetBool( p_input, "record", b_record ); + } + } } if( p_vout ) vlc_object_release( p_vout ); if( p_input ) vlc_object_release( p_input ); } - pl_Release( p_intf ); + + /* 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 = -1; + int i_ret; + + vlc_mutex_lock( &p_sys->lock ); + mutex_cleanup_push( &p_sys->lock ); - vlc_object_lock( p_intf ); while( p_sys->i_size == 0 ) - { - if( !vlc_object_alive( p_intf ) ) - goto out; - vlc_object_wait( p_intf ); - } + 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]; -out: - vlc_object_unlock( p_intf ); + vlc_cleanup_run(); return i_ret; } @@ -843,14 +879,14 @@ 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_object_lock( p_intf ); + 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_object_signal_unlocked( p_intf ); - vlc_object_unlock( p_intf ); + vlc_cond_signal( &p_sys->wait ); + vlc_mutex_unlock( &p_sys->lock ); return i_ret; } @@ -890,7 +926,9 @@ static int SpecialKeyEvent( vlc_object_t *libvlc, char const *psz_var, return VLC_SUCCESS; } - return PutAction( p_intf, i_action ); + if( i_action ) + return PutAction( p_intf, i_action ); + return VLC_SUCCESS; } /***************************************************************************** @@ -912,7 +950,7 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) { vlc_value_t val; char psz_bookmark_name[11]; - playlist_t *p_playlist = pl_Yield( p_intf ); + playlist_t *p_playlist = pl_Hold( p_intf ); sprintf( psz_bookmark_name, "bookmark%i", i_num ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); @@ -925,7 +963,7 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) if( !strcmp( psz_bookmark, psz_uri ) ) { free( psz_uri ); - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, true, + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, NULL, p_item ); break; } @@ -938,14 +976,15 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num ) static void SetBookmark( intf_thread_t *p_intf, int i_num ) { - playlist_t *p_playlist = pl_Yield( p_intf ); + playlist_t *p_playlist = pl_Hold( p_intf ); char psz_bookmark_name[11]; sprintf( psz_bookmark_name, "bookmark%i", i_num ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); - if( p_playlist->status.p_item ) + playlist_item_t * p_item = playlist_CurrentPlayingItem( p_playlist ); + if( p_item ) { - char *psz_uri = input_item_GetURI( p_playlist->status.p_item->p_input ); + 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 ); @@ -982,7 +1021,7 @@ static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout, vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time ); } - if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) + if( !p_vout->p_window || p_vout->b_fullscreen ) { var_Get( p_input, "position", &pos ); vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN, @@ -999,7 +1038,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, } ClearChannels( p_intf, p_vout ); - if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) + if( !p_vout->p_window || p_vout->b_fullscreen ) { vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN, i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER );