1 /*****************************************************************************
2 * maemo_input.c : Input handling for the maemo plugin
3 *****************************************************************************
4 * Copyright (C) 2008 the VideoLAN team
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 /*****************************************************************************
35 *****************************************************************************/
36 static void update_position( intf_thread_t *p_intf );
37 static void item_changed( intf_thread_t *p_intf );
38 static void item_changed_pl( intf_thread_t *p_intf );
40 static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
41 vlc_value_t oldval, vlc_value_t newval, void *param );
42 static int interface_changed_cb( vlc_object_t *p_this, const char *psz_var,
43 vlc_value_t oldval, vlc_value_t newval,
45 static gboolean process_events( gpointer data );
47 void set_input( intf_thread_t *p_intf, input_thread_t *p_input );
48 void delete_input( intf_thread_t *p_intf );
52 /*****************************************************************************
54 *****************************************************************************/
55 void post_event( intf_thread_t *p_intf, int i_event )
57 vlc_spin_lock( &p_intf->p_sys->event_lock );
58 p_intf->p_sys->i_event |= i_event;
59 vlc_spin_unlock( &p_intf->p_sys->event_lock );
60 g_idle_add( process_events, p_intf );
63 static gboolean process_events( gpointer data )
65 intf_thread_t *p_intf = (intf_thread_t *)data;
68 vlc_spin_lock( &p_intf->p_sys->event_lock );
69 i_event = p_intf->p_sys->i_event;
70 p_intf->p_sys->i_event = 0;
71 vlc_spin_unlock( &p_intf->p_sys->event_lock );
73 if( !i_event ) return TRUE;
75 if( i_event & EVENT_PLAYLIST_CURRENT )
76 item_changed_pl( p_intf );
77 if( i_event & EVENT_ACTIVITY )
78 item_changed_pl( p_intf );
79 if( i_event & EVENT_ITEM_CHANGED )
80 item_changed( p_intf );
81 if( i_event & EVENT_INTF_CHANGED )
82 update_position( p_intf );
87 void set_input( intf_thread_t *p_intf, input_thread_t *p_input )
89 if( p_input && !( p_input->b_die || p_input->b_dead ) )
91 p_intf->p_sys->p_input = p_input;
92 vlc_object_hold( p_input );
93 var_AddCallback( p_input, "intf-event", input_event_cb, p_intf );
95 // "Activate" the seekbar
96 gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), TRUE );
99 p_intf->p_sys->p_input = NULL;
102 void delete_input( intf_thread_t *p_intf )
104 if( p_intf->p_sys->p_input )
106 var_DelCallback( p_intf->p_sys->p_input, "intf-event",
107 input_event_cb, p_intf );
108 vlc_object_release( p_intf->p_sys->p_input );
109 p_intf->p_sys->p_input = NULL;
112 hildon_seekbar_set_position( p_intf->p_sys->p_seekbar, 0 );
113 gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), FALSE );
117 static void item_changed_pl( intf_thread_t *p_intf )
119 if( p_intf->p_sys->p_input &&
120 ( p_intf->p_sys->p_input->b_dead || p_intf->p_sys->p_input->b_die ) )
122 delete_input( p_intf );
126 if( !p_intf->p_sys->p_input )
128 set_input( p_intf, playlist_CurrentInput( p_intf->p_sys->p_playlist ) );
133 int playlist_current_cb( vlc_object_t *p_this, const char *psz_var,
134 vlc_value_t oldval, vlc_value_t newval, void *param )
136 intf_thread_t *p_intf = (intf_thread_t *)param;
137 (void)p_this; (void)psz_var; (void)oldval; (void)newval;
139 vlc_spin_lock( &p_intf->p_sys->event_lock );
140 p_intf->p_sys->i_event |= EVENT_PLAYLIST_CURRENT;
141 vlc_spin_unlock( &p_intf->p_sys->event_lock );
142 g_idle_add( process_events, p_intf );
146 int activity_cb( vlc_object_t *p_this, const char *psz_var,
147 vlc_value_t oldval, vlc_value_t newval, void *param )
149 intf_thread_t *p_intf = (intf_thread_t *)param;
150 (void)p_this; (void)psz_var; (void)oldval; (void)newval;
152 vlc_spin_lock( &p_intf->p_sys->event_lock );
153 p_intf->p_sys->i_event |= EVENT_ACTIVITY;
154 vlc_spin_unlock( &p_intf->p_sys->event_lock );
155 g_idle_add( process_events, p_intf );
159 static void item_changed( intf_thread_t *p_intf )
161 GtkButton *p_button = GTK_BUTTON( p_intf->p_sys->p_play_button );
164 if( !p_intf->p_sys->p_input )
167 var_Get( p_intf->p_sys->p_input, "state", &state );
169 // We change the "play" button
170 if( state.i_int == PLAYING_S )
171 gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-pause",
172 GTK_ICON_SIZE_BUTTON ) );
174 gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-play",
175 GTK_ICON_SIZE_BUTTON ) );
178 int item_changed_cb( vlc_object_t *p_this, const char *psz_var,
179 vlc_value_t oldval, vlc_value_t newval, void *param )
181 (void)p_this; (void)psz_var; (void)oldval; (void)newval;
182 intf_thread_t *p_intf = (intf_thread_t *)param;
184 vlc_spin_lock( &p_intf->p_sys->event_lock );
185 p_intf->p_sys->i_event |= EVENT_ITEM_CHANGED;
186 vlc_spin_unlock( &p_intf->p_sys->event_lock );
187 g_idle_add( process_events, p_intf );
191 static void update_position( intf_thread_t *p_intf )
193 if( p_intf->p_sys->p_input )
195 hildon_seekbar_set_total_time( p_intf->p_sys->p_seekbar,
196 var_GetTime( p_intf->p_sys->p_input, "length" )/1000000 );
197 hildon_seekbar_set_position( p_intf->p_sys->p_seekbar,
198 var_GetTime( p_intf->p_sys->p_input, "time" )/1000000 );
202 static int interface_changed_cb( vlc_object_t *p_this, const char *psz_var,
203 vlc_value_t oldval, vlc_value_t newval,
206 intf_thread_t *p_intf = (intf_thread_t *)param;
207 (void)p_this; (void)psz_var; (void)oldval; (void)newval;
209 vlc_spin_lock( &p_intf->p_sys->event_lock );
210 p_intf->p_sys->i_event |= EVENT_INTF_CHANGED;
211 vlc_spin_unlock( &p_intf->p_sys->event_lock );
212 g_idle_add( process_events, p_intf );
216 static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
217 vlc_value_t oldval, vlc_value_t newval, void *param )
219 if( newval.i_int == INPUT_EVENT_STATE )
220 return item_changed_cb( p_this, psz_var, oldval, newval, param );
222 return interface_changed_cb( p_this, psz_var, oldval, newval, param );