[vlc-commits] Document the lazy initialization solution for the double lua context loading

Julien 'Lta' BALLET git at videolan.org
Tue Jan 21 16:13:38 CET 2014


vlc | branch: master | Julien 'Lta' BALLET <contact at lta.io> | Tue Jan 21 11:30:10 2014 +0100| [648b2bc745516f59aafc28782418d70b531c899f] | committer: Jean-Baptiste Kempf

Document the lazy initialization solution for the double lua context loading

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=648b2bc745516f59aafc28782418d70b531c899f
---

 share/lua/sd/README.txt |   66 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 59 insertions(+), 7 deletions(-)

diff --git a/share/lua/sd/README.txt b/share/lua/sd/README.txt
index e9be4de..9a0ed88 100644
--- a/share/lua/sd/README.txt
+++ b/share/lua/sd/README.txt
@@ -1,19 +1,71 @@
-Instructions to code your own VLC Lua services discovery script.
+## Instructions to code your own VLC Lua services discovery script.
 $Id$
 
 See lua/README.txt for generic documentation about Lua usage in VLC.
 
 Examples: See fmc.lua, frenchtv.lua
 
+## API
 VLC Lua SD modules should define two functions:
- * descriptor(): returns a table with information about the module.
-                 The table has the following members:
-                     .title: the name of the SD
- * main(): will be called when the SD is started
+  * descriptor(): returns a table with information about the module.
+    The table has the following members:
+      .title: the name of the SD
+      .capabilities: A list of your SD's capabilities. Only the
+        following flags are supported yet:
+        * 'search' : Does your SD handle search himself
+
+    Example:
+    function descriptor()
+      return { title = "My SD's title", capabilities={"search"}}
+    end
+
+  * main(): will be called when the SD is started. It should use VLC's SD API
+    described in lua/README.txt do add the items found.
+
+  * search(query_string): Will be called with a string to search for
+    services/medias matching that string.
+
 
 User defined modules stored in the share/lua/modules/ directory are
-available. For example, to use the sandbox module, just use
-'require "sandbox"' in your interface.
+available. Read the 'Two pass Initialization section'
 
 Available VLC specific Lua modules: input, msg, net, object, sd,
 strings, variables, stream, gettext, xml. See lua/README.txt.
+
+## Two pass Initialization
+
+SD Lua scripts are actually ran in two different contexts/interpreters. One of
+them is the one that will call your main() and search() functions. The other one
+is a lighter one that will only fetch your description(). Due to threading
+issues and to reduce implementation complexity (NDLR: i guess), the
+description() interpreter doesn't load/expose VLC's API nor add
+share/lua/modules to the lua load path (these modules are using vlc API anyway).
+This has some implications to the way you need to load modules.
+
+This means you cannot make a global/top-level require for the module you use but
+instead use lazily load them from the main() and/or search() functions. Here's
+an example implementation:
+
+-------------------------------------------------------------------------------
+lazily_loaded = false
+dkjson        = nil
+
+function lazy_load()
+  if lazily_loaded ~= false then return nil end
+  dkjson = require("dkjson")
+end
+
+function descriptor()
+  return { title = "..." }
+end
+
+function main()
+  lazy_load()
+  -- Do stuff here
+end
+
+function search(query)
+  lazy_load()
+  -- Do stuff here
+end
+-------------------------------------------------------------------------------



More information about the vlc-commits mailing list