+
+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 );
+
+ sprintf( psz_bookmark_name, "bookmark%i", i_num );
+ var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT );
+ var_Get( p_intf, psz_bookmark_name, &val );
+
+ char *psz_bookmark = strdup( val.psz_string );
+ PL_LOCK;
+ FOREACH_ARRAY( playlist_item_t *p_item, p_playlist->items )
+ if( !strcmp( psz_bookmark, p_item->p_input->psz_uri ) )
+ {
+ playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE,
+ NULL, p_item );
+ break;
+ }
+ FOREACH_END();
+ PL_UNLOCK;
+ vlc_object_release( p_playlist );
+}
+
+static void SetBookmark( intf_thread_t *p_intf, int i_num )
+{
+ playlist_t *p_playlist = pl_Yield( 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 )
+ {
+ config_PutPsz( p_intf, psz_bookmark_name,
+ p_playlist->status.p_item->p_input->psz_uri);
+ msg_Info( p_intf, "setting playlist bookmark %i to %s", i_num,
+ p_playlist->status.p_item->p_input->psz_uri);
+ config_SaveConfigFile( p_intf, "hotkeys" );
+ }
+ pl_Release( p_intf );
+}
+
+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];
+ vlc_value_t time, pos;
+ mtime_t i_seconds;
+
+ if( p_vout == NULL ) return;
+
+ ClearChannels( p_intf, p_vout );
+
+ var_Get( p_input, "time", &time );
+ i_seconds = time.i_time / 1000000;
+ secstotimestr ( psz_time, i_seconds );
+
+ var_Get( p_input, "length", &time );
+ if( time.i_time > 0 )
+ {
+ secstotimestr( psz_duration, time.i_time / 1000000 );
+ vout_OSDMessage( p_input, POSITION_TEXT_CHAN, (char *) "%s / %s",
+ psz_time, psz_duration );
+ }
+ else if( i_seconds > 0 )
+ {
+ 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_WIDGET_CHAN,
+ pos.f_float * 100, OSD_HOR_SLIDER );
+ }
+}
+
+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_WIDGET_CHAN,
+ i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER );
+ }
+ else
+ {
+ vout_OSDMessage( p_vout, VOLUME_TEXT_CHAN, _( "Volume %d%%" ),
+ i_vol*400/AOUT_VOLUME_MAX );
+ }
+}
+
+static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout )
+{
+ int i;
+
+ if( p_vout )
+ {
+ spu_Control( p_vout->p_spu, SPU_CHANNEL_CLEAR, DEFAULT_CHAN );
+ for( i = 0; i < CHANNELS_NUMBER; i++ )
+ {
+ spu_Control( p_vout->p_spu, SPU_CHANNEL_CLEAR,
+ p_intf->p_sys->p_channels[ i ] );
+ }
+ }
+}