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 theirclock
methods. Returned value is a stripped
downclock
variable. Users can use theclock
function to retrieve the full
methods, e.g.s = sine(); c = clock(s.clock)
. This value has advanced functions
for clock control such asstart
/stop
,ticks
andself_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 internalocaml-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
andticks
to metadata available when computing HLS segment names (#4135) - Added optional
main_playlist_writer
tooutput.file.hls
and
derivated operator (#3484) - Added
is_nan
,is_infinite
,ceil
,floor
,sign
andround
(#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 tofile.replaygain
to control gain calculation (#3438). - Added
compute
parameter toenable_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
andstring.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 thesay:
protocol onmacos
. - Added
settings.request.timeout
to set the request timeout globally.
Changed:
- Reimplemented
request.once
,single
and more usingsource.dynamic
. Removed experiment
flag onsource.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 passingnan
orinfinity
,int(infinity)
now returnsmax_int
andint(-infinity)
returnsmin_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
andstring.sub
now default toutf8
encoding (#4109)- Disable output paging when
TERM
environment variable is not set. - Allow running as
root
user insidedocker
container by default (#3406). - Run
check_next
before playlist's requests resolutions (#3625) - Set
force
totrue
by default infile.copy
to make operator behave
as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == x
is alwaysfalse
and
nan != x
is alwaystrue
. Usefloat.is_nan
to test if a float isnan
. - BREAKING:
replaygain
no longer takesebu_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 offile.mkdir
(#3600, #3601). - Added
forced_major_collections
record field to the result ofruntime.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: