Hi, I finished building a small layer in freevo for easy mbus access. It's in cvs now and you can test it by using the mbusctl helper to start or stop playback in Freevo. You need the latest version of pyNotifier and pyMbus, they were released today on www.mbus.org. You can also simply call 'make' in Freevo to download the files and let them install themself to ./lib.
Here two small howtos from the Docs dir. The first is the configuration howto, the second the programming howto. Please test and let me know what you think. Also give feedback on the interface. [ Installation doc ] This document describes how to setup mbus. 1. Configuration file All known mbus implementations read the config file ~/.mbus or if the environment variable MBUS set, the file to which this variable points. When you first start freevo or a helper application a mbus configuration file is created. Please check the variables later. If you have mbus applications on different hosts, you need to change SCOPE=HOSTLOCAL to SCOPE=LINKLOCAL. All applications on the same bus must share most of the values in the config file. If ADDRESS or PORT don't match, the applications simply won't find each other, if HASHKEY is different, pymbus won't deliver the messages. Do not activate ENCRYPTIONKEY, pyMbus doesn't support encryption yet. 2. Multicast setup Mbus communicates over multicast. Most Linux distributions enable multicast in their default kernel. If you build your own kernel, make sure multicast is enabled. If no special route is given, the multicast traffic will be routed through the default route. This may not what you want. E.g. eth0 is the uplink and eth1 the private network, eth0 has the default route but eth1 should be used for link local mbus communication. A second problem may be that the firewall is blocking the communication and not even host local communication is possible. To set the default route for mbus for 224.255.222.240 (default) type 'route add 224.255.222.240 <interface>' is root. For host local usage use 'lo' as <interface>. [ Coding howto ] This document describes how to use the freevo mbus layer. Freevo has a wrapper for the important mbus functions for easier access inside helpers and plugins. By using the wrapper, the application will join the mbus with the following naming scheme: "app=freevo, type=home-theatre, module=name" with name being the name of the helper or 'core' for the main freevo application. You can also create more than one entity inside an application, a howto for this will follow later. First let's make an example how to use client server communication over mbus. That's the only thing working right now in the wrapper, events will come later. PyMbus supports much more than the mcomm layer, so maybe it is necessary to import mbus in a plugin for special stuff. Creating a server: To create a server you must inherit from mcomm.RPCServer. It is possible to have more than one server on one bus, the class is only a wrapper for easy access. Each function starting with __rpc_ and ending with __ will be registered as rpc to the mbus entity. So let's say you have a plugin listening to the rpc home.theatre.play, you would create the following plugin: | class PluginInterface(plugin.Plugin, mcomm.RPCServer): | def __init__(self): | plugin.Plugin.__init__(self) | mcomm.RPCServer.__init__(self) | | def __rpc_play__(self, addr, val): | file = self.parse_parameter(val, ( str, )) | | if not eventhandler.is_menu(): | return mcomm.RPCError('freevo not in menu mode') | | menuw = eventhandler.get() | parent = menuw.menustack[-1].selected | | for p in plugin.mimetype(None): | i = p.get(parent, [ file ] ) | if i and hasattr(i[0], 'play'): | i[0].play(menuw=menuw) | return mcomm.RPCReturn([]) | | return mcomm.RPCError('no player found') Simple, isn't it? Now, how does the client look like? | freevo = mcomm.find('freevo') | | if not freevo: | print 'freevo not running' | sys.exit(0) | | try: | freevo.play('/my/file.mp3') | except mcomm.MException, e: | print e That's all. mcomm.find will wait on the bus until the freevo core comes up (timeout 10 sec). Calling freevo.play will result in a mbus call home-theatre.play with the given argument. There are three possible returns: 1. (True, return values) The server sent mcomm.RPCReturn(return values). Everything worked as expected. 2. (False, reason) The server send mcomm.RPCError(reason). The parameter are ok, but it was not possible to do what expected. 3. mcomm.MException is raised. Something went wrong. Possible reasons are a crash on server side, a server not answering and so on. freevo.play will block until the result is there. If you don't want to wait, you can specify a callback to the function: freevo.play('/my/file.mp3', callback=my_function) This callback will get the raw mbus return, no True, False or MException stuff. Dischi -- The Second Law of Thermodynamics: If you think things are in a mess now, just wait! -- Jim Warner
pgpdqMTg61hwB.pgp
Description: PGP signature