github savonet/liquidsoap v2.3.0-rc2
Liquidsoap 2.3.0-rc2

pre-releaseone day ago

This is the second release candidate for liquidsoap 2.3.0.

Release Summary

Since the previous release candidate, we have worked on stabilizing certain areas such as our native autocue implementation and memory and CPU usage.

There were a lot of important under-the-hood changes done in this release cycle and, not surprisingly, those need a little more attention before the final release.

But the good news is: more and more of our larger users are switching to this release. 🎉

If you want to get it and try it too, this would help a lot!

What's New?

You can read about some of the most important benefits and changes in memory usage and startup time here and there.

Hopefully, with a little more time and increased adoption, we should be pretty close to the final release.

What's Next?

Oh, one last thing. Want to help us figure out the next step for the project? We would love to hear more about how people use the software and what they're hoping to see happening with it. We know y'all out there but we want to know more! Feel free to fill-up this form.

Thanks!

Full changelog:

2.3.0-rc2 (2024-11-15)

New:

  • Rewrote the streaming API to work with immutable frame content. This
    should greatly impact impredictable side-effect of the previous models w.r.t.
    track marks, content sharing and more. This also impacts multiple operators
    behavior. Mostly, things should be roughly the same with differences around
    behaviors related to track marks (source.on_track and etc). (#3577)
  • Added script caching layer for faster script startup time. See: https://www.liquidsoap.info/blog/2024-06-13-a-faster-liquidsoap/ for details (#3924, #3949, #3959 and #3977)
  • Rewrote the clock/streaming loop layer. This prepares our streaming system to
    support multicore when the OCaml compiler is mature enough to allow it. Clocks
    are now attached to sources via their clock methods. Returned value is a stripped
    down clock variable. Users can use the clock function to retrieve the full
    methods, e.g. s = sine(); c = clock(s.clock). This value has advanced functions
    for clock control such as start/stop, ticks and self_sync to check for
    self-sync. (#3781)
  • Allow frames duration shorter than one video frames, typically values under 0.04s.
    Smaller frames means less latency and memory consumption at the expense of
    a higher CPU usage (#3607)
  • Change default frame duration to 0.02s (#4033)
  • Optimized runtime (#3927, #3928, #3919)
  • Added finally to execute code regardless of whether or not an exception is raised
    (see: #3895 for more details).
  • Added support for Spinitron submission API (#4158)
  • Removed gstreamer support. Gstreamer's architecture was never a good fit for us
    and created a huge maintenance and debugging burden and it had been marked as
    deprecated for a while. Most, if not all of its features should be available using
    ffmpeg. (#4036)
  • Removed taglib support. It is superseded by the internal ocaml-metadata module
    and taglib, with its dependency on the C++ runtime library, has been causing issues
    with binary builds portability and crashes with the (not yet supported) OCaml 5
    compiler. (#4087)
  • Added video.canvas to make it possible to position video elements independently
    of the rendered video size (#3656, blog post)
  • Added cover manager from an original code by @vitoyucepi (#3651)
  • Reworked scheduler queues logic, allow user-defined queues, add options to pick
    the queue to send asynchronous tasks to (#4151)
  • Added non-interleaved API to %ffmpeg encoder, enabled by default when only
    one stream is encoded.
  • Allow trailing commas in record definition (#3300).
  • Added metadata.getter.source.float (#3356).
  • BREAKING: Added duration and ticks to metadata available when computing HLS segment names (#4135)
  • Added optional main_playlist_writer to output.file.hls and
    derivated operator (#3484)
  • Added is_nan, is_infinite, ceil, floor, sign and round (#3407)
  • Added %track.drop to the %ffmpeg encoder to allow partial encoding
    of a source's available tracks (#3480)
  • Added let { foo? } = ... pattern matching (#3481)
  • Added metadata.replaygain method to extract unified replay gain value from metadata (#3438).
  • Added metadata.parse.amplify to manually parse amplify override metadata.
  • Added compute parameter to file.replaygain to control gain calculation (#3438).
  • Added compute parameter to enable_replaygain_metadata to control replay gain calculation (#3438).
  • Added copy: protocol (#3506)
  • Added file.touch.
  • Added support for sqlite databases (#3575).
  • Added string.of_int and string.spaces.
  • Added list.assoc.nullable.
  • Added source.cue (#3620).
  • Added string.chars (#4111)
  • Added atomic file write operations.
  • Added new macos_say speech synthesis protocol. Make it the default implementation for the say:
    protocol on macos.
  • Added settings.request.timeout to set the request timeout globally.

Changed:

  • Reimplemented request.once, single and more using source.dynamic. Removed experiment
    flag on source.dynamic. The operator is considered stable enough to define advanced sources
    but the user should be careful when using it.
  • Mute SDL startup messages (#2913).
  • int can optionally raises an error when passing nan or infinity, int(infinity)
    now returns max_int and int(-infinity) returns min_int. (#3407)
  • Made default font a setting (#3507)
  • Changed internal metadata format to be immutable (#3297).
  • Allow a getter for the offset of on_offset and dropped the metadata
    mechanism for updating it (#3355).
  • string.length and string.sub now default to utf8 encoding (#4109)
  • Disable output paging when TERM environment variable is not set.
  • Allow running as root user inside docker container by default (#3406).
  • Run check_next before playlist's requests resolutions (#3625)
  • Set force to true by default in file.copy to make operator behave
    as expected.
  • BREAKING: Float comparison now follows the expected specs, in particular: nan == x is always false and
    nan != x is always true. Use float.is_nan to test if a float is nan.
  • BREAKING: replaygain no longer takes ebu_r128 parameter (#3438).
  • BREAKING: assume replaygain_track_gain always stores volume in dB (#3438).
  • BREAKING: protocols can now check for nested static uri. Typically, this means
    that requests for an uri of the form: annotate:key="value",...:/path/to/file.mp3
    is now considered infallible if /path/to/file.mp3 can be decoded.
  • Added parents option of file.mkdir (#3600, #3601).
  • Added forced_major_collections record field to the result of runtime.gc.stat() and
    runtime.gc.quick_stat() (#3783).
  • Changed the port for the built-in Prometheus exporter to 9599 (#3801).
  • Set segments_overheader in HLS outputs to disable segments cleanup altogether.
  • Added support for caching LV2 and LADSPA plugins (#3959).
  • Pulseaudio input and output now restart on pulseaudio errors (#4174).

Fixed:

  • Fixed type generalization on values returned from function applications. Most notably,
    this should help with HTTP endpoint registration (#3303, fixed in #4030)

Don't miss a new liquidsoap release

NewReleases is sending notifications on new releases.