Liquidsoap 1.0.0 beta 2

@smimram smimram released this Jan 13, 2016 · 1309 commits to master since this release

This release introduces lots of fixes and cleanup, but also some new features. Major novelties: support for fast seeking and cue points, FLAC and improved AAC+ support, introduction of the liquidsoap yellowpages "flows", plugin support and improved messages for scripting errors. Compatibility warning: insert_metadata has changed, and clock.assign_new() should be used instead of clock() to avoid some of the new static checks


  • New support for seeking and fast computation of durations in most formats
  • New decoders: FLAC (native & Ogg) and images using Camlimages
  • Fixes in Ogg decoding: LS-515 (loss of data) and LS-537 (segfault).
  • Fix LS-337: periodical failures when decoding AAC(+) streams
  • AAC(+): use new ocaml-faad with builtin mp4ff, easier to build
  • New detection mechanism mixing extensions and MIME types (when available),
    with corresponding settings "decoder.file_extensions." and
  • Decoder order can be user-defined thanks to new settings
    "decoder.file_decoders", "decoder.stream_decoders" and
  • Indicate which decoder is used in the "decoder" metadata
  • More helpful log for various errors
  • Fix segfault with SdlImage image decoder


  • New FLAC encoders %flac (native) and %ogg(%flac)
  • New AAC+ 2.0 and vo-aacenc
  • New settings to theora: keyframes make files much smaller!
  • New settings for WAV encoding: headerless, samplesize.
  • Fix segfaults with ocaml-aacplus
  • Enhancement LS-441: filter metadata before encoding,
    based on the "encoder.metadata.export" setting.
  • Rework infrastructure of encoded outputs to fit all formats, outputs
    and styles of metadata handling, file reopening (#386)


  • New: output.harbor() which acts as a mini icecast server,
    accepting listeners directly. Encoding is shared among users,
    and is only performed when needed.
  • New: ability to register HTTP GET/POST handlers to create simpler
    web services, using harbor.http.register/remove().
  • Make all settings local: port, user and password can be set independently
    for each input.harbor() source
  • New: "metadata_charset" and "icy_metadata_charset" in input.harbor()
  • Fix: race condition possibly leading to abusive "source taken" (LS-500)


  • Add support for streaming native flac, only works when streaming to
    input.harbor(), not supported by actual Icecast servers
  • Fix bugs in ICY protocol support (header parsing, user name)
  • Use ICY metadata updates when streaming AAC(+)
  • New: "encoding" parameter for output.icecast(), used for recoding metadata
    Defaults to "latin1" with shoutcast servers
  • New: icy.update_metadata() function for manual updates
  • Enhance default "song" metadata, avoiding " - " when unnecessary (#467)


  • New experimental input.v4l/v4l2() for webcams
  • New experimental input/output.udp() for unchecked UDP streaming,
    available with most formats (at your own risk)
  • Restore output.pipe.external(), now called output.external()
  • New parameters for most outputs and inputs (start, on_start,
    on_stop, fallible); cleanup and uniformize implementations (LS-365)
  • New ALSA settings alsa.alsa_buffer, alsa.buffer_length and alsa.periods
    Setting periods=0 allows to not attempt to set the number periods,
    which is impossible on some devices
  • New preference order in input/output.prefered(): pulseaudio, portaudio,
    oss, alsa, ao, dummy


  • New: support for cue points with cue_cut()
  • Change insert.metadata() which is now more script friendly,
    returning an insertion function rather than register a server
    command. The old functionality is available as server.insert_metadata().
  • New: rms() operator for getting RMS of a stream, and server.rms() which
    makes this information available as a server command.
  • New: track_sensitive mode for blank detection operators
  • New: playlist.reloadable() for playing a list once, with a command
    for restarting it.
  • Remove id.*() which can be replaced by type annotations

Scripting API:

  • New: OSC support through osc.bool(), osc.float() and osc.float_pair()
  • New: JSON export json_of()
  • New: http.get() and
  • New: url.encode/decode(), base64.encode/decode()
  • New: string.recode() for charset conversions using camomile
  • New: notify_metadata() and osd_metadata(), suitable for use with
    on_track() and on_metadata()
  • New: request.metadata() for getting a request's metadata
  • New: string.length()
  • Enhance log_clocks() with parameter for delaying startup
  • Enhance get_clock_status() with "uptime" reference time

Server interface:

  • Print the playlist's URI when calling .uri without an
  • Ehance .ignore now works also in the primary queue
  • New command for changing the URL of an input.http(), ref #466. The
    command is .url and it needs a restart (.stop, then start)
    to take effect.
  • Fixed double registration of server commands which resulted in broken
    "help" command (LS-521)

Script language:

  • Option "-i" doesn't show types for pervasives anymore
  • Pretty printing of types (LS-474) with indentation, also used
    in the documentation
  • Enhanced type errors (LS-459): no more traces, only the relevant
    part of types is displayed, plus a few special friendly messages.
  • Enhanced static checks (LS-123) thanks to the introduction of the
    active_source subtype, for unused variables and ignored values
    This should avoid common errors, help troubleshooting
    If needed, advanced users can work around errors using --check-lib
    and --errors-as-warnings


  • Do not attempt to install "daemon" files if user/group have not been
    set, unless forced using "make INSTALL_DAEMON= install"
  • Fix several core "source protocol" bugs, causing assert failures and
    other crashes: LS-460 (source becomes not ready without operator knowing)
    #403 (information about being ready is not precise enough)
  • Fix incorrect image accesses (LS-430) by introducing a safer VFrame API
    Applies to most video operators (video.fade(), video.text(), effects...)
  • Cleanup resource (de)allocation, which is becoming critical with dynamic
    reconfigurations (e.g., dynamic output creation, source.dynamic())
    Enforce that server commands are always deallocated (LS-495)
    Attempt to stop sources when initialization fails, so they cleanup as
    much as possible (LS-503)
    Avoid deadlocks upon crashes in IoRing-based operators
    Share code for stoppable feeding threads, use it in input.harbor()
    Avoid useless initialization of SDL systems
  • Dynamic loading of lame and aacplus libraries, making it possible to
    ship them as separate binary packages. This is particularly useless
    for non-free libraries and for those that depend on X (e.g., SDL)
    which is often undesirable on servers
  • Support for separate compilation of most optional features as plugins
    Use --enable--dynamic-plugin in ./configure and
    --dynamic-plugins-dir in liquidsoap
  • Better Win32 support, more version checks, separate compilation of
    C files and compliance with Debian's OCaml standards
  • Externalize many audio and video functions in the new ocaml-mm library
    Factorize and optimize various conversions
  • Rewrite harbor and server code using the new Duppy monad,
    introducing camlp4 into the build system
  • New regression tests (make test)
  • More user-friendly exception printing
  • Avoid problems preventing backtrace printing


  • Update liguidsoap, make microphone input optional (LS-496)
  • Do not crash upon charset-recoding failures [LS-473]
  • Fix in source.dynamic(): missing source re-selection [LS-354]
  • Avoid deadlock on startup in daemon mode [LS-229]
  • Fixes in LADSPA and SDL causing early freezing of Frame parameters.
  • Fullscreen mode for output.sdl()
  • Fix: SIGPIPE used to cause crashes (LS-53,LS-287)
  • Fix: video.volume() could crash upon some end-of-track situationos
  • Fix: properly escape filenames in external file duration methods
  • Rework timeout management for various sockets (notably icecast & harbor)
    Set nodelay, remove TCP_*TIMEOUT [LS-508,LS-509]