]> git.sesse.net Git - vlc/commitdiff
lua/extension: Export extension_SetInput().
authorPierre d'Herbemont <pdherbemont@free.fr>
Fri, 29 Jan 2010 00:43:19 +0000 (01:43 +0100)
committerPierre d'Herbemont <pdherbemont@free.fr>
Fri, 29 Jan 2010 10:49:25 +0000 (11:49 +0100)
include/vlc_extensions.h
modules/misc/lua/extension.c
modules/misc/lua/extension.h
modules/misc/lua/libs/input.c

index f64c3af72a7300c95c7f10c8b9337c9bb4d99ef9..d43214d76d8c4e8f24284819c2261463fb4df9bc 100644 (file)
@@ -73,6 +73,7 @@ enum
     EXTENSION_TRIGGER_ONLY,   /**< arg1: extension_t*, arg2: bool* */
     EXTENSION_TRIGGER,        /**< arg1: extension_t* */
     EXTENSION_TRIGGER_MENU,   /**< arg1: extension_t*, int (uint16_t) */
+    EXTENSION_SET_INPUT,      /**< arg1: extension_t*, arg2 (input_thread_t) */
 };
 
 /**
@@ -143,6 +144,14 @@ static inline int extension_TriggerMenu( extensions_manager_t *p_mgr,
     return extension_Control( p_mgr, EXTENSION_TRIGGER_MENU, p_ext, i );
 }
 
+/** Trigger an entry of the extension menu */
+static inline int extension_SetInput( extensions_manager_t *p_mgr,
+                                        extension_t *p_ext,
+                                        struct input_thread_t *p_input )
+{
+    return extension_Control( p_mgr, EXTENSION_SET_INPUT, p_ext, p_input );
+}
+
 /** Can this extension only be triggered but not activated?
     Not compatible with HasMenu */
 #define extension_TriggerOnly( mgr, ext ) \
index 05c08daa4ac1bacc14826519c77435420d22496d..8ef54b906b4a525db46487a0291ba149a08d985d 100644 (file)
@@ -26,6 +26,8 @@
 #include "extension.h"
 #include "assert.h"
 
+#include <vlc_input.h>
+
 /* Functions to register */
 static const luaL_Reg p_reg[] =
 {
@@ -462,6 +464,20 @@ static int Control( extensions_manager_t *p_mgr, int i_control, va_list args )
             i = ( int ) va_arg( args, int );
             return TriggerMenu( p_ext, i );
 
+        case EXTENSION_SET_INPUT:
+        {
+            p_ext = ( extension_t* ) va_arg( args, extension_t* );
+            input_thread_t *p_input = va_arg( args, struct input_thread_t * );
+
+            bool ok = LockExtension(p_ext);
+            if (!ok)
+                return VLC_EGENERIC;
+            vlc_object_release(p_ext->p_sys->p_input);
+            p_ext->p_sys->p_input = vlc_object_hold(p_input);
+            UnlockExtension(p_ext);
+
+            return VLC_SUCCESS;
+        }
         default:
             msg_Err( p_mgr, "Control '%d' not yet implemented in Extension",
                      i_control );
index bf15b704848cc5d205b20e4cb5a76143e5f518f6..2bd925228dc8c7bec7961d15f44aa8b7c506f6b8 100644 (file)
@@ -65,7 +65,11 @@ struct extension_sys_t
     vlc_mutex_t command_lock;
     vlc_mutex_t running_lock;
     vlc_cond_t wait;
-    bool b_exiting;
+
+    /* The input this extension should use for vlc.input
+     * or NULL if it should use playlist's current input */
+    struct input_thread_t *p_input;
+
     extensions_manager_t *p_mgr;     ///< Parent
     /* Queue of commands to execute */
     struct command_t
@@ -74,6 +78,8 @@ struct extension_sys_t
         void *data[10];         ///< Optional void* arguments
         struct command_t *next; ///< Next command
     } *command;
+
+    bool b_exiting;
 };
 
 /* Extensions: manager functions */
index 37ed82e3ea5f30a48c00f1177139b14cde72667a..3d7fa582953b8e43d2ee110606a557ace9b4f337 100644 (file)
 #include "playlist.h"
 #include "../vlc.h"
 #include "../libs.h"
+#include "../extension.h"
 
 static const luaL_Reg vlclua_input_reg[];
 static const luaL_Reg vlclua_input_item_reg[];
 
 input_thread_t * vlclua_get_input_internal( lua_State *L )
 {
+    extension_t *p_extension = vlclua_extension_get( L );
+    if( p_extension )
+    {
+        input_thread_t *p_input = p_extension->p_sys->p_input;
+        if (p_input)
+        {
+            vlc_object_hold(p_input);
+            UnlockExtension(p_extension);
+            return p_input;
+        }
+    }
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     input_thread_t *p_input = playlist_CurrentInput( p_playlist );
     vlclua_release_playlist_internal( p_playlist );