]> git.sesse.net Git - vlc/blobdiff - modules/control/hotkeys.c
Remove most stray semi-colons in module descriptions
[vlc] / modules / control / hotkeys.c
index 1ba99797482934928454d90163b92b2fd3bf239d..73b0e718279d798ef51c418f7c7316d5239d8e90 100644 (file)
@@ -59,6 +59,8 @@ struct intf_sys_t
                                                         * 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 */
 };
 
 /*****************************************************************************
@@ -93,12 +95,12 @@ static void ClearChannels  ( intf_thread_t *, vout_thread_t * );
 #define BOOKMARK10_TEXT   N_("Playlist bookmark 10")
 #define BOOKMARK_LONGTEXT N_("Define playlist bookmarks.")
 
-vlc_module_begin();
-    set_shortname( N_("Hotkeys") );
-    set_description( N_("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
@@ -106,11 +108,16 @@ vlc_module_end();
 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;
+    MALLOC_ERR( p_sys, intf_sys_t );
 
-    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;
@@ -122,10 +129,14 @@ static int Open( vlc_object_t *p_this )
 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 );
 }
@@ -138,7 +149,10 @@ static void Run( intf_thread_t *p_intf )
     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;
@@ -152,17 +166,15 @@ static void Run( intf_thread_t *p_intf )
     {
         input_thread_t *p_input;
         vout_thread_t *p_last_vout;
-        int i_action = GetAction( p_intf );
+        int i_action;
+
+        vlc_restorecancel( canc );
+        i_action = GetAction( p_intf );
 
-        if( i_action == -1 )
-            break; /* die */
+        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;
@@ -181,8 +193,7 @@ static void Run( intf_thread_t *p_intf )
         /* 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 );
@@ -397,11 +408,7 @@ static void Run( intf_thread_t *p_intf )
         /* 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, "seekable" );
             int i_interval =0;
 
             if( i_action == ACTIONID_PAUSE )
@@ -692,6 +699,12 @@ static void Run( intf_thread_t *p_intf )
             {
                 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" );
@@ -814,35 +827,48 @@ static void Run( intf_thread_t *p_intf )
             {
                 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;
 }
 
@@ -851,14 +877,14 @@ static int PutAction( intf_thread_t *p_intf, int i_action )
     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;
 }
 
@@ -898,7 +924,9 @@ static int SpecialKeyEvent( vlc_object_t *libvlc, char const *psz_var,
           return VLC_SUCCESS;
     }
 
-    return PutAction( p_intf, i_action );
+    if( i_action )
+        return PutAction( p_intf, i_action );
+    return VLC_SUCCESS;
 }
 
 /*****************************************************************************
@@ -920,7 +948,7 @@ 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 );
+    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 );
@@ -946,14 +974,15 @@ static void PlayBookmark( intf_thread_t *p_intf, int i_num )
 
 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 );