Hi Nick, First, welcome to liquidsoap and this list!
On Sat, Feb 20, 2010 at 6:59 PM, Nick Coons <m...@nickcoons.com> wrote: > I'll be running a 24/7 talk station, which will have commercials > throughout. Generally, the shows will be anywhere from 1-3 hours in > length, and be interrupted for commercials roughly every 15 minutes. Obviously you can't interrupt a live show, do you plan to "overwrite" it, or mix the commercial on top of it? If so, I recommend smooth_add(). Anyway, assuming you treat commercials in the same way for playlists and live shows, this will be done last in the script, and can thus be put out of the way for the other question. > A show may be live, or pre-recorded. I have an Icecast2 server setup with > multiple mountpoints each password-protected so that show hosts can > stream to the mount. Liquidsoap would then pick up the appropriate > mount based on a schedule, apply some processing, and stream it to a > second Icecast2 server that would be public-facing. If you have several mountpoints, you could have several input.http(..), one for each mountpoint. But it's a bit heavy to have liquidsoap actively checking perhaps 10 mounts every 10s or so. An alternative is input.harbor(), did you consider it? It's not perfect, but it's slightly more flexible than icecast (e.g. supports time-dependent authentication) and is more efficient (direct connection from the client to liquidsoap). Some people here have used harbor with one mount for multiple DJs, I don't know if they sticked to it. > If this was a static setup, I could easily tell it to go to one > mountpoint from 1h-2h, to the second from 2h-3h, etc, and interrupt > every 15 minutes for a playlist. But the shows will change, and in will > change in length (two one-hour shows might be replaced with one two-hour > show, so I can't have it switching mountpoints on the host). If you have several input.http() you could dynamically switch from one to the other using switch() and dynamic predicates. For example: switch(track_sensitive=false,[ ({test_process("test -f file_one")},mount_one), ({test_process("test -f file_two")},mount_two), ...]) Using mix() you can also obtain a more efficient mechanism (one which doesn't poll files continuously) for the same effect. > source = switch([ { 0s }, get_process_output("external_script") ]) > > It would call "external_script" every 60 seconds, which would return > either "/path/to/file.mp3" or "http://host:8000/mount" (or perhaps a > playlist of local mp3 files totaling 60 seconds in length). > "external_script" would reference a local database to find out what is > to be played next. "external_script" has not been written yet, so I can > make it do whatever needs to be done. Hehe, it so happens that I have just created an operator that make that kind of thing easy. It's source.dynamic(), only available on SVN, but it's probably not mature enough for that kind of application. Generally, it's currently not supported to dynamically create "active" sources such as input.http/harbor(). It is, however, one of the goals of an ongoing change (the "clock" business if you read the SVN log). Anyway, with great power comes great responsibility, which would probably be too much for a first-time use, so don't feel too sorry that you can't try that yet ;) I hope this little discussion helps you to see what's possible. There is more than one way to do it, it depends on your specific needs. Feel free to ask for more details! -- David ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Savonet-users mailing list Savonet-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/savonet-users