Windows port

@toots toots released this Dec 12, 2017 · 0 commits to 506527eadf93235110fe83360be86dd56f709c1a since this release

Following the new windows build process, this release collects all the various iterative changes made to support liquidsoap in Windows systems.

Liquidsoap 1.3.3

@toots toots released this Oct 14, 2017 · 32 commits to master since this release

This a minor release, containing mostly bug fixes and a couple of new features.



  • Added on_change to register

  • Added IPv6 support for input.harbor. (#491)

  • Added time, localtime and gmtime to help with time-predicates (#481)

  • Added on_start to execute callback when liquidsoap starts.

  • Added enable_external_ffmpeg_decoder to enable ffmpeg-base external decoder.

  • Added "decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path" configuration settings.


  • Renamed secure transport harbor key paths to: harbor.secure_transport.*

  • Renamed secure transport I/O to: {input,output}.harbor.secure_transport.

  • Added .wma to gstreamer file decoder file extensions (#483)


  • Fixed memory leak in output.icecast connection method. (#490)

  • Fixed mutexify

  • Make sure that metadata are always passed in increasing position order in map_metadata (#469)

Liquidsoap 1.3.2

@toots toots released this Sep 2, 2017 · 61 commits to master since this release

This is a bugfix release, mostly related to SSL support and execution of external process.



  • Removed kick telnet/server command, duplicate of stop.

  • Support replaygain for mp3 files, thanks to @d4h3r0 (#460)

  • Implement input.harbor.ssl using SecureTransport for OSX.


  • Fix scheduler loop causing high CPU usage when using Process_handler without some of the default callbacks. (#475)

  • Revert wait_for implementation to pre-1.3.0, using a custom select loop (#453)

  • Handle mime-type arguments in input.harbor streams. (#456)

  • Tell ocaml to use the same C compiler at build and link time. Fixes build on FreeBSD when using C++-based bindings such as taglib. (#465)

  • Accept any capitalization of HTTP(S) as regular HTTP URL (#464)

  • Fix compilation with osx-secure-transport enabled.

Liquidsoap 1.3.1

@toots toots released this May 28, 2017 · 86 commits to master since this release

This is a bugfix release, addressing a couple of bugs from the recent 1.3.0 release. Changelog is:


  • Allow any tags allowed in "encoder.encoder.export" settings in vorbis streams (#418)

  • Allow "audio/mp3" mime-type for mp3 in file resolution protocol. (#451)


  • Fixed run_process, get_process_lines, get_process_output when compiling with OCaml <= 4.03 (#437, #439)

  • Calls to wait_for while the scheduler isn't running (#442)

  • Revert default handling of environment in run_process, get_process_lines, get_process_output to passing calling process' environment by default.

Liquidsoap 1.3.0

@toots toots released this Apr 27, 2017 · 104 commits to master since this release


  • Added support for recursive functions (#406)

  • Add peak and peak.stereo operators (#364)

  • Change track_sensitive parameter to a boolean getter (fixed value or anonymous function).

  • Add SSL support to the varous harbor operators, either via openssl or OSX's SecureTransport.

  • Add optional "dj" and "next" metadata for Shoutcast v2, wrap "dj" value in a callback in output.shoutcast (#370, #388)

  • Allow partial parsing of JSON objects in of_json.

  • Generalize list.assoc to allow default values. Legacy code must be updated: list.assoc(k,l) -> list.assoc(default="",k,l)

  • Generalize list.hd to allow default values. Legacy code must be updated: list.hd(l) -> list.hd(default="",l)

  • Allow to pass a default to list.nth. Legacy code must be updated: list.nth(l,pos) -> list.nth(default=<..>,l,pos)

  • Added on_offset to execute a callback at a given offset within a source's tracks.

  • Added mutexify to protect a function from being called concurrently.

  • Added request.log to get log data associated with a request

  • Added overlap_sources to rotate between sources with overlapping tracks.

  • Added replay_metadata to input.harbor()

  • Added <char code> syntax for strings (#368)

  • Added string.sub

  • Added run_process to run a process with optional environment and return (stdout,stderr,exit_status)

  • Added add_playlist_parser to register new playlist parsers

  • Added optional static parameter to add_protocol

  • Added file.temp to create fresh temporary filename

  • Added process: protocol

  • Reimplemented curl-based fetch process using process:

  • Added s3:// protocol to fetch files from AWS S3 using the AWS CLI.

  • Added polly: protocol to enable speech synthesis using AWS polly. Generated files are mono so make sure you use audio_to_stereo().

  • Added youtube-dl: protocol to resolved requests using youtube-dl

  • Added which() to find an exectuable within the $PATH

  • Added register() to allow to register new configuration settings


  • Reverted default value for --error_as_warnings option, renamed to --strict.

  • Moved say: protocol registration to utils.liq.

  • Moved get_process_lines and get_process_output to utils.liq, added optional env parameter

  • Set conservative=true by default in cross() and smartcross()

Deprecated (can be removed in any future version):

  • Dynamic plugins compilation, deprecated in favor of opam rebuild mechanism.


  • aac and aacplus encoders, removed in favor of fdk-aac.

  • dirac/schroedinger video encoder: obsolete, abandoned upstream.

  • force_mpeg option in taglib metadata decoder. Has not been used for years and allows to decouple taglib code from the mad decoder.


  • Fix negative seek (#390)

  • Prevent flows metadata updata from stalling sources (#377)

  • Add revdns setting for telnet, set all revdns default to false (#372)

  • Fix icy metadata in output.harbor (#358)

  • Fix missing first line of headers from icy clients in input.harbor (#380)

  • Fix timestamp in some logged output (#395)

  • Fix crash in external (download) protocol.

  • Fix fade.{in,out} metadata handling for new fade duration and type.

  • Compute normalization regardless of child sources ready status in add() to avoid unexpected change of volume.

Liquidsoap 1.2.1

@toots toots released this Jul 2, 2016 · 313 commits to master since this release

1.2.1 (01-07-2016)


  • Support for https (SSL/TLS) icecast connections.
  • Added http.{put,head,delete}, https.{get,post,head,put,delete}.
  • Added input.https.
  • Added list.mapi.
  • Added rotate.sequence.
  • New pipe() operator to pipe audio data through an external program.
  • Switched to curl for request resolution/fetch.


  • Fix metadata update for shoutcast v2 when sid <> 1 (#320).
  • Fix connection to input.harbor using the shoutcast v1 protocol (#337).

Liquidsoap 1.2.0

@toots toots released this Jan 12, 2016 · 401 commits to master since this release


  • Websocket server (#90): this means that you can stream to harbor directly from
    your browser!
  • Add support for AIFF format (#112).
  • Add url.split_args to split the argument of an url (#123).
  • Add buffer.adaptative to cope with small network delays (#131).
  • Add sleeper operator to simulate network delays and test robustness (#131).
  • Add stereo.left and stereo.right to extract channels from a stereo stream.
  • Add restart command to restart liquidsoap (#135).
  • Add file.contents to read the contents of a file.
  • Add filter.rc for first-order RC filters.


  • Add support for sending OSC data (osc.send_*).
  • Native support for (some) AVI files (#256) which enables support for external
    video encoders (#233).
  • Improve rms operator (#105) to have per channel rms (#102), the ability to
    dynamically set window duration (#103) and multiple monitors (#104).
  • Icecast streaming can now use HTTP1.1 chunked encoding (#82, #107).
  • Add support for multiple shoutcast extensions (#216).
  • Fade type can be overridden by metadata in / fade.out (#64).
  • Allow LADSPA plugins with arbitrary number of channels (#191).
  • Rename shine encoder from %mp3.fxp to %shine.
  • fdkaac: dynamic plugin (#79), set afterburner parameter, use MPEG4 by default
  • Improved subtyping on lists (#125, #126).
  • Add native simple JSON decoder.
  • Better code: do not abusively use assertions (#137), issue more warnings and
    fix them (#162).


  • Correctly close connection in http.get / (#72).
  • Remove input.lastfm which has been broken for a while.
  • Lots of small bugfixes.

Liquidsoap 1.1.1

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


  • Add support for FDK-AAC, which seems to be the best AAC(+) encoder around for
    now. Replacement candidate for VO-AAC and AACPLUS
  • Add %ifencoder to check whether Liquidsoap was compiled with support for a
    particular encoding format.
  • There is now an emacs mode in scripts/liquidsoap-mode.el.
  • Liquidsoap can be used as a Windows service.


  • Handle more OSC types (float, float_pair, bool, string, string_pair) and added
  • Better infrastructure for decoding images. add_image can now handle most image
    file types.
  • Add as well as min_int and max_int to standard library.
  • Add playlist.merge to play a whole playlist as one track.
  • Add gstreamer.hls to play http live streams (HLS).
  • Add say.program to specify text-to-speech program in scripts.
  • Add "random" transition type to video.fade.* in order to select a random
    transition each time.
  • Add max parameter to drop data on buffer overrun with input.gstreamer.*.
  • Add bytes_per_page parameter to ogg encoders.
  • Add support for DTX in speex and opus, as well as VAD for speex.
  • Localize some more parsing errors in files.


  • Avoid deadlocks in harbor.
  • Correctly flush lame encoder.
  • Correct sequence operator when there is only one source.
  • Handle relative URLs in http playlists.
  • portaudio is now an active source.
  • Avoid jack I/O lowering the volume.

Liquidsoap 1.1.0

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


  • Add support for GStreamer decoding, processing and encoding (%gstreamer
    format, v4l webcam input is now implemented using GStreamer).
  • Add support for opus decoding and encoding.
  • Add support for the shine encoder, which can efficiently work on architectures
    without FPU.
  • Add support for automatically computing the duration of tracks in the
    "duration" metadata [LS-641]. It can be enabled with
  • Add support for frei0r video effects.
  • Allow %define'd variables in encoding formats [LS-634], e.g.
    %define BITRATE 24
    %define STEREO true
    output.file(%mp3(bitrate = BITRATE, stereo = STEREO),"bla.mp3",s)


  • Taglib now reads all metadatas (even non-standard ones).
  • Add a mode to automatically reload a playlist when the file was changed
    [LS-363,LS-523]. For instance, s =
    playlist("~/Music",reload_mode="watch"). Also, add to call a
    callback when a file is changed, with inotify support when present.
  • Add support for FFMpeg as video converter, which you can use with
    set("video.converter.preferred", "ffmpeg")
  • Add back_time argument to blank operators [LS-609].
  • Add a metadata to override duration.
  • MIME is computed at most once when extracting replaygain.
  • Default samplerate converter is now "fast".
  • BPM detection (bpm) now uses a callback.
  • Add clock.unify to unify clocks of all sources from a list.
  • Add "source_url" metadata to input.http streams.
  • Improved error message when theora format is not supported.
  • Add list.filter function.
  • video.add_image can now take any image format as input.
  • Add mux_stereo.
  • Support for external decoders in streams.
  • Move bugtracker to


  • Configure is now compatible with OCaml >= 4.0 and removed support for OCaml <
    3.11 [LS-625].
  • Fix random memory access / memory leak when decoding AAC/MP4 files [LS-647].
  • Correct resampling of wav files.
  • Use the length for data indicated in header for wav files.
  • Argv.(0) now returns the script name [LS-605].
  • Liquidsoap should now operate fine when compiled with -noassert [LS-578].
  • Better handling of inexistent MIDI channels.
  • Video decoder now correctly handles videos from Icecast.
  • Avoid visu.volume freezing Liquidsoap on shutdown.
  • Fix a memory leak when decoding both audio and video in ogg [LS-636].
  • More efficient handling of video converters, also fixes some crashes [LS-623].
  • Have the soundtouch operator preserve tags [LS-621].
  • Fix remaining time estimation in cross and smart_cross.
  • Avoid deadlocks in harbor and input.http.
  • Remove leftover files in configure [LS-567].
  • Handle wav files with padded fmt headers.
  • Handle end-of-stream when seeking mp3 with mad.

Liquidsoap 1.0.1

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


  • correct type for the "flush" parameter in output.external()
    thanks to Romaric Petion for pointing it out
  • fix bug where MP3 encoder would discard initial ID3v2 rendering
  • fix bug where smart_cross() would stop before the end of tracks,
    thanks to Edward Kimber for raising the issue
  • load libraries in --interactive [LS-618]
  • update examples, notably the installed radio.liq
    thanks to Emery Hemingway for noticing the problem
  • generalize the types of input.http() and input.harbor() to allow variable
    content kinds, and also allow video for harbor [LS-601]
  • request.equeue() now allows to remove requests from the primary queue
  • fix compilation of lame dynamic plugin.


  • new values for metadata fields does not override old one anymore;
    use setting "request.metadata_decoders.override" to restore old behavior
  • stereo_mode and internal_quality parameters for %mp3 encoder
  • enable mad decoder for MP1 and MP2 in addition to MP3, create aliased
    configuration keys "decoder.file_extensions/mime_types.mad"
  • support for CUE sheet playlists and metadata in M3U
  • setting "decoder.taglib.force_mpeg" to force taglib to consider files as MPEG
  • scripting builtins getenv(), setenv() and environment()
  • scripting builtin source.fallible()
  • harbor is now verb-oriented, supporting GET, POST, PUT, HEAD, DELETE, OPTIONS
  • load DSSI plugins from environment variables and using dssi.register()
  • also display the type of the whole expression when -i is passed
  • generalized custom path support for facilitating standalone distributions
  • and as usual, various improvements in the code, log and error messages, etc.