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&#174; 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

Reply via email to