Skip to content

Releases: savonet/liquidsoap

Liquidsoap 1.0.0 beta 2

13 Jan 12:13
Compare
Choose a tag to compare
Pre-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

Decoders:

  • 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.mime_types.".
  • Decoder order can be user-defined thanks to new settings
    "decoder.file_decoders", "decoder.stream_decoders" and
    "decoder.metadata_decoders".
  • Indicate which decoder is used in the "decoder" metadata
  • More helpful log for various errors
  • Fix segfault with SdlImage image decoder

Encoders:

  • 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)

Harbor:

  • 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)

Icecast:

  • 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)

Input/output:

  • 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

Operators:

  • 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 http.post()
  • 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
    argument.
  • 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

General:

  • 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

Miscellaneous:

  • 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]

Liquidsoap 1.0.0 beta 1

13 Jan 12:15
Compare
Choose a tag to compare
Pre-release

This beta version introduces two major new features: heterogeneous stream types and clocks.

New:

  • Different sources can carry different types of content.
  • Encoding formats have been introduced to help infer stream content types.
    This brings static checking for bounds in encoding parameters.
  • Introduce conversions between stream contents (mono, stereo, drop
    audio, video, etc) and muxing.
  • Allow explicit type annotations in scripts.
  • Introduce clocks, cleanly allowing for the coexistence of different
    time flows, and avoiding inconsistencies that can result from it.
    Soundcard I/O and cross-based operators notably make use of it.
  • Remove root.sync, replaced by attaching a source s to clock(sync=false,s).
  • Enable dynamic source creation and source.shutdown().
  • Extend and adapt MIDI and video operators.
  • Introduce purely metadata streams (audio=video=midi=0 channels) and
    metadata stream decoder.
  • Support WAV streams in input.http/harbor().
  • Introduce static image decoder using SDL image.
  • Remove bound of request identifies (RID).
  • Experimental: source.dynamic() for advanced dangerous hacking.
  • Make path relative to script in %include "PATH", and introduce
    %include <...> where path is relative to liquidsoap library directory.
  • Add channels_matrix parameter to output.ao().
  • Add on_(dis)connect hooks in input.harbor().

Cleanup and fixes:

  • Lots of cleanup and fixes as with all major code rewriting.
  • Optimize video and stabilize it a little bit... still not perfect.
  • Rewrite stream and file decoding API, as well as file format detection.
  • Enhance shutdown and error message reporting, notably for icecast
    and request-based sources.
  • Avoid quasi-infinite loop in failed request resolving.

Liquidsoap 0.9.2

13 Jan 12:09
Compare
Choose a tag to compare
Liquidsoap 0.9.2 Pre-release
Pre-release

This release is a snapshot of upcoming features. It also contains several important bugfixes. As a snapshot, it contains experimental or unpolished features, and also breaks compatibility with previous versions. You should in particular notice the two "New" items below:

  • random(strict=true) is now called rotate();
  • request sources (playlists, request.*) have a new queuing behavior,
    check the doc (request-sources.html) or revert to conservative=true.

Bugs fixed:

  • Ogg encoder now muxes pages according to their ending time.
  • Support "ogg/audio" and "ogg/video" mime types for HTTP ogg streams.
  • Changed external encoder's "restart_encoder" to the more relevant
    "restart_on_new_track". Added optional "restart_after_delay"
    to restart the encoder after some delay. Also completely rewrite
    stop mechanism. Stop operation now waits for the encoding process
    to finish, allowing proper restart_on_new_track like for ogg encoded
    data.
  • Factorized buffered I/O code. Also added a blocking API, which avoids
    "no available frame" and "reader not ready" messages and audio glitches.
    It enforces that "root.sync" be deactivated for these sources, such that
    synchronisation is done by the source. (#203)
  • Factorized file decoding code.
  • Fixed reversed order when parsing playlists using playlist.parse().
  • Avoid bad crashes when resources lack, e.g. no more memory.
  • Tighten and enforce the inter-source protocol.
  • All outputs: fix the autostart server command. With the former code,
    a modification of the autostart parameter was only taken into account
    one start/stop cycle later.
  • on_blank(): fix a bug that prevented the first call to on_noise.
  • Fixed estimated remaining samples on ogg files, fixes issues with
    operators relying on this value, in particular crossfade() and
    request-based sources when operating in non-conservative mode.
  • Fixed socket descriptor leak in input.http. (#318)
  • Fixed deadlock at init when an exception was raised at wake_up
    phase. (#319)
  • Fix delay() which could sometimes incorrectly declare itself ready,
    and thus try to get some data from its unavailable input source.
  • Bug in queue duration estimation led to infinite feeding of the queue,
    until all request IDs are taken.
  • Several fixes enforcing clean (non-deadlocking) sleep/shutdown.

New:

  • The operator rotate() replaces random(strict=true), and random()
    does not have a strict parameter anymore.
  • Switch to new behaviour in request-based sources.
    Use conservative=true to get to the old behaviour.
  • on_blank(): provide an on_noise handler.
  • playlist*(): add server commands for reloading the playlist and changing
    its URI.
  • Fallible outputs: all outputs now have a fallible mode, in which
    they accept fallible sources, and automatically start/stop when the child
    fails to stream.
  • EXPERIMENTAL ogg/dirac encoding support.
  • output.*.aacplus(): native outputs encoding in AAC+ using ocaml-aacplus.
  • Switched to a custom implementation of the various shout protocols.
    It notably allows arbitrary content-type settings which enables
    AAC+ streaming. Enabled wrappers for external encoders for AAC+ format
    aacplusenc (#220 and #136). Also added custom IRC, AIM and ICQ headers
    to shoutcast wrappers (#192).
  • Harbor now supports Shoutcast/ICY headers properly. This allows in
    particular the use of any supported data format for the source client.
  • Harbor sources now also consider "song" field when updating metadata.
  • Added built-in support for m4a audio files and metadata.
    Made external support optional through enable_faad.
  • Added optional resampling for output.external operators (#273).
  • Added optional host and port parameters for audioscrobbling
    submissions. Allows to use alternate systems, such as libre.fm
    of jamendo's compatibility API. Added nowplaying submission,
    and various wrappers, including a full submission process
    (now playing at beginning, submit some times before the end).
  • New variables in the script language: liquidsoap.version and
    configure.{libdir,pidfile,logdir}.
  • Added built-in support for replay_gain, through the replay_gain protocol
    (enabled by default) and the replay gain metadata resolver (to be enabled
    using enable_replaygain_metadata()). (#103 & #317)
  • Reverse DNS operations can be disabled using settings keys
    "server.telnet.reverse_dns" and "harbor.reverse_dns".

Experimental:

  • MIDI: file decoding, synthesis, virtual keyboard.

Removed:

  • RTP input and output.
  • Removed decoders using ocaml-natty. Slow, unmaintained and superseded
    by the mplayer decoder.

Liquidsoap 0.9.0

13 Jan 12:16
Compare
Choose a tag to compare

Bugs fixed:

  • Fixed byte swapping function.
  • Fixed unix server socket failure (#160).
  • Fixed mp3 audio glitches when decoding
    files with picture id3v2 tags using ocaml-mad (#162).
  • Fixed liquidsoap crash on weird telnet and harbor input (#164).
  • Fixed request.queue() not considering initial queue on wake-up (#196).
  • Fixed source leak in append().
  • Fixed after_output propagation in the transitions of switches (#208).
  • Fixed compilation for ocaml 3.11 (#216).
  • Fixed (again) Vorbis mono output (#211).
  • Avoid crashing on broken symlinks when parsing directories (#154).
  • Use random temporary file in liGuidsoap.
  • Fixed liGuidsoap to use the (not so) new metadata field initial_uri.
  • Fix bugs in the life cycle (sleep/wake_up) of queued request sources,
    which made say_metadata unfunctional.
  • Remove buggy unbuffered {input,output}.jack. (#231)
  • Fixed audio information sent to icecast. (#226)
  • Fixed global reset starting inactive sources. (#227)
  • Fixed shoutcast source initial answer in harbor. (#254)
  • Fixed frame and metadata duplication in cross operators. (#257)
  • Fixed several sources (outputs, external streams) that were not going
    to sleep correctly.

Changes:

  • Warning: interactive_float() is now interactive.float().

New:

  • Compatible with OCaml 3.09.
  • Faster shutdown.
  • Rewrote ogg decoding, for files and streams.
  • Support for ogg skeletons, currently only used for theora.
  • Cleanup icecast class hierarchy and restart mechanism, especially
    with respect to the encoder.
  • Support for breaks and metadata in generators.
    As a result, input.http() and input.harbor() now fully support them.
    See new_track_on_metadata parameters there.
  • Switch operators (fallback,random and switch) can now replay the metadata
    of a source that has been left in the middle of a track.
  • New force_mime parameter for input.http().
  • New insert_missing parameter for append().
  • Multi-line strings in liq scripts, with a caml-like syntax.
  • Slight modification of the scripting syntax, handling unary minus.
  • Added user_agent parameter for input.http and input.lastfm
  • Added speex support for files and HTTP streams.
  • Added EXPERIMENTAL support for AU, AIFF and NSV mp3 audio files
    using ocaml-natty.
  • Added "prefix" parameter to the playlist operators. Allows to prefix
    each uri in order to force resolution through a specific protocol,
    like replaygain: for instance. (#166)
  • Support for external processes as audio encoder:
    • Added output.icecast.lame to output to icecast using the lame binary.
    • Added output.icecast.flac to output to icecast using the flac binary.
    • Full generic support awaits some changes in libshout.
  • Support for external processes as audio stream decoder:
    • Added input.mplayer to stream data coming from mplayer.
  • Support for external processes as audio file decoder:
    • Added support for flac audio files using the flac binary.
    • Added support for m4a files using the faad binary.
    • Added optional support for mplayer, enabled with enable_mplayer().
  • Support for external metadata decoders.
  • Support for generic authentication function in harbor,
    also available for ICY (shoutcast) clients.
  • Added optional support for the samplerate library,
    and dynamic configuration of resampling routine.
  • Added lag() operator, which delays a stream by a constant time.
  • Initial support for PulseAudio.
  • Added experimental support for {input,output}.marshal, allowing
    raw communication between various liquidsoap instances.
  • Added optional alternatives to store buffered audio data:
    • raw: in memory, s16le format
    • disk: on disk, several big files
    • disk_manyfiles: on disk, a lot of small files
      See documentation for more details.
  • Added EXPERIMENTAL video support:
    • Support for ogg/theora file input.
    • Support for ogg/theora file and icecast output
    • Support for SDL output.
    • Optional support for ocaml-gavl as video converter.
    • Support for video in some existing operators, including switches,
      add(), metadata/track manipulations.
    • Added operators: video.fade.*, video.fill, video.greyscale, video.image,
      video.invert, video.lomo, video.noise, video.opacity, video.opacity.blur,
      video.rotate, video.scale, video.sepia, video.text, video.tile,
      video.transparent, video.volume.