# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_interface.h>
#include <vlc_input.h>
#include <vlc_vout.h>
* 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 */
};
/*****************************************************************************
#define BOOKMARK10_TEXT N_("Playlist bookmark 10")
#define BOOKMARK_LONGTEXT N_("Define playlist bookmarks.")
-vlc_module_begin();
- set_shortname( _("Hotkeys") );
- set_description( _("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
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;
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 );
}
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;
{
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;
/* 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 );
}
/* 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 )
{
/* 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 )
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 );
}
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 );
}
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 );
}
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 )
{
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" );
{
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;
}
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;
}
return VLC_SUCCESS;
}
- return PutAction( p_intf, i_action );
+ if( i_action )
+ return PutAction( p_intf, i_action );
+ return VLC_SUCCESS;
}
/*****************************************************************************
{
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 );
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;
}
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 );
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,
}
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 );