1
/*****************************************************************************
2
* maemo_input.c : Input handling for the maemo plugin
3
*****************************************************************************
4
* Copyright (C) 2008 the VideoLAN team
5
* $Id: de7ba9800d2b966133a546ac6ceb8eabeb3cce13 $
7
* Authors: Antoine Lejeune <phytos@videolan.org>
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22
*****************************************************************************/
28
#include <vlc_common.h>
31
#include "maemo_input.h"
33
static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
34
vlc_value_t oldval, vlc_value_t newval, void *param );
37
gboolean process_events( gpointer data )
39
intf_thread_t *p_intf = (intf_thread_t *)data;
40
vlc_spin_lock( &p_intf->p_sys->event_lock );
42
int i_event = p_intf->p_sys->i_event;
43
p_intf->p_sys->i_event = 0;
45
vlc_spin_unlock( &p_intf->p_sys->event_lock );
48
if( i_event & EVENT_PLAYLIST_CURRENT )
49
item_changed_pl( p_intf );
50
if( i_event & EVENT_ACTIVITY )
51
item_changed_pl( p_intf );
52
if( i_event & EVENT_ITEM_CHANGED )
53
item_changed( p_intf );
54
if( i_event & EVENT_INTF_CHANGED )
55
update_position( p_intf );
61
void set_input( intf_thread_t *p_intf, input_thread_t *p_input )
63
if( p_input && !( p_input->b_die || p_input->b_dead ) )
65
p_intf->p_sys->p_input = p_input;
66
vlc_object_hold( p_input );
67
var_AddCallback( p_input, "intf-event", input_event_cb, p_intf );
69
// "Activate" the seekbar
70
gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), TRUE );
73
p_intf->p_sys->p_input = NULL;
76
void delete_input( intf_thread_t *p_intf )
78
if( p_intf->p_sys->p_input )
80
var_DelCallback( p_intf->p_sys->p_input, "intf-event",
81
input_event_cb, p_intf );
82
vlc_object_release( p_intf->p_sys->p_input );
83
p_intf->p_sys->p_input = NULL;
86
hildon_seekbar_set_position( p_intf->p_sys->p_seekbar, 0 );
87
gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), FALSE );
91
void item_changed_pl( intf_thread_t *p_intf )
93
if( p_intf->p_sys->p_input &&
94
( p_intf->p_sys->p_input->b_dead || p_intf->p_sys->p_input->b_die ) )
96
delete_input( p_intf );
100
if( !p_intf->p_sys->p_input )
102
set_input( p_intf, playlist_CurrentInput( p_intf->p_sys->p_playlist ) );
107
int playlist_current_cb( vlc_object_t *p_this, const char *psz_var,
108
vlc_value_t oldval, vlc_value_t newval, void *param )
110
(void)p_this; (void)psz_var; (void)oldval; (void)newval;
111
intf_thread_t *p_intf = (intf_thread_t *)param;
112
vlc_spin_lock( &p_intf->p_sys->event_lock );
114
p_intf->p_sys->i_event |= EVENT_PLAYLIST_CURRENT;
116
vlc_spin_unlock( &p_intf->p_sys->event_lock );
120
int activity_cb( vlc_object_t *p_this, const char *psz_var,
121
vlc_value_t oldval, vlc_value_t newval, void *param )
123
(void)p_this; (void)psz_var; (void)oldval; (void)newval;
124
intf_thread_t *p_intf = (intf_thread_t *)param;
125
vlc_spin_lock( &p_intf->p_sys->event_lock );
127
p_intf->p_sys->i_event |= EVENT_ACTIVITY;
129
vlc_spin_unlock( &p_intf->p_sys->event_lock );
133
void item_changed( intf_thread_t *p_intf )
135
GtkButton *p_button = GTK_BUTTON( p_intf->p_sys->p_play_button );
138
if( !p_intf->p_sys->p_input )
141
var_Get( p_intf->p_sys->p_input, "state", &state );
143
// We change the "play" button
144
if( state.i_int == PLAYING_S )
145
gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-pause",
146
GTK_ICON_SIZE_BUTTON ) );
148
gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-play",
149
GTK_ICON_SIZE_BUTTON ) );
152
int item_changed_cb( vlc_object_t *p_this, const char *psz_var,
153
vlc_value_t oldval, vlc_value_t newval, void *param )
155
(void)p_this; (void)psz_var; (void)oldval; (void)newval;
156
intf_thread_t *p_intf = (intf_thread_t *)param;
157
vlc_spin_lock( &p_intf->p_sys->event_lock );
159
p_intf->p_sys->i_event |= EVENT_ITEM_CHANGED;
161
vlc_spin_unlock( &p_intf->p_sys->event_lock );
165
void update_position( intf_thread_t *p_intf )
167
if( p_intf->p_sys->p_input )
169
hildon_seekbar_set_total_time( p_intf->p_sys->p_seekbar,
170
var_GetTime( p_intf->p_sys->p_input, "length" )/1000000 );
171
hildon_seekbar_set_position( p_intf->p_sys->p_seekbar,
172
var_GetTime( p_intf->p_sys->p_input, "time" )/1000000 );
176
int interface_changed_cb( vlc_object_t *p_this, const char *psz_var,
177
vlc_value_t oldval, vlc_value_t newval, void *param )
179
(void)p_this; (void)psz_var; (void)oldval; (void)newval;
180
intf_thread_t *p_intf = (intf_thread_t *)param;
181
vlc_spin_lock( &p_intf->p_sys->event_lock );
183
p_intf->p_sys->i_event |= EVENT_INTF_CHANGED;
185
vlc_spin_unlock( &p_intf->p_sys->event_lock );
189
static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
190
vlc_value_t oldval, vlc_value_t newval, void *param )
192
if( newval.i_int == INPUT_EVENT_STATE )
193
return item_changed_cb( p_this, psz_var, oldval, newval, param );
195
return interface_changed_cb( p_this, psz_var, oldval, newval, param );