After several beta versions, a release candidate and lots of tests... Samuel, Romain and I are proud to announce the release of liquidsoap 1.0.0!
Although many people already use liquidsoap in various production settings, this is an important milestone for the project. We consider this version stable and well designed, we'll maintain it as it is, doing our best to ensure backward compatibility.
Of course, we also already have several important ideas for the future, but we'll take a break before starting to move towards 2.0 ;)
Liquidsoap is a programming language for multimedia stream processing,
mainly used in building complex netradios. This design makes it a
flexible tool: we believe that liquidsoap is easy to get started with
for a simple project, but the programmability and the many features
make it possible to extend your system beyond what any other tool can
do in that domain.
** History & Credits
Not counting a demo in 2004 at ENS Lyon, Liquidsoap's first release
was the 0.2.0 in 2005. The 0.3.0 line brought the first stable
versions, used in productions with uptimes of months. In 2009, we
started the 0.9.0 line, determined to bring what we considered to be
the missing features for 1.0.0: per-source stream types (mono in one
source, stereo in the other, video in yet another) and clocks. The
first 1.0.0 beta version came up in Sept 2010, and we've mostly been
stabilizing since then -- although a few important features were also
introduced, notably the seek support, v4l input, minimal HTTP &
icecast server capabilities, OSC support.
Liquidsoap's main developers are David Baelde, Romain Beauxis and
Samuel Mimram. But the project has benefited from the contributions of
many more people, including Vincent Tabard, Julien Cristau, Stéphane
Gimenez, and many more from year when liquidsoap was a students'
project at ENS Lyon. We'd also like to thank the many people hacking
liquidsoap scripts, building tools on top of it, who bring valuable
feedback and ideas.
This is the changelog for 1.0.0 only. If you're migrating from a
version of liquidsoap older than the beta3, don't forget to check the
full CHANGES file for migration tips!
Finally, the 1.0.0 release! It brings several important fixes, but
also some nice novelties.
The most outstanding difference concerns output.icecast(): its restart
and restart_delay parameters are gone, replaced by a new on_stop handler
which is called on every error (failed connection or disconnection) and
returns the new restart delay. The on_error handler receives a string
describing the error which enables user-friendly reporting, adaptative
Note that on_error defaults to fun(_)->3. which is equivalent to having
restart=true, restart_delay=3. in previous versions, NOT the same as the
former restart=false default. As a result, liquidsoap won't fail to startup
if an initial connection attempt fails.
- LS-532,527: avoid freeze after errors in streaming threads or source
- LS-542: race condition in playlist*() breaking randomness
- LS-489: double expiration lead to illegal queue length and freeze of
- Avoid multiple simultaneous reloading in playlist*(),
thanks to Fabio Costa for his help on this one!
- Pass charset information to icecast server to avoid encoding bugs
- LS-555: timeout for icecast connection attempts
- LS-559: permanent stop after disconnection on Ogg streams
- LS-565: efficient and crash-free error handling in input.http/harbor()
when the input stream has an invalid number of channels
- LS-431: proper handling of duration in blank() avoids abusive empty tracks
- LS-556: rework conversion operators, optimizations used to be unsafe & broken
- LS-574: silent MIDI synthesis operators
- LS-396: drop*()'s types reflect that they don't support variable arities
- LS-442: allow comments not terminated by newline at end of file
- on_error handler in output.icecast(), see above
- New msg param in %mp3 for marking frame headers, defaults to version string
- output.file(): new on_close parameter, may be used to write exact duration
- %mp3.vbr/abr for variable bitrate MP3, %mp3 is now a synonym of %mp3.cbr
- MP3 encoders now support ID3v2 tags
- input.http(): new "status" command
- LS-556: mux_mono() for adding a single audio channel into a stream
- video.add_text() using libgd (gd4o) for environments without X
Dependency on graphics can be disabled (to work around erreneous detection)
- script language: add infix operator mod (patch by Fabio Costa)
- delay() now has an "initial" parameter
- LS-557: "server.timeout" setting can now be disabled by setting it to -1
- LS-532: source.init() for selective init with a way to handle errors,
plus settings "clock.allow_streaming_errors" and "init.force_stat" (or
--force-start on the command line) for easing dynamic uses of liquidsoap
- Panic crash to avoid frozen liquidsoap after duppy crashes
- Text-to-speech: festival and sox are now only runtime dependencies
- LS-475,516: better support for dynamic URL change in input.http()
- LS-484: display user-friendly error messages in interactive mode
- LS-308: use seconds internally in request sources, avoid overflow and
display more user-friendly debug messages
- Cleanup visu.volume() and video.vis_volume()
- LS-573: replace " " by "_" in identifiers to make them valid in the server
- Script syntax: unary minus now usable without parenthesis after semicolon
- Two generic queues by default, to avoid deadlocks in advanced situations
- Documentation, build & install system, etc.
David for the Savonet team