X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhotkeys.c;h=976630101d46511dac0ec9de9542c76b38e6d0cc;hb=d228fdd28ef03b992c97af16cb842acd7c879831;hp=f79b0ea2c83f9d8ec2613b8c0bc55ddcdeefd8ca;hpb=04804702d97e0667fdf05ed3ceeae6759fe732d4;p=vlc diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index f79b0ea2c8..976630101d 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 */ }; /***************************************************************************** @@ -106,11 +108,16 @@ 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; + MALLOC_ERR( p_sys, intf_sys_t ); - 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 +129,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 +149,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 +166,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; + + vlc_restorecancel( canc ); + i_action = GetAction( p_intf ); - if( i_action == -1 ) - break; /* die */ + 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; @@ -810,35 +822,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; } @@ -847,14 +872,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; } @@ -894,7 +919,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; } /***************************************************************************** @@ -916,7 +943,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 ); @@ -942,14 +969,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 );