#include "vlc_keys.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 ]
+#define POSITION_TEXT_CHAN p_intf->p_sys->p_channels[ 2 ]
+#define POSITION_WIDGET_CHAN p_intf->p_sys->p_channels[ 3 ]
/*****************************************************************************
* intf_sys_t: description and status of FB interface
*****************************************************************************/
int p_keys[ BUFFER_SIZE ]; /* buffer that contains
* keyevents */
int i_size; /* number of events in buffer */
+ 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_value_t, vlc_value_t, void * );
static void PlayBookmark( intf_thread_t *, int );
static void SetBookmark ( intf_thread_t *, int );
-static void DisplayPosition( vout_thread_t *, input_thread_t * );
-static void DisplayVolume ( vout_thread_t *, audio_volume_t );
+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 ClearChannels ( intf_thread_t *, vout_thread_t * );
/*****************************************************************************
* Module descriptor
playlist_t *p_playlist;
input_thread_t *p_input;
vout_thread_t *p_vout = NULL;
+ vout_thread_t *p_last_vout;
struct hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys;
vlc_value_t val;
int i;
p_input = p_intf->p_sys->p_input;
/* Update the vout */
+ p_last_vout = p_intf->p_sys->p_vout;
if( p_vout == NULL )
{
p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
p_intf->p_sys->p_vout = NULL;
}
+ /* Register OSD channels */
+ if( p_vout && p_vout != p_last_vout )
+ {
+ for( i = 0; i < CHANNELS_NUMBER; i++ )
+ {
+ p_intf->p_sys->p_channels[ i ] =
+ vout_RegisterOSDChannel( p_vout );
+ }
+ }
+
/* Find action triggered by hotkey */
i_action = 0;
i_key = GetKey( p_intf );
if( i_action == ACTIONID_QUIT )
{
p_intf->p_vlc->b_die = VLC_TRUE;
- vout_OSDMessage( p_intf, SOLO_CHAN, _( "Quit" ) );
+ ClearChannels( p_intf, p_vout );
+ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Quit" ) );
continue;
}
else if( i_action == ACTIONID_VOL_UP )
{
audio_volume_t i_newvol;
aout_VolumeUp( p_intf, 1, &i_newvol );
- DisplayVolume( p_vout, i_newvol );
+ DisplayVolume( p_intf, p_vout, i_newvol );
}
else if( i_action == ACTIONID_VOL_DOWN )
{
audio_volume_t i_newvol;
aout_VolumeDown( p_intf, 1, &i_newvol );
- DisplayVolume( p_vout, i_newvol );
+ DisplayVolume( p_intf, p_vout, i_newvol );
}
else if( i_action == ACTIONID_VOL_MUTE )
{
{
if( i_newvol == 0 )
{
- vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_MUTE_ICON );
+ ClearChannels( p_intf, p_vout );
+ vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN,
+ OSD_MUTE_ICON );
}
else
{
- DisplayVolume( p_vout, i_newvol );
+ DisplayVolume( p_intf, p_vout, i_newvol );
}
}
}
else if( i_action == ACTIONID_SUBDELAY_DOWN )
{
- int i_delay;
- if( input_Control( p_input, INPUT_GET_SUBDELAY, &i_delay ) ==
- VLC_SUCCESS )
- {
- i_delay--;
- input_Control( p_input, INPUT_SET_SUBDELAY, i_delay );
- vout_OSDMessage( p_intf, SOLO_CHAN, "Subtitle delay %i ms",
- i_delay*100);
- }
+ int64_t i_delay = var_GetTime( p_input, "spu-delay" );
+
+ i_delay -= 10000; /* 10 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) );
}
else if( i_action == ACTIONID_SUBDELAY_UP )
{
- int i_delay;
- if( input_Control( p_input, INPUT_GET_SUBDELAY, &i_delay ) ==
- VLC_SUCCESS )
- {
- i_delay++;
- input_Control( p_input, INPUT_SET_SUBDELAY, i_delay );
- vout_OSDMessage( p_intf, SOLO_CHAN, "Subtitle delay %i ms",
- i_delay*100);
- }
+ int64_t i_delay = var_GetTime( p_input, "spu-delay" );
+
+ i_delay += 10000; /* 10 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) );
}
else if( i_action == ACTIONID_FULLSCREEN && p_vout )
{
}
if( p_input && val.i_int != PAUSE_S )
{
- vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PAUSE_ICON );
+ ClearChannels( p_intf, p_vout );
+ vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN,
+ OSD_PAUSE_ICON );
val.i_int = PAUSE_S;
var_Set( p_input, "state", val );
}
FIND_ANYWHERE );
if( p_playlist )
{
- vout_OSDIcon( VLC_OBJECT( p_intf ), OSD_PLAY_ICON );
+ ClearChannels( p_intf, p_vout );
+ vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN,
+ OSD_PLAY_ICON );
playlist_Play( p_playlist );
vlc_object_release( p_playlist );
}
}
else if( p_input )
{
- vlc_bool_t b_seekable = p_input->stream.b_seekable;
+ /* FIXME --fenrir
+ * How to get a valid value ?
+ * That's not that easy with some special stream
+ */
+ vlc_bool_t b_seekable = VLC_TRUE;
if( i_action == ACTIONID_PAUSE )
{
- vout_OSDMessage( p_intf, SOLO_CHAN, _( "Pause" ) );
+ ClearChannels( p_intf, p_vout );
+ vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN,
+ OSD_PAUSE_ICON );
val.i_int = PAUSE_S;
var_Set( p_input, "state", val );
}
{
val.i_time = -10000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_JUMP_FORWARD_10SEC && b_seekable )
{
val.i_time = 10000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_JUMP_BACKWARD_1MIN && b_seekable )
{
val.i_time = -60000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_JUMP_FORWARD_1MIN && b_seekable )
{
val.i_time = 60000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_JUMP_BACKWARD_5MIN && b_seekable )
{
val.i_time = -300000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_JUMP_FORWARD_5MIN && b_seekable )
{
val.i_time = 300000000;
var_Set( p_input, "time-offset", val );
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action == ACTIONID_NEXT )
{
}
else if( i_action == ACTIONID_POSITION && b_seekable )
{
- DisplayPosition( p_vout, p_input );
+ DisplayPosition( p_intf, p_vout, p_input );
}
else if( i_action >= ACTIONID_PLAY_BOOKMARK1 &&
i_action <= ACTIONID_PLAY_BOOKMARK10 )
}
}
-static void DisplayPosition( vout_thread_t *p_vout, input_thread_t *p_input )
+static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout,
+ input_thread_t *p_input )
{
char psz_duration[MSTRTIME_MAX_SIZE];
char psz_time[MSTRTIME_MAX_SIZE];
{
return;
}
+ ClearChannels( p_intf, p_vout );
var_Get( p_input, "time", &time );
i_seconds = time.i_time / 1000000;
if( time.i_time > 0 )
{
secstotimestr( psz_duration, time.i_time / 1000000 );
- vout_OSDMessage( p_input, POSITION_CHAN, "%s / %s",
+ vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s / %s",
psz_time, psz_duration );
}
else if( i_seconds > 0 )
{
- vout_OSDMessage( p_input, POSITION_CHAN, psz_time );
+ vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time );
}
if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
{
var_Get( p_input, "position", &pos );
- vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_CHAN,
+ vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN,
pos.f_float * 100, OSD_HOR_SLIDER );
}
}
-static void DisplayVolume( vout_thread_t *p_vout, audio_volume_t i_vol )
+static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout,
+ audio_volume_t i_vol )
{
if( p_vout == NULL )
{
return;
}
+ ClearChannels( p_intf, p_vout );
if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
{
- vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_CHAN,
+ vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN,
i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER );
}
else
{
- vout_OSDMessage( p_vout, VOLUME_CHAN, "Vol %d%%",
+ vout_OSDMessage( p_vout, VOLUME_TEXT_CHAN, "Vol %d%%",
2*i_vol*100/AOUT_VOLUME_MAX );
}
}
+
+static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout )
+{
+ int i;
+
+ if( p_vout )
+ {
+ vout_ClearOSDChannel( p_vout, DEFAULT_CHAN );
+ for( i = 0; i < CHANNELS_NUMBER; i++ )
+ {
+ vout_ClearOSDChannel( p_vout, p_intf->p_sys->p_channels[ i ] );
+ }
+ }
+}