From: Romain B. <to...@ra...> - 2011-05-10 15:05:30
|
2011/5/10 Martin Hamant <ma...@so...>: > Hi everybody, Hi Martin! > Here is the context of my questions: At our company SOUND4, we are > designing professional broadcast sound cards (voice and FM processors). > As our products are going to be driven by linux in a next future, I am > looking for a simple method (ie: third party software, not packaged > within our product) that would provide to our customer a way to add > their own ice/shoutcast stream links from the computer which host the > soundcard (the audio driver is alsa compliant). That sounds great! > By now we are pointing > our customer to edcast, as they are using windows hosts - problem - such > a software doesn't really exist in this way under linux... there are a > few GUI like darksnow/darkice but it doesn't really do the trick: we > need the customer to be able to add a output link in a dynamic way > (without interupting, mostly). My first question is: > > - is there a way to give to liquidsoap a list of outputs (ie: a file) > that would be checked periodically, and when a new output "server" is > discovered in this file, a new connection is initiated to it. Yes! In the recent hg trunk, we have a support for dynamically creating/destroying new sources and output. It is supported by the scripting language so you may be able to fit it to your own needs. In your case, it could be: * A regular tasks started using add_timeout that periodically checks your file and behaves according to your convention However, you may also implement it as a push: * When the client clics on a button, a telnet/server command is sent to liquidsoap to create/destroy an output. There is some documentation online about this functionality there: http://savonet.sourceforge.net/doc-svn/dynamic_sources.html > - second, is there a way to get the network status of a given link (on > air time, last reconnection, transfer rate, used codec, server name). * On air: yes using on_metadata be notified of any new metadata on the stream. * Is connected/Last reconnection: yes using the on_{connect,disconnect} from output.icecast (or shoutcast) operators * Transfer rate: not for now I think * Used coded: if you mean it for an output, then the best is probably to record that information when you create the output. * Server name: same answer as above :) > You'll understand, the need is a simple, provide to the user a "add a > shoutcast server" and "monitor the link" thing. > > I can feel liquidsoap could do that easily but I need starting tips. > Then, I could do a simple interface to control all of that with some > py/glade working (with time, because I am pretty new to python and > object programming and i'll need to learn it). Well all of it sounds highly possible. Concerning the interface between liquidsoap and your application, you have 3 choices: * Telnet server * Unix socket * HTTP server The telnet and http server require to open some network port and to make sure they are protected from the evil global internet while the Unix socket can be accessed locally and protected as done for regular files. The telnet/unix socket API was not initially meant for machine reading but is not too hard to parse and should not change (we care about backward compatibility). On the other hand, the HTTP server interface has the advantage of being quite standard to implement in many programming languages. You may register your own telnet/server commands as well as HTTP handles. With a recent hg, you can also export any language variable to the JSON format, which makes it easier to parse in your application.. A couple of references: * http://savonet.sourceforge.net/doc-svn/server.html : Interaction with telnet/unix socket * http://savonet.sourceforge.net/doc-svn/harbor_http.html : interaction with the HTTP server * http://savonet.sourceforge.net/doc-svn/icy_metadata.html : you may want to allow your user to manually update the metadatas of the output stream. This can be one way to do it directly at the icecast/shoutcast level. Otherwise, you may use insert_metadata. Romain |