Skip to content

Commits on Source 6

1.3.7 (09-04-2019)
1.4.0 (29-09-2019)
=====
Changed:
New:
- Reimplemented `open_process_full` to get a hand on `pid` and finer-grained closing workflow (#703)
- UTF8 parsing!
- Added support for tuples: `x = (1,"aa",false)` (#838)
- Added support for deconstructing tuples: `let (z,t,_) = x` (#838)
- Added `input.{file,harbor}.hls` to read HLS stream (#59, #295, #296).
- Added `output.hls` to natively stream in HLS (#758).
- Added `%ffmpeg` native encoder, only for audio encoding for now (#952)
- Added ffmpeg-based stream decoder, limited to mime type `application/ffmpeg` for now.
- Added `(to_){string,float,int,bool}_getter` operators to handle getters in
script side.
- Made `p` parameter in `smooth_add` a `float` getter (#601)
- Added `source.time` to get a source's clock time.
- Added `max_duration` to limit a source's duration.
- Added `file.temp_dir` to create temporary directories.
- Added `file.{unlink,rmdir}` to remove, resp., file and directories.
- Added `file.write` to write content to a file.
- Added `file.read` to read contents of a file without loading all of it in memory.
- Added `youtube-pl:<ID>` protocol to resolve and parse youtube playlists (or
any playlist supported by `youtube-dl`) (#761)
- Added `protocol.aws.endpoint` setting for the `s3://` protocol, thanks to
@RecursiveGreen. (#778)
- Added support for sandboxing `run_process` calls. (#785)
- Added `harbor.{http,https}.static` to serve static path.
- Added `log.{critical,severe,important,info,warning,debug}`. Use aliases in code as well (#800, #801, #802)
- Added `sleep` function.
- Added `mkavailable` function.
- Added `fade.skip` function. (#804)
- Added `video.external.testsrc` function.
- Added `video.frame.*` and `audio.samplerate`.
- Added `input.external.ffmpeg` and `output.external.ffmpeg`.
- Added `output.youtube.live.ffmpeg`.
- Added `output.file.hls.ffmpeg`.
- Added `reopen` telnet command in `output.external`.
- Enabled external decoders in windows (#742)
- Added support for bash completion.
- Added `video.add_text.native`.
- Added `configure.bindir`
- Added `for` and `while` loop functions.
- Added `list.case`.
- Added `metadata.string_getter` and `metadata.float_getter`.
- Added `string.contains`.
- Added `request.uri`.
- Added `{input,output}.srt` (#898)
- Added `path.remove_extension`.
- Added SSL read/write timeout options, use it for incoming socket connections (#932)
- Added ffmpeg resampler (#947).
- Added `lsl` and `lsr`.
- Better log message when request download times out (#708)
Changed:
- Drop `log.level` for `ffmpeg` messages to `5`
- Depends on OCaml >= 4.08.0
- Changed return type of `http.*` and `run_process` to use tuples (#838)
- Better error reporting with coloring and uniform format. (#790)
- Improved reporting of file, line and character during parsing errors.
- Remove dynamic plugin build option.
- Made `on_end` delay a float getter.
- Reimplemented `fade.{in,initial,out,final}` as scripted operators. (#664)
- Removed `cross`/`crossfade` operators, superseeded by
`smart_cross`/`smart_crossfade`
- Rename `smart_cross`/`smart_crossfade` operators as `cross`/`crossfade`
- Default behavior of `crossfade` is old (simple) crossfade. Use `smart=true`
to enable old `smart_crossfade` behavior.
- Rename `file.duration` as `request.duration`
- Removed duplicate `is_directory`
- Rename `{basename,dirname}` as `path.{is_directory,basename,dirname}`
- Empty playlists return by scripted resolvers is now considered a failure to
resolve.
- Rewrite `smooth_add` to use new `mkcross` functions.
- Reimplemented `open_process_full` to get a hand on `pid` and finer-grained
closing workflow (#703)
- Added `transition_length` to `switch`-based operators to limit transition
lengths and allow garbage collection of transition sources.
- SDL renders text in UTF-8. (#712)
- Made `x` and `y` parameters in `video.add_text` `float` getters. (#730)
- Reimplemented `extract-replaygain` using `ffmpeg`, added an optional replay
gain option to the `ffmpeg2wav` protocol. Thanks to @Yamakaky for contributing
on this. (#749)
- The `ratio` parameter of `compress` and `limit` is a float getter. (#745)
- Removed `rewrite_metadata` which had been deprecated for a while now.
- Allow string getter for `harbor` HTTP responses.
- Renamed `get_clock_status` to `clock.status` and `log_clocks` to `clock.log`.
- Renamed `rms_window` parameter of `compress` to `window`. (#796)
- Added `chop` operator.
- Keep master tracks' boundaries in `mux_*` functions. (#795)
- Added `new_track` optional argument to callback in `insert_metadata`.
- Use getters for weights of `rotate`. (#808)
- Added `conservative`, `length` and `default_duration` params to
`playlist.{reloadable,once,merge}` (#818)
- Renamed `input.external` into `input.external.rawaudio`, added
`input.external.wav`.
- Renamed `gstreamer.hls` to `output.file.hls.gstreamer`.
- Raise an error when using a format (e.g. `%vorbis`, `%mp3`, ..) that is not
enabled. (#857)
- Set default encoders and ladspa plugins samplerate and channels to configured
internal `"frame.audio.samplerate"` and `"frame.audio.channels"`. (#870)
- Handle unary minus in the preprocessor instead of the parser in order to avoid
duplicating the parser. (#860)
- Add `filter` option to `playlist.once`.
- Added a `replay_delay` option to the `pipe` operator to replay metadata and
breaks after a delay instead of restart the piping process. (#885)
- Add `buffer_length` telnet command to `input.harbor`.
- Bumped default `length` parameter for request-based sources (`playlist`,
`request.dynamic`, ..) to `40.` to assure that there always is at least
one request ready to play when the current one ends.
- Added support for cue in/out and fade in/out/type metadata support in `ffmpeg2wav`
protocol. Rename protocol to `ffmpeg`. (#909)
- `list.assoc` and `list.remove_assoc` require an ordered type as first
component.
- Renamed `quote` to `string.quote`.
- Added `phase_inversion={true/false}` to `%opus` encoder (#937)
- Fixed encoders forcing frame rate and audio channels too early (#933)
- Change filename to a string getter in file-based outputs. (#198)
- Changed `audio.converter.samplerate.preferred` option to
`audio.converter.samplerate.converters` to give a list of possible converters.
Fixed:
- Timeout when executing external processes (#691, #736, #726, #708)
- Lack of documentation for `cross`/`crossfade` (#743)
- Fixed before metadata being lost during crossfade not in conservative mode.
- Correct types and default values for `random.int` (#767).
- Allow changing pipeline in gstreamer functions. (#762)
- Script deadlock after a long time, most likely related to old crossfade
transitions (#755)
- AVI export fixed. (#789)
- `%external` does not stop processes anymore on each metadata. (#789)
- Fixed exit getting stuck when using `input.jack` (#769)
- Stop lo server on shutdown. (#820)
- Fixed external process stop not detected on second and further calls (#833)
- Add `seek` in operators where implementation is clear (#853)
- Do not enter buffering mode between tracks in `buffer` (#836)
- Fixed file descriptor leak in external processes (#865)
- Fixed encoded output creating empty files from failing sources (#876)
- Fixed `cue_cut` not working when used before `cross`/`crossfade` (#874)
- Fixed audio glitches when seeking within a MP3 file.
- Fixed `insert_metadata` logic when insert new track and metadata (#903)
- Fixed `replay-gain` script default location.
- Fixed audio glitches at the end of crossfade transitions.
- Specify that `list.remove` removes only the first occurrence and avoid
reversing the list (#922).
- File descriptor leak when using openssl-based operators.
- Fixed SSL read taking too long to timeout (#932)
- Fixed output starting when underlying source is not available (#393)
1.3.7 (09-04-2019)
=====
- Set buffering only when frame is partial in time_wrap.ml. Makes it work with crossfade transitions (#695)
Changed:
- Changed `Icy-MetaData:1` to `Icy-MetaData: 1` in HTTP source headers. Fixes some shoutcast implementations (#727)
- Reimplemented `open_process_full` to get a hand on `pid` and finer-grained
closing workflow (#703)
- Better log message when request download times out (#708)
- Drop `log.level` for `ffmpeg` messages to `5`
Fixed:
- Timeout when executing external processes (#691, #736, #726, #708)
- Set buffering only when frame is partial in time_wrap.ml. Makes it work with
crossfade transitions (#695)
- Changed `Icy-MetaData:1` to `Icy-MetaData: 1` in HTTP source headers. Fixes
some shoutcast implementations (#727)
- Fixed deadlock in `input.http` source status command (#367)
1.3.6 (23-01-2019)
......@@ -24,35 +169,27 @@ Fixed:
Fixed:
- Fixed smart_crossfade transitions skipping data after track marks. (#683, #652)
- Fixed smart_crossfade transitions skipping data after track marks. (#683,
#652)
- Fixed `input.pulseaudio` parameters.
- Fixed crash when copying frame content (#684)
1.3.5 (25-12-2018)
=======
=====
New:
- Added a bunch of base mathematics primitive, `exp`, `log`, `cos`, `sine`, ...
- Added `"extinf_duration"` to parsed `#EXTINF` metadata.
Fixed:
- Fixed inotify watch semantics (#677)
- Enhanced `#EXTINF` parsing in ambigious cases (#625)
- Fixed `output.youtube.live` (#630)
- Make sure server writes are synchronous (#643)
- Fixed crash when loading some frei0r plugins (#435)
- Fixed compilation with `osx-secure-transport`
- Fixed invalid opus stream generated when no data was ever encoded (#180)
1.3.4 (10-09-2018)
......@@ -60,63 +197,45 @@ Fixed:
New:
- Added `FFMPEG` decoder using the new `ocaml-ffmpeg` API. Thanks for @gndl for the hard work there.
- Added `FFMPEG` decoder using the new `ocaml-ffmpeg` API. Thanks for @gndl for
the hard work there.
- Added `"init.allow_root"` setting to allow running liquidsoap as root.
- Added `on_track` callback for playlists. Can be used to force a reload.
- Added `server.condition`, `server.wait`, `server.broadcast` and `server.signal`. Used to control server command execution.
- Added `server.write`, `server.read{chars,line}` to write interactive server commands in conjunction with the above functions. (#544, #568)
- Added `output.youtube.live` as a wrapper around `output.gstreamer.audio_video` to stream live to Youtube (#498)
- Added `server.condition`, `server.wait`, `server.broadcast` and
`server.signal`. Used to control server command execution.
- Added `server.write`, `server.read{chars,line}` to write interactive server
commands in conjunction with the above functions. (#544, #568)
- Added `output.youtube.live` as a wrapper around `output.gstreamer.audio_video`
to stream live to Youtube (#498)
- Added metadata extraction to `ffmpeg2wav` protocol (#623).
Changed:
- Depends on OCaml >= 4.03.0
- Depends on camomile > 1.0.0
- Use `http{s}.head` when available to fetch remote file's mime type. (win32 port)
- Use `http{s}.head` when available to fetch remote file's mime type. (win32
port)
- Better log messages for root exit and buffer override.
- Switch default log to stdout. Set to file when `log.file.path` is set (#612)
- Disabled Gstreamer stream decoder.
- Removed asynchronous mode for `output.gstreamer.audio_video`
- Reworked `smartcross` internal logic (#596)
- Enabled `replaygain` on `m4a` files, thanks to @gilou (#604)
- Added `encoding` parameter to `output.shoutcast` to allow alternative string encoding for metadata updates (#411)
- Deprecated `rewrite_metadata`
Fixed:
- Decouple dyntools compilation.
- Support for OCaml >= 4.06
- File descriptor leak in `output.icecast` (#548)
- Fixed URL regexp for `input.https` (#593)
- Multiple gstreamer fixes:
- File decoder with video.
- Memory leaks (#516, #511, #434, #318)
- Process freeze (#608, 278)
- Duppy crash on exit (#160)
- Fixed audio glitches when using the `pipe` operator (#614)
- Deadlock in external decoder. (#611)
1.3.3 (14-10-2017)
......@@ -125,31 +244,23 @@ Fixed:
New:
- 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.
- Added `"decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path"`
configuration settings.
Changed:
- 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:
- 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)
1.3.2 (02-09-2017)
......@@ -158,25 +269,19 @@ Fixed:
Changed:
- 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.
Fixed:
- Fix scheduler loop causing high CPU usage when using Process_handler without some of the default callbacks. (#475)
- 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)
- 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.
- Fix deadlock calling logging functions from within `Gc.finalise` (#609)
1.3.1 (28-05-2017)
......@@ -184,17 +289,17 @@ Fixed:
New:
- Allow any tags allowed in `"encoder.encoder.export"` settings in vorbis streams (#418)
- 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:
- Fixed run_process, get_process_lines, get_process_output when compiling with OCaml <= 4.03 (#437, #439)
- 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.
- Revert default handling of environment in run_process, get_process_lines,
get_process_output to passing calling process' environment by default.
1.3.0 (27-04-2017)
=====
......@@ -202,67 +307,44 @@ Fixed:
New:
- 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)
- 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)
- 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
Changed:
- 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):
......@@ -272,30 +354,21 @@ Deprecated (can be removed in any future version):
Removed:
- 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.
Bugfixes:
- 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.
- Compute normalization regardless of child sources ready status in add() to
avoid unexpected change of volume.
1.2.1 (01-07-2016)
......@@ -304,23 +377,16 @@ Bugfixes:
New:
- 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.
Bugfixes:
- Fix metadata update for shoutcast v2 when sid <> 1 (#320).
- Fix connection to input.harbor using the shoutcast v1 protocol (#337).
......@@ -331,61 +397,39 @@ New:
- 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.
Enhancements:
- 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.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
(#83).
- 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).
Bugfixes:
- Correctly close connection in http.get / http.post (#72).
- Remove input.lastfm which has been broken for a while.
- Lots of small bugfixes.
1.1.1 (08-05-2013)
......@@ -395,167 +439,107 @@ New:
- 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.
Enhancements:
- Handle more OSC types (float, float_pair, bool, string, string_pair) and added
osc.on_*.
- Better infrastructure for decoding images. add_image can now handle most image
file types.
- Add random.int 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.
Bugfixes:
- 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.
1.1.0 (04-03-2013)
==================
This version brings some new features as well as correcting bugs.
==================
** This version brings some new features as well as correcting bugs. **
New:
- 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
set("request.metadata_decoders.duration",true)
- 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)
Enhancements:
- 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 file.watch 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 fade.final 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 https://github.com/savonet/liquidsoap/issues
Bugfixes:
- 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.
1.0.1 (04-07-2012)
==================
This version brings bug fixes and minor enhancements over 1.0.0.
==================
** This version brings bug fixes and minor enhancements over 1.0.0. **
Fixes:
- 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
......@@ -568,7 +552,9 @@ Fixes:
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:
- 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
......@@ -586,6 +572,7 @@ New:
1.0.0 (08-10-2011)
==================
Finally, the 1.0.0 release! It brings several important fixes, but
also some nice novelties.
The most outstanding difference concerns output.icecast(): its restart
......@@ -598,8 +585,9 @@ Note that on_error defaults to fun(_)->3. which is equivalent to having
restart=true, restart_delay=3. in previous versions, NOT the same as the
former restart=false default. As a result, liquidsoap won't fail to startup
if an initial connection attempt fails.
==================
Fixes:
- LS-532,527: avoid freeze after errors in streaming threads or source
initialization routines
- LS-542: race condition in playlist*() breaking randomness
......@@ -671,14 +659,16 @@ Enhancements:
1.0.0 beta2 (04-07-2011)
========================
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).
......@@ -693,7 +683,9 @@ 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!
......@@ -703,7 +695,9 @@ Encoders:
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.
......@@ -713,7 +707,9 @@ Harbor:
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)
......@@ -722,7 +718,9 @@ Icecast:
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)
......@@ -734,7 +732,9 @@ Input/output:
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
......@@ -745,7 +745,9 @@ 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()
......@@ -757,7 +759,9 @@ Scripting API:
- 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 <playlist>.uri without an
argument.
- Ehance <queue>.ignore now works also in the primary queue
......@@ -766,7 +770,9 @@ Server interface:
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
......@@ -777,7 +783,9 @@ Script language:
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
......@@ -809,7 +817,9 @@ General:
- 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]
......@@ -824,9 +834,12 @@ Miscellaneous:
1.0.0 beta1 (06-09-2010)
========================
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.
......@@ -849,7 +862,9 @@ New:
%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.
......@@ -857,12 +872,14 @@ Cleanup and fixes:
and request-based sources.
- Avoid quasi-infinite loop in failed request resolving.
0.9.3 (04-09-2010)
==================
This release is a bugfix of the latest snapshot (0.9.2).
It will be the last bugfix before 1.0.
Bugs fixed:
- Add "audio/mpegurl" to the list of mime-type for basic playlist parsing.
- Decode arguments passed to input.harbor.
- Use Camomile framework to try to recode arguments and user/password
......@@ -874,15 +891,18 @@ Bugs fixed:
0.9.2 (29-10-2009)
==================
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
......@@ -914,7 +934,9 @@ Bugs fixed:
- 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.
......@@ -950,16 +972,22 @@ New:
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.
0.9.1 (18-06-2009)
==================
Bugs fixed:
- Fixed request task not ending properly for request-driven sources (playlist,
request.queue, request.equeue). Fixes a problem reported when reloading
an empty playlist multiple times. (#269)
......@@ -970,6 +998,7 @@ Bugs fixed:
Thanks to Roman Savrulin for reporting and fixing !
- Taglib metadata resolver is only used on files decoded
by the MP3 decoder.
New:
- Get a node's striping status when stripping
blank with strip_blank (#260).
......@@ -987,7 +1016,9 @@ New:
0.9.0 (01-03-2009)
==================
Bugs fixed:
- Fixed byte swapping function.
- Fixed unix server socket failure (#160).
- Fixed mp3 audio glitches when decoding
......@@ -1010,9 +1041,13 @@ Bugs fixed:
- 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.
......@@ -1064,8 +1099,8 @@ New:
* 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.
* 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,
......@@ -1073,6 +1108,7 @@ New:
0.3.8.1 (11-08-2008)
====================
- Fixed metadata propagation during default transition
in smart_crossfade
- Changed transition evaluation order in smart_crossfade
......@@ -1080,7 +1116,9 @@ New:
0.3.8 (30-07-2008)
==================
Bugs fixed:
- Vorbis mono output is now working
- Fixed parameter parameter description
in the documentation
......@@ -1094,7 +1132,9 @@ Bugs fixed:
- Fixed metadata update in input.harbor with icecast2 source protocol
- Fixed shutdown function. Fixes #153
- Fixed input.oss. Liquidsoap now works with OSS4 ! Fixes #158
New:
- Added a hook to execute a function when playlist.once ends
- Enhanced smart_crossfade
- Added string.case and string.capitalize
......@@ -1112,12 +1152,16 @@ New:
- Insert latest metadata for a node of a switch source when switching
back to it in a middle of a track.
- Added a 'conservative' parameter to cross, smilar to the one in smartcross.
Internal:
- Enhanced liqi documentation parser to build the website.
0.3.7 (03-06-2008)
==================
Bugs fixed:
- Now works on FreeBSD and hopefully other unices that are stricter than
Linux about Mutex usage.
- input.http() now has a bind_address parameter.
......@@ -1129,7 +1173,9 @@ Bugs fixed:
- No "." in IDs and labels.
- Resources: FD leaks, useless threads (threads leaks?) in input.http().
- fade.out() used to run into infinite loops when the delay was 0.
New:
- New documentation system and website.
- Self-documenting server with a more helpful "help" command.
- Moved to duppy: less threads, lighter load, and an configurable scheduler.
......@@ -1149,12 +1195,16 @@ New:
- Dynamic amplification factor in amplify(), e.g. useful for replay gain.
- Lots of new functions in the scripting API: for lists, requests, system
interaction, shutdown, command-line parsing, scripted server commands, etc.
As always:
- code cleanup, style, etc.
0.3.6 (17-12-2007)
==================
Bugfix release:
- Close Http socket
- Add http socket timeout
- Close playlist file after reading its content
......@@ -1164,13 +1214,16 @@ Bugfix release:
0.3.5 (08-11-2007)
==================
Bugfix release:
- Fixed #57: scpls and mpegurl playlist parsing
- Fixed #46: Late cross-scripts bindings
0.3.4 (25-09-2007)
==================
Notation: "-" stands for a change, "+" for an addition.
* Language
- Support for polymorphism, subtyping and basic ad-hoc polymorphism,
which allows a much simpler API, notably for maths and serialization.
......@@ -1204,6 +1257,7 @@ Notation: "-" stands for a change, "+" for an addition.
0.3.3 (06-06-2007)
==================
* Major cleanup of the core stream representation; moved to float arrays,
removing several back-and-forth conversions and enhancing the perfs a lot;
reviewed all sources and operators, made many minor enhancements btw.
......@@ -1230,6 +1284,7 @@ Notation: "-" stands for a change, "+" for an addition.
0.3.2 (16-03-2007)
==================
* New portable output to speakers using libao().
* Updated liGuidsoap to use it until ALSA gets enhanced.
* Implemented a decent estimation of the remaining time in a track.
......@@ -1250,6 +1305,7 @@ Notation: "-" stands for a change, "+" for an addition.
0.3.1 (17-11-2006)
==================
* More standards-compliant tarball
* Generate doc with locally built liquidsoap
* Try to cope with ill-formed mp3
......@@ -1258,6 +1314,7 @@ Notation: "-" stands for a change, "+" for an addition.
0.3.0 (27-08-2006)
==================
* Many minor and major fixes at every level!
* Conversion of metadata to UTF8.
* Got rid of too many threads by scheduling all download tasks
......@@ -1303,8 +1360,10 @@ Notation: "-" stands for a change, "+" for an addition.
0.2.0 (20-04-2005)
==================
* Proper initial release.
0.1.0 (2004)
============
* Release for academic demonstration, not functionnal.
* Release for academic demonstration, not functional.
This diff is collapsed.
Liquidsoap 1.3.7
----------------
Below is a list of dependencies, mostly OCaml libraries. Optional libraries
provide extra features. They need to be detected by the "configure" script.
Most of the libraries are developed by the Savonet project and, in addition to
being available through traditional distribution channels, are bundled in the
liquidsoap-<version>-full.tar.bz2 tarballs for easier builds.
Libraries not developed by Savonet are:
camlimages
camomile
gd4o
ocaml-pcre
ocaml-magic
ocaml-sdl
yojson
Mandatory dependencies:
OCaml compiler >= 4.03.0
ocaml-dtools >= 0.4.0
ocaml-duppy >= 0.6.0
ocaml-mm >= 0.4.0
ocaml-pcre
Recommended dependencies:
camomile >=1.0.0 Charset recoding in metadata
ocaml-magic >=0.6 File type detection
festival Speech synthesis
Optional dependencies :
ocaml-cry >=0.6.0 Sending to Shoutcast & Icecast
ocaml-ogg >=0.5.0 Ogg codecs
ocaml-vorbis >=0.7.0 Ogg/Vorbis codec
ocaml-opus >=0.1.1 Ogg/Opus codec
ocaml-theora >=0.3.1 Ogg/Theora codec
ocaml-speex >=0.2.1 Ogg/Speex codec
ocaml-flac >=0.1.4 Flac and Ogg/Flac codec
ocaml-mad >=0.4.4 MP3 decoding
ocaml-lame >=0.3.2 MP3 encoding
ocaml-shine >=0.2.0 Fixed-point MP3 encoding
ocaml-taglib >=0.3.0 MP3ID3 metadata access
ocaml-faad >=0.4.0 AAC stream decoding
ocaml-fdkaac >=0.2.1 AAC(+) encoding
camlimages >=4.0.0 Image decoding
ocaml-sdl Display, font & image support
ocaml-gavl >=0.1.4 Video conversion using the gavl library
ocaml-ffmpeg >=0.2.0 Video conversion using the ffmpeg library
ocaml-samplerate >=0.1.1 Libsamplerate audio conversion
ocaml-lastfm >=0.3.0 Lastfm protocol support
ocaml-xmlplaylist >=0.1.3 XML-based playlist formats
ocaml-dssi >=0.1.1 DSSI sound synthesis
ocaml-frei0r >=0.1.0 Frei0r plugins
ocaml-lo >=0.1.0 OSC (Open Sound Control) support
ocaml-ladspa >=0.1.4 LADSPA plugins
ocaml-soundtouch >=0.1.7 Libsoundtouch's audio effects
ocaml-ao >=0.2.0 Output via libao
ocaml-alsa >=0.2.1 ALSA I/O
ocaml-portaudio >=0.2.0 Portaudio I/O
ocaml-pulseaudio >=0.1.2 PulseAudio I/O
ocaml-bjack >=0.1.3 Jack support
ocaml-gstreamer >=0.3.0 GStreamer input, output and encoding/decoding
ocaml-inotify >=1.0 Reloading playlists when changed
ocaml-ssl >=0.5.2 SSL/https support
osx-secure-transport SSL/https support via OSX's SecureTransport
yojson Parsing JSON data (of_json function)
gd4o Video.add_text() on servers without X
Runtime optional dependencies:
curl http/https/ftp support
How to install
--------------
*BSD users, as well as OSX users might need to export some variables that can be
missing during the process:
% export CPPFLAGS=-I/usr/local/include
% export LDFLAGS=-L/usr/local/lib
% export OCAMLMKLIB_FLAGS=-L/usr/local/lib
Also, liquidsoap needs GNU make. If you have a GNU make, this is normally
detected during configuration. If this check fails you can set the MAKE
variable:
% export MAKE=`your make command`
The following assumes your MAKE command is make. Change to yours if different.
Now you can start the build configuration:
% ./configure
If you want a complete installation of liquidsoap, enabling a production use of
liquidsoap as a daemon, you should pass --with-user=<login> and
--with-group=<group> options to indicate which user/group you have created for
liquidsoap.
Then, build the software:
% make
You can also generate the documentation for liquidsoap:
% make doc
It will generate the HTML documentation, including a version of the scripting
API reference corresponding to your configuration. If Perl's module XML::DOM is
not available it only generate a stub reference and issue a warning.
Then, you may proceed to the installation. You may need to be root for that.
% make install
This will not install files such as /var/log/liquidsoap unless you have provided
a user/group under which liquidsoap should be ran. This behavior can be
overridden by passing INSTALL_DAEMON="yes" (useful for preparing binary
packages).
For installing developers documentation, run:
% make api-doc-install
Then if you want services to be installed in $prefix/etc/init.d, run one of the
following. service is for a generic /bin/sh service, gentoo is for a gentoo
compliant service, to be used iff you've a gentoo linux.
% make (service|gentoo)-install
See /doc for understanding liquidsoap scripting. Have fun!
SUBDIRS= src examples doc gui scripts
DISTFILES = CHANGES COPYING INSTALL README \
bootstrap configure.ac configure config.h.in \
Makefile Makefile.defs.in Makefile.rules install-sh
SUBDIRS= src examples doc gui scripts libs
DISTFILES = CHANGES CHANGES.md COPYING README README.md \
VERSION bootstrap configure.ac configure config.h.in \
Makefile Makefile.defs.in Makefile.rules install-sh \
liquidsoap.opam.in liquidsoap.opam
DISTDIRS = m4
top_srcdir=.
......@@ -11,40 +12,35 @@ distclean: pre-distclean
rm -f Makefile.defs
pre-distclean: clean
rm -rf config.log config.status config.h autom4te.cache \
src/configure.ml scripts/liquidsoap.initd \
scripts/liquidsoap.gentoo.initd scripts/liquidsoap.logrotate \
gui/liguidsoap $(DISTDIR) $(DISTDIR).tar.bz2
src/configure.ml scripts/liquidsoap.logrotate \
gui/liguidsoap liquidsoap.config $(DISTDIR) $(DISTDIR).tar.bz2
test:
$(MAKE) -C src/test test
$(MAKE) -C doc test
$(MAKE) -C scripts/tests test
# Build liquidsoap as it will be used for building the doc
doc-local: all
.PHONY: system-install gentoo-install finish-configure
.PHONY: finish-configure
finish-configure:
ifneq ($(CUSTOM_PATH),yes)
@echo let rundir = \"$(localstatedir)/run/liquidsoap\" >> src/configure.ml
@echo let logdir = \"$(localstatedir)/log/liquidsoap\" >> src/configure.ml
@echo let libs_dir = \"$(libdir)/liquidsoap/$(libs_dir_version)\" >> src/configure.ml
@echo let plugins_dir = \"$(libdir)/liquidsoap/$(libs_dir_version)/plugins\" >> src/configure.ml
@echo let bin_dir = \"$(libdir)/liquidsoap/$(libs_dir_version)\" >> src/configure.ml
@echo let libs_dir = \"$(datadir)/liquidsoap/$(libs_dir_version)/libs\" >> src/configure.ml
@echo let bin_dir = \"$(datadir)/liquidsoap/$(libs_dir_version)/bin\" >> src/configure.ml
@echo let \(\) = add_subst \"\<sysrundir\>\" \"$(localstatedir)/run/liquidsoap\" >> src/configure.ml
@echo let \(\) = add_subst \"\<syslogdir\>\" \"$(localstatedir)/log/liquidsoap\" >> src/configure.ml
else
@echo let rundir = get_dir \"run\" >> src/configure.ml
@echo let logdir = get_dir \"logs\" >> src/configure.ml
@echo let plugins_dir = get_dir \"plugins\" >> src/configure.ml
@echo let libs_dir = get_dir \"libs\" >> src/configure.ml
@echo let bin_dir = get_dir \".\" >> src/configure.ml
@echo let \(\) = add_subst \"\<sysrundir\>\" \".\" >> src/configure.ml
@echo let \(\) = add_subst \"\<syslogdir\>\" \".\" >> src/configure.ml
endif
@echo let restart = ref false >> src/configure.ml
@echo let \(\) = init_dyntools plugins_dir >> src/configure.ml
@echo let display_types = ref false >> src/configure.ml
@echo let exe_ext = \"$(EXEEXT)\" >> src/configure.ml
@echo "let vendor = \
......@@ -73,30 +69,21 @@ api-doc-install:
install-local: doc-install
ifeq ($(INSTALL_DAEMON),yes)
$(INSTALL_DIRECTORY) -o ${user} -g ${group} -m 2775 \
${localstatedir}/log/liquidsoap
$(INSTALL_DIRECTORY) -o ${user} -g ${group} -m 2775 \
${localstatedir}/run/liquidsoap
$(INSTALL_DIRECTORY) -o ${user} -g ${group} -m 2775 ${localstatedir}/log/liquidsoap
$(INSTALL_DIRECTORY) -o ${user} -g ${group} -m 2775 ${localstatedir}/run/liquidsoap
endif
$(INSTALL_DIRECTORY) $(bindir)
$(INSTALL_DIRECTORY) $(libdir)/liquidsoap/$(libs_dir_version)
$(INSTALL_PROGRAM) scripts/extract-replaygain $(libdir)/liquidsoap/$(libs_dir_version)
for l in externals.liq lastfm.liq utils.liq shoutcast.liq flows.liq video.liq \
http.liq http_codes.liq pervasives.liq deprecations.liq protocols.liq gstreamer.liq ; \
do \
$(INSTALL_DATA) scripts/$$l $(libdir)/liquidsoap/$(libs_dir_version) ; \
$(INSTALL_DIRECTORY) $(datadir)/liquidsoap/$(libs_dir_version)/bin
$(INSTALL_DIRECTORY) $(datadir)/liquidsoap/$(libs_dir_version)/libs
$(INSTALL_PROGRAM) scripts/extract-replaygain $(datadir)/liquidsoap/$(libs_dir_version)/bin
find libs | grep '\.liq$$' | while read l; do \
$(INSTALL_DATA) $$l $(datadir)/liquidsoap/$(libs_dir_version)/libs ; \
done
$(INSTALL_DIRECTORY) ${sysconfdir}/liquidsoap
$(INSTALL_DATA) examples/radio.liq \
${sysconfdir}/liquidsoap/radio.liq.example
$(INSTALL_DATA) examples/radio.liq ${sysconfdir}/liquidsoap/radio.liq.example
$(INSTALL_DIRECTORY) ${sysconfdir}/logrotate.d
$(INSTALL_DATA) scripts/liquidsoap.logrotate \
${sysconfdir}/logrotate.d/liquidsoap
gentoo-install:
$(INSTALL_PROGRAM) -D \
scripts/liquidsoap.gentoo.initd ${sysconfdir}/init.d/liquidsoap
service-install:
$(INSTALL_PROGRAM) -D \
scripts/liquidsoap.initd ${sysconfdir}/init.d/liquidsoap
$(INSTALL_DATA) scripts/liquidsoap.logrotate ${sysconfdir}/logrotate.d/liquidsoap
$(INSTALL_DIRECTORY) ${bashcompdir}
$(INSTALL_DATA) scripts/bash-completion ${bashcompdir}/liquidsoap
$(INSTALL_DIRECTORY) ${emacsdir}
$(INSTALL_DATA) scripts/liquidsoap-mode.el ${emacsdir}/
......@@ -18,6 +18,8 @@ sysconfdir = @sysconfdir@
localstatedir = @localstatedir@
datarootdir = @datarootdir@
datadir = @datadir@
bashcompdir = @bashcompdir@
emacsdir = @emacsdir@
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DIRECTORY = @INSTALL@ -d
......@@ -29,6 +31,8 @@ CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
LDFLAGS = @LDFLAGS@
OS_TYPE = @OS_TYPE@
WIN32_HOST = @WIN32_HOST@
UNIX_HOST = @UNIX_HOST@
CUSTOM_PATH = @W_CUSTOM_PATH@
EXEEXT = @EXEEXT@
CAMLP4O = @CAMLP4O@
......@@ -51,9 +55,9 @@ BYTE=@BYTE@
OCAMLC=@OCAMLC@
OCAMLCOMP=@OCAMLCOMP@
OCAMLDEP=@OCAMLDEP@
OCAMLLEX=@OCAMLLEX@
OCAMLYACC=@OCAMLYACC@
OCAMLMKLIB=@OCAMLMKLIB@
OCAMLLEX=@OCAMLLEX@
MENHIR=@MENHIR@
NO_CUSTOM=@NO_CUSTOM@
OCAMLFIND=@OCAMLFIND@
OCAMLDOC=@OCAMLDOC@
......@@ -62,10 +66,6 @@ OCAML_MINOR=@OCAML_MINOR@
OCAML_REVISION=@OCAML_REVISION@
OCAML_HAS_FIRST_CLASS_MODULES=@OCAML_HAS_FIRST_CLASS_MODULES@
liquidsoap_PLUGINS=@PLUGINS@
@PLUGINS_DATA@
W_MM=@W_MM@
W_CRY=@W_CRY@
W_OGG=@W_OGG@
......@@ -104,13 +104,13 @@ W_FFMPEG=@W_FFMPEG@
W_CAMLIMAGES=@W_CAMLIMAGES@
W_GSTREAMER=@W_GSTREAMER@
W_FREI0R=@W_FREI0R@
W_DUPPY_SYNTAX=@W_DUPPY_SYNTAX@
W_LO=@W_LO@
W_YOJSON=@W_YOJSON@
W_DYNLINK=@W_DYNLINK@
W_GD=@W_GD@
W_INOTIFY=@W_INOTIFY@
W_WINSVC=@W_WINSVC@
W_SRT=@W_SRT@
W_SSL=@W_SSL@
W_OSX_SECURE_TRANSPORT=@W_OSX_SECURE_TRANSPORT@
......
......@@ -12,7 +12,7 @@ include $(top_srcdir)/Makefile.defs
all: all-local all-subdirs all-auto
install: install-local install-subdirs
clean: clean-subdirs clean-local clean-buildings
rm -f *.~ *.orig *.cmo *.cmi *.cmx *.cma *.cmxa *.cmxs *.o *.so *.a *.annot
rm -f *.~ *.orig *.cmo *.cmi *.cmx *.cma *.cmxa *.cmxs *.o *.so *.a *.annot *.cmt *.cmti
doc: doc-local doc-subdirs doc-auto
# Those rules must be bound
......@@ -39,7 +39,7 @@ clean-subdirs:
done
doc-subdirs:
-@for dir in $(SUBDIRS) ; do \
@for dir in $(SUBDIRS) ; do \
$(MAKE) -C $$dir doc || exit $$? ; \
done
......@@ -77,14 +77,10 @@ _OCAML_LFLAGS=$($(PROG)_ocamllflags)
-include $(PROG)_depend
# Include plugin sources for dependencies computation..
plugins_sources=
$(foreach plug,$($(PROG)_PLUGINS),$(eval plugins_sources+=$($(plug)_sources)))
$(PROG)_depend: $($(PROG)_sources) $($(PROG)_headers) $(plugins_sources)
$(PROG)_depend: $($(PROG)_sources) $($(PROG)_headers)
$(V)echo OCAMLDEP
$(V)$(OCAMLDEP) $(_DEP_OPTS) $(DEP_OPTS) \
$($(PROG)_sources) $($(PROG)_headers) $(plugins_sources) > $@
$($(PROG)_sources) $($(PROG)_headers) > $@
dll$(PROG).so: $($(PROG)_c_files:.c=.o)
$(V)echo OCAMLMKLIB -o dll$(PROG).so
......@@ -105,7 +101,7 @@ ifdef $(PROG)_c_files
endif
endif
$(PROG)$(EXEEXT): $($(PROG)_sources:.ml=.$(o)) $(c_objs) $($(PROG)_PLUGINS:%=plugins/%.$(s))
$(PROG)$(EXEEXT): $($(PROG)_sources:.ml=.$(o)) $(c_objs)
$(V)echo $(OCAMLCOMP) -o $(PROG)$(EXEEXT)
$(V)$(OCAMLC) -o $(PROG)$(EXEEXT) \
$(_OCAML_CFLAGS) $(OCAML_CFLAGS) \
......@@ -114,90 +110,22 @@ $(PROG)$(EXEEXT): $($(PROG)_sources:.ml=.$(o)) $(c_objs) $($(PROG)_PLUGINS:%=plu
$(c_link)
endif
# Compute C dependencies
# Apparently, dynamic modules cannot
# use the custom mode..
plug_c_link = \
$(if $($(1)_c_sources),\
$(if $(BYTE),\
$(eval $(1)_clink = dllliquidsoap_$(1).so),\
$(eval $(1)_clink = $$($(1)_c_sources:.c=.o))))
$(foreach plug,$($(PROG)_PLUGINS),$(call plug_c_link,$(plug)))
plug_c_objs = \
$(if $($(1)_c_sources),\
$(if $(BYTE),\
$(eval $(1)_c_objs = $$($(1)_c_sources:.c=.o) plugins/dllliquidsoap_$(1).so),\
$(eval $(1)_c_objs = $$($(1)_c_sources:.c=.o))))
$(foreach plug,$($(PROG)_PLUGINS),$(call plug_c_objs,$(plug)))
# Compute plugins dependencies
plug_deps = \
$(eval plugins/$(1).$$(s): $$($(1)_sources:.ml=.$$(o)) $$($(1)_c_objs))
$(foreach plug,$($(PROG)_PLUGINS),$(call plug_deps,$(plug)))
# Compute plugins dependencies that are not already
# linked with liquidsoap
plug_packages = \
$(if $(findstring $(2),$($(PROG)_ocamllflags) $($(PROG)_ocamlcflags)),$(eval $(1)_dontlink += $(2)),$(eval $(1)_ocamllflags += -package $(2)))
$(foreach plug,$($(PROG)_PLUGINS),\
$(foreach package,$($(plug)_packages),$(call plug_packages,$(plug),$(package))))
# In order to avoid loading multiple times
# the same module, we need to avoid the following
# link:
vorbis_dontlink += ogg
speex_dontlink += ogg
theora_dontlink += ogg
flac_dontlink += ogg
flac_ogg_dontlink += ogg flac
lastfm_dontlink += xmlm xmlplaylist
# Lo name is too generic for the above test to pass
lo_dontlink =
lo_ocamllflags += -package lo
# Here is how compilation of .ml files work:
# We concatenate all {C,L}FLAGS for .ml compilation.
# However, when linking the final objects, we seperate them back.
_OCAML_ALL_CFLAGS=$(_OCAML_CFLAGS)
_OCAML_ALL_LFLAGS=$(_OCAML_LFLAGS)
$(foreach plug,$($(PROG)_PLUGINS),$(eval _OCAML_ALL_CFLAGS+=$($(plug)_ocamlcflags)))
$(foreach plug,$($(PROG)_PLUGINS),$(eval _OCAML_ALL_CFLAGS+=$($(plug)_packages:%=-package %)))
$(foreach plug,$($(PROG)_PLUGINS),$(eval _OCAML_ALL_LFLAGS+=$($(plug)_ocamllflags)))
plugins/%.$(s):
$(warning Dynamic plugin compilation is deprecated and can be removed in any future version!)
$(V)echo $(OCAMLCOMP) ${shared_flag} $@
$(V)$(OCAMLC) ${shared_flag} -linkpkg $($*_ocamlcflags) $($*_ocamllflags) \
$($*_clink) $($*_sources:.ml=.$(o)) -dontlink "$($*_dontlink)" -o $@
plugins/dllliquidsoap_%.so:
$(V)echo OCAMLMKLIB -o plugins/dllliquidsoap_$*.so
$(V)$(OCAMLMKLIB) -o plugins/liquidsoap_$* $($*_c_sources:.c=.o)
tools/win32/process_utils.mli: tools/unix/process_utils.mli
$(V)echo CP $< $@
$(V)cp -f $< $@
%.ml: %.camlp4
$(V)echo CAMLP4O $<
$(V)$(CAMLP4O) -printer Camlp4OCamlPrinter -impl $< > $@
%.ml: %.mll
@echo $(@:.ml=.mli) $(@:.mli=.ml) >> auto_clean
@echo $(<:.mll=.mli) $(<:.mll=.ml) >> auto_clean
$(V)echo OCAMLLEX $<
$(V)$(OCAMLLEX) $<
%.ml %.mli: %.mly
@echo $(@:.ml=.mli) $(@:.mli=.ml) >> auto_clean
$(V)echo OCAMLYACC $<
$(V)$(OCAMLYACC) $<
@echo $(<:.mly=.mli) $(<:.mly=.ml) $(<:.mly=.conflicts) >> auto_clean
$(V)echo MENHIR $<
$(V)$(MENHIR) --unused-tokens --explain $<
%.$(o): %.ml
$(V)echo $(OCAMLCOMP) -c $<
$(V)$(OCAMLC) $(_OCAML_ALL_CFLAGS) $(OCAML_CFLAGS) -c $<
$(V)$(OCAMLC) $(_OCAML_CFLAGS) $(OCAML_CFLAGS) -c $<
%.$(i): %.mli
$(V)echo $(OCAMLCOMP) -c $<
$(V)$(OCAMLC) $(_OCAML_ALL_CFLAGS) $(OCAML_CFLAGS) -c $<
$(V)$(OCAMLC) $(_OCAML_CFLAGS) $(OCAML_CFLAGS) -c $<
%.o: %.c
$(V)echo CC -c $<
......
......@@ -6,14 +6,21 @@ used for netradios and webtvs. It has tons of features, it's free and it's
open-source!
Liquidsoap is a powerful and flexible language for describing your streams. It
offers a rich collection of operators that you can combine to create and transform
streams. Liquidsoap is very light and easy to use, in the Unix tradition of simple
strong components working together.
offers a rich collection of operators that you can combine to create and
transform streams. Liquidsoap is very light and easy to use, in the Unix
tradition of simple strong components working together.
Copyright 2003-2019 Savonet team
[![GPL license](https://img.shields.io/badge/License-GPL-green.svg)](https://github.com/savonet/liquidsoap/blob/master/COPYING)
[![GitHub release](https://img.shields.io/github/release/savonet/liquidsoap.svg)](https://GitHub.com/savonet/liquidsoap/releases/)
[![Install with Opam !](https://img.shields.io/badge/Install%20with-Opam-1abc9c.svg)](http://opam.ocaml.org/packages/liquidsoap/)
[![Chat on slack !](https://img.shields.io/badge/Chat%20on-Slack-1a1f9c.svg)](http://slack.liquidsoap.info/)
| | |
| ------------ | -------------------------------------------- |
| Slack Chat | http://slack.liquidsoap.info |
| IRC | #savonet on [irc.freenode.net](https://freenode.net/) (slack bridge) |
| Mailing list | savonet-users@lists.sourceforge.net |
| Homepage | http://liquidsoap.info |
| Bug reports | https://github.com/savonet/liquidsoap/issues |
......@@ -21,42 +28,43 @@ Copyright 2003-2019 Savonet team
Installation
------------
See the [INSTALL](INSTALL) file.
See the [install.md](doc/content/install.md) file.
Documentation
-------------
HTML documentation is in doc/html/index.html ([mirrored](https://www.liquidsoap.info/doc.html) on the [Savonet website](http://liquidsoap.info))
HTML documentation is in doc/html/index.html
([mirrored](https://www.liquidsoap.info/doc.html) on the [Savonet
website](http://liquidsoap.info))
License
-------
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details, fully stated in the COPYING
file at the root of the liquidsoap distribution.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details, fully
stated in the COPYING file at the root of the liquidsoap distribution.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
Authors
-------
* Developers:
* David Baelde <david.baelde@ens-lyon.org>
* Romain Beauxis <toots@rastageeks.org>
* Samuel Mimram <samuel.mimram@ens-lyon.org>
* [David Baelde](http://www.lsv.fr/~baelde/)
* [Romain Beauxis](https://github.com/toots)
* [Samuel Mimram](http://www.mimram.fr)
* Contributors:
* Florent Bouchez <florent.bouchez@ens-lyon.org>
* Julien Cristau <julien.cristau@ens-lyon.org>
* Stéphane Gimenez <stephane.gimenez@ens-lyon.org>
* Clément Renard <clement.renard@ens-lyon.org>
* Vincent Tabard <vincent@radiopytagor.com>
* Sattisvar Tandabany <sattisvar.tandabany@ens-lyon.org>
* Florent Bouchez
* Julien Cristau
* Stéphane Gimenez
* Clément Renard
* Vincent Tabard
* Sattisvar Tandabany
Liquidsoap
==========
Our flagship is Liquidsoap, a swiss-army knife for multimedia streaming, notably
used for netradios and webtvs. It has tons of features, it's free and it's
open-source!
Liquidsoap is a powerful and flexible language for describing your streams. It
offers a rich collection of operators that you can combine to create and
transform streams. Liquidsoap is very light and easy to use, in the Unix
tradition of simple strong components working together.
Copyright 2003-2019 Savonet team
[![GPL license](https://img.shields.io/badge/License-GPL-green.svg)](https://github.com/savonet/liquidsoap/blob/master/COPYING)
[![GitHub release](https://img.shields.io/github/release/savonet/liquidsoap.svg)](https://GitHub.com/savonet/liquidsoap/releases/)
[![Install with Opam !](https://img.shields.io/badge/Install%20with-Opam-1abc9c.svg)](http://opam.ocaml.org/packages/liquidsoap/)
[![Chat on slack !](https://img.shields.io/badge/Chat%20on-Slack-1a1f9c.svg)](http://slack.liquidsoap.info/)
| | |
| ------------ | -------------------------------------------- |
| Slack Chat | http://slack.liquidsoap.info |
| IRC | #savonet on [irc.freenode.net](https://freenode.net/) (slack bridge) |
| Mailing list | savonet-users@lists.sourceforge.net |
| Homepage | http://liquidsoap.info |
| Bug reports | https://github.com/savonet/liquidsoap/issues |
Installation
------------
See the [install.md](doc/content/install.md) file.
Documentation
-------------
HTML documentation is in doc/html/index.html
([mirrored](https://www.liquidsoap.info/doc.html) on the [Savonet
website](http://liquidsoap.info))
License
-------
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details, fully
stated in the COPYING file at the root of the liquidsoap distribution.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
Authors
-------
* Developers:
* [David Baelde](http://www.lsv.fr/~baelde/)
* [Romain Beauxis](https://github.com/toots)
* [Samuel Mimram](http://www.mimram.fr)
* Contributors:
* Florent Bouchez
* Julien Cristau
* Stéphane Gimenez
* Clément Renard
* Vincent Tabard
* Sattisvar Tandabany
1.4.0
# Minimum OCaml version:
4.08.0
This diff is collapsed.
dnl BEFORE RELEASING
dnl Make sure that you edit the version number on the next line
dnl as well as the "version" variable below AND the "libs_dir_version",
dnl which is used as the final component of the standard .liq libdir,
dnl $libdir/liquidsoap/$libs_dir_version
# Remove +scm and set scm_snapshot to false before releasing
# Do not use $version below before the next line, since we grep
# for the literal version there
AC_INIT([liquidsoap],[1.3.7])
scm_snapshot=false
version=1.3.7
min_ocaml_version=4.03.0
if test $scm_snapshot != "false"; then
version="$version+scm"
libs_dir_version="scm"
# Liquidsoap autoconf setup
AC_INIT([liquidsoap],
m4_esyscmd([head -n1 VERSION | tr -d '\r\n']),
[savonet-users@lists.sourceforge.net],
[liquidsoap],
[https://github.com/savonet/liquidsoap])
git_snapshot=false
version="$PACKAGE_VERSION"
min_ocaml_version=m4_esyscmd([tail -n1 VERSION | tr -d '\r\n'])
git_commit=`git rev-parse --short HEAD || true`
if test $git_snapshot != "false"; then
if test -n "$git_commit"; then
version="$version+git@$git_commit"
libs_dir_version="git/$git_commit"
else
version="$version+dev"
libs_dir_version="dev"
fi
else
libs_dir_version="$version"
fi
AC_SUBST(version)
AC_SUBST(min_ocaml_version)
AC_SUBST(libs_dir_version)
AC_PREREQ(2.61)
......@@ -50,7 +55,8 @@ CFLAGS="$CFLAGS -I\$(top_srcdir)"
cat > src/configure.ml << _BLAH_
let version = "$version"
let scm_snapshot = $scm_snapshot
let git_commit = "$git_commit"
let git_snapshot = $git_snapshot
let conf = Utils.conf
let var_script = ref "default"
let substs = ref
......@@ -127,6 +133,15 @@ if test -z `which pkg-config 2>/dev/null` ; then
AC_MSG_ERROR(Cannot find pkg-config)
fi
dnl The following does not correctly uses prefix
dnl PKG_CHECK_VAR(bashcompdir, [bash-completion], [completionsdir], , bashcompdir="${sysconfdir}/bash_completion.d")
bashcompdir=`pkg-config --define-variable=prefix='${prefix}' --variable=completionsdir bash-completion 2>/dev/null`
AS_IF([test -z "$bashcompdir"], [bashcompdir='${sysconfdir}/bash_completion.d'])
AC_SUBST(bashcompdir)
emacsdir='${prefix}'/share/emacs/site-lisp/liquidsoap-mode
AC_SUBST(emacsdir)
# Check endianess
AC_C_BIGENDIAN
if test "x$ac_cv_c_bigendian" = "xyes"; then
......@@ -150,10 +165,14 @@ AC_CHECK_OCAML_COMPILERS()
OCAMLC_SYSTEM=`$OCAMLFIND ocamlc -config | grep system | cut -d' ' -f 2`
if test "$OCAMLC_SYSTEM" = "mingw" -o "$OCAMLC_SYSTEM" = "mingw64"; then
OS_TYPE="Win32"
WIN32_HOST="yes"
else
OS_TYPE="Unix"
UNIX_HOST="yes"
fi
AC_SUBST(OS_TYPE)
AC_SUBST(WIN32_HOST)
AC_SUBST(UNIX_HOST)
# Add -fPIC to CFLAGS for compatibility with x86_64
if test "$OS_TYPE" \!= "Win32" ; then
......@@ -191,7 +210,7 @@ fi
requires="unix threads str"
if test "$enable_debugging" \!= "no" ; then
CFLAGS="$CFLAGS -g"
liquidsoap_ocamlcflags="-g -annot $liquidsoap_ocamlcflags"
liquidsoap_ocamlcflags="-g -annot -bin-annot $liquidsoap_ocamlcflags"
liquidsoap_ocamllflags="-g $liquidsoap_ocamllflags"
fi
# Disable nativecode if ocamlopt is not present
......@@ -254,7 +273,7 @@ AC_MSG_RESULT([$OCAML_MAJOR.$OCAML_MINOR.$OCAML_REVISION])
AC_OCAML_COMPARE_VERSION([$OCAML_MAJOR.$OCAML_MINOR.$OCAML_REVISION],[$min_ocaml_version])
if test -z "${VERSION_OK}"; then
AC_MSG_ERROR([version 4.03.0 or more of the OCaml compiler is required to build liquidsoap])
AC_MSG_ERROR([version $min_ocaml_version or greater of the OCaml compiler is required to build liquidsoap])
fi
AC_SUBST(BYTE)
......@@ -298,47 +317,50 @@ if test "x$enable_graphics" = "xyes" ; then
else
W_GRAPHICS=""
w_GRAPHICS="no"
b_GRAPHICS="false"
fi
#
# Bytes
#
AC_CHECK_OCAML_BINDING([bytes],[],[],[1],[],[1])
AC_CHECK_OCAML_BINDING([bytes],[],[],[1])
#
# PCRE
#
AC_CHECK_OCAML_BINDING([pcre],[],[],[1],[],[1])
AC_CHECK_OCAML_BINDING([pcre],[],[],[1])
#
# Dtools
# SEDLEX
#
AC_CHECK_OCAML_BINDING([dtools],[0.4.0],[],[1],[],[1])
AC_CHECK_OCAML_BINDING([sedlex],[2.0],[],[1],[sedlex sedlex.ppx],[1])
#
# Duppy
# MENHIR
#
AC_CHECK_OCAML_BINDING([duppy],[0.6.0],[],[1],[],[1])
AC_CHECK_OCAML_BINDING([menhirLib],[],[],[1],[],[1])
# Small hack..
if test -z "${with_duppy_syntax_dir}"; then
if test "${CAMLP4O}" != "no" ; then
with_duppy_syntax_dir=${with_duppy_dir}
fi
fi
AC_CHECK_OCAML_BINDING([duppy.syntax],[0.4.2],[],[],[],[1],[duppy])
if test -n "${w_DUPPY_SYNTAX}"; then
if test "${CAMLP4O}" != "no"; then
if test -z "${DUPPY_SYNTAX_path}"; then
DUPPY_SYNTAX_path=`${OCAMLFIND} query duppy`
fi
CAMLP4O="${CAMLP4O} ${DUPPY_SYNTAX_path}/pa_duppy.cmo"
fi
MENHIR=`which menhir 2>/dev/null`
if test -z "${MENHIR}" ; then
AC_MSG_ERROR(Cannot find menhir binary)
fi
AC_SUBST(MENHIR)
#
# Dtools
#
AC_CHECK_OCAML_BINDING([dtools],[0.4.0],[],[1])
#
# Duppy
#
AC_CHECK_OCAML_BINDING([duppy],[0.6.0],[],[1])
#
# Cry
......@@ -349,7 +371,7 @@ AC_CHECK_OCAML_BINDING([cry],[0.6.0])
# ocaml-mm
#
AC_CHECK_OCAML_BINDING([mm],[0.4.0],[],[1],[],[1])
AC_CHECK_OCAML_BINDING([mm],[0.5.0],[],[1])
#
# xmlplaylist
......@@ -379,7 +401,7 @@ AC_CHECK_OCAML_BINDING([vorbis],[0.7.0],[ogg])
# Opus
#
AC_CHECK_OCAML_BINDING([opus],[0.1.1],[ogg])
AC_CHECK_OCAML_BINDING([opus],[0.1.3],[ogg])
#
# Speex
......@@ -397,18 +419,18 @@ AC_CHECK_OCAML_BINDING([mad],[0.4.4])
# Flac
#
AC_CHECK_OCAML_BINDING([flac],[0.1.2])
AC_CHECK_OCAML_BINDING([flac],[0.1.5])
# Small hack..
if test -z "${with_flac_ogg_dir}"; then
with_flac_ogg_dir=${with_flac_dir}
fi
AC_CHECK_OCAML_BINDING([flac.ogg],[],[ogg flac],[],[],[],[flac])
AC_CHECK_OCAML_BINDING([flac.ogg],[],[ogg flac],[],[],[flac])
#
# Dynlink
#
AC_CHECK_OCAML_BINDING([dynlink],[],[],[],[],[1])
AC_CHECK_OCAML_BINDING([dynlink])
# Dynlink may be for bytecode only..
AC_MSG_CHECKING([whether ocaml compiler supports dynlink])
if test -n "${W_DYNLINK}"; then
......@@ -434,17 +456,13 @@ if test -z "${W_DYNLINK}"; then
AC_MSG_WARN([no dynlink module: liquidsoap will not be able to load dynamic plugins!])
cat >> src/configure.ml <<EOCONF
let dynlink = false
let load_plugins_dir = fun _ -> assert false
let init_dyntools = fun _ -> ()
EOCONF
else
cat >> src/configure.ml <<EOCONF
let dynlink = true
let load_plugins_dir = Dyntools.load_plugins_dir
let init_dyntools dir =
let () =
at_init (fun () ->
Dyntools.load_dynlinks ();
Dyntools.load_plugins_dir dir)
Dyntools.load_dynlinks ())
EOCONF
fi
......@@ -485,7 +503,7 @@ AC_CHECK_OCAML_BINDING([frei0r],[0.1.0])
# Fdkaac
#
AC_CHECK_OCAML_BINDING([fdkaac],[0.2.1])
AC_CHECK_OCAML_BINDING([fdkaac],[0.3.1])
if test -z "${W_FDKAAC}"; then
if test -n "${W_DYNLINK}"; then
if test -n "${OCAML_HAS_FIRST_CLASS_MODULES}"; then
......@@ -512,7 +530,7 @@ AC_CHECK_OCAML_BINDING([gavl],[0.1.4])
# FFMPEG
#
AC_CHECK_OCAML_BINDING([ffmpeg],[0.2.0])
AC_CHECK_OCAML_BINDING([ffmpeg],[0.4.1])
#
# Jack
......@@ -550,21 +568,12 @@ AC_CHECK_OCAML_BINDING([taglib],[0.3.0])
AC_ARG_ENABLE([oss],AS_HELP_STRING([--disable-oss],[don't use OSS]))
AC_ARG_ENABLE([oss-dynamic-plugin],
AS_HELP_STRING([--enable-oss-dynamic-plugin],[Compile oss as an optional plugin.]))
if test "x$enable_oss" != "xno" ; then
AC_CHECK_HEADERS([sys/soundcard.h],[W_OSS="yes"])
fi
if test "a$W_OSS" = "ayes" ; then
if test "x$enable_oss_dynamic_plugin" = "xyes"; then
W_OSS=oss
w_OSS=plugin
PLUGINS="$PLUGINS oss"
else
w_OSS=yes
fi
else
w_OSS=no
fi
......@@ -588,7 +597,7 @@ fi
# SecureTransport (OSX)
#
AC_CHECK_OCAML_BINDING([osx-secure-transport],[],[])
AC_CHECK_OCAML_BINDING([osx-secure-transport])
#
# Magic
......@@ -632,6 +641,11 @@ AC_ARG_ENABLE([camomile],
AC_CHECK_OCAML_BINDING([camomile],[1.0.0])
AC_ARG_WITH([camomile-data-dir],
AC_HELP_STRING(
[--with-camomile-data-dir=path],
[path to camomile data files (autodetected by default)]))
if test -z "$W_CAMOMILE" ; then
if test "x$enable_camomile" = "xno" ; then
echo let recode_tag ?in_enc:_ ?out_enc:_ s = s >> src/configure.ml
......@@ -639,7 +653,18 @@ if test -z "$W_CAMOMILE" ; then
AC_MSG_ERROR([Camomile provides charset detection and conversions. It is strongly advised to enable those features. If you really don't want this, use --disable-camomile.])
fi
else
if test -n "$w_CUSTOM_PATH"; then
if test -n "${with_camomile_data_dir}" ; then
camencoding="CamomileLibrary.CharEncoding.Configure(CamomileConfig)"
cat >> src/configure.ml <<EOCONF
module CamomileConfig =
struct
let datadir = Filename.concat "${with_camomile_data_dir}" "database"
let localedir = Filename.concat "${with_camomile_data_dir}" "locales"
let charmapdir = Filename.concat "${with_camomile_data_dir}" "charmaps"
let unimapdir = Filename.concat "${with_camomile_data_dir}" "mappings"
end
EOCONF
elif test -n "$w_CUSTOM_PATH" ; then
camencoding="CamomileLibrary.CharEncoding.Configure(CamomileConfig)"
cat >> src/configure.ml <<EOCONF
module CamomileConfig =
......@@ -682,7 +707,7 @@ let get_encoding () =
custom_encoding := Some e ;
e
let camolog = Dtools.Log.make [["camomile"]]
let camolog = Log.make [["camomile"]]
exception Input_encoding of string
exception Output_encoding of string
......@@ -712,21 +737,21 @@ let recode_tag ?in_enc ?out_enc s =
else
C.name_of in_enc
in
camolog#f 3 "Failed to convert %S from %s to %s (%s)!"
camolog#important "Failed to convert %S from %s to %s (%s)!"
s in_enc (C.name_of out_enc) (Printexc.to_string e) ;
s
with
| Unknown_encoding e ->
camolog#f 3 "Failed to convert %S: unknown encoding %s"
camolog#important "Failed to convert %S: unknown encoding %s"
s e ; s
| Input_encoding e ->
camolog#f 3 "Failed to convert %S: unknown input encoding %s"
camolog#important "Failed to convert %S: unknown input encoding %s"
s e ; s
| Output_encoding e ->
camolog#f 3 "Failed to convert %S: unknown output encoding %s"
camolog#important "Failed to convert %S: unknown output encoding %s"
s e ; s
| e ->
camolog#f 3 "Failed to convert %S: unknown error %s"
camolog#important "Failed to convert %S: unknown error %s"
s (Printexc.to_string e) ; s
let env_has key = try ignore (Sys.getenv key) ; true with Not_found -> false
......@@ -749,7 +774,7 @@ EOCONF
# Yojson
AC_CHECK_OCAML_BINDING([yojson],[],[],[],[],[1])
AC_CHECK_OCAML_BINDING([yojson])
if test -z "${W_YOJSON}"; then
cat >> src/configure.ml <<__BLAH__
......@@ -757,7 +782,7 @@ module JSON = JSON
__BLAH__
else
cat >> src/configure.ml <<__BLAH__
module JSON = struct include Yojson.Basic let from_string s = from_string s end
module JSON = struct include Yojson.Basic let from_string s = from_string s let to_string j = pretty_to_string j end
__BLAH__
fi
......@@ -771,7 +796,23 @@ AC_CHECK_OCAML_BINDING([ladspa],[0.1.4])
AC_CHECK_OCAML_BINDING([dssi],[0.1.0])
AC_CHECK_OCAML_BINDING([sdl],[],[],[],[sdl.sdlmixer sdl.sdlttf sdl.sdlimage])
AC_CHECK_OCAML_BINDING([camlimages],[4.0.0],[],[],[camlimages.all_formats])
AC_CHECK_OCAML_BINDING([lo],[0.1.0])
# TODO: switch to dune all the way?
with_srt_types_dir=${with_srt_dir}
liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_srt_dir}/types"
AC_CHECK_OCAML_BINDING([srt.types],[0.1.0],[],[],[],[srt_types])
with_srt_stubs_dir=${with_srt_dir}
liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_srt_dir}/stubs"
AC_CHECK_OCAML_BINDING([srt.stubs],[0.1.0],[srt.types],[],[],[srt_stubs])
with_srt_stubs_locked_dir=${with_srt_dir}
liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_srt_dir}/stubs/locked"
AC_CHECK_OCAML_BINDING([srt.stubs],[0.1.0],[],[],[],[srt_stubs_locked])
AC_CHECK_OCAML_BINDING([srt],[0.1.0],[srt.types srt.stubs srt.stubs.locked])
AC_CHECK_OCAML_BINDING([lo],[0.1.2])
AC_CHECK_OCAML_BINDING([gd])
# Winsvc (to run as a service)
......@@ -878,16 +919,15 @@ AC_SUBST(cmo)
AC_SUBST(cmi)
AC_SUBST(cmxs)
AC_SUBST(shared_flag)
AC_SUBST(PLUGINS)
AC_SUBST(PLUGINS_DATA)
echo
AC_CONFIG_FILES([doc/content/install.md])
AC_CONFIG_FILES([doc/content/build.md])
AC_CONFIG_FILES([doc/liquidsoap.1.md])
AC_CONFIG_FILES([Makefile.defs],[chmod a-w Makefile.defs])
AC_CONFIG_FILES([scripts/liquidsoap.initd],[chmod a-w scripts/liquidsoap.initd])
AC_CONFIG_FILES([scripts/liquidsoap.gentoo.initd],
[chmod a-w scripts/liquidsoap.gentoo.initd])
AC_CONFIG_FILES([src/META],[chmod a-w src/META])
AC_CONFIG_FILES([liquidsoap.opam])
AC_OUTPUT
$MAKE finish-configure
......@@ -929,63 +969,67 @@ cat <<EOMSG
logrotate conf : $sysconfdir/logrotate.d
man page : $mandir/man1
doc : $datadir/doc
bash completion: $bashcompdir
emacs mode : $emacsdir
-------------------------------------------------------------------- Features
* Supported input formats
- Vorbis : $w_VORBIS
- Theora : $w_THEORA
- Speex : $w_SPEEX
- AAC : $w_FAAD
- Ffmpeg : $w_FFMPEG
- Flac (native) : $w_FLAC
- Flac (ogg) : $w_FLAC_OGG
- MP3 : $w_MAD
- AAC : $w_FAAD
- Avcodec (ffmpeg) : $w_FFMPEG
- XML playlists : $w_XMLPLAYLIST
- Lastfm : $w_LASTFM
- Opus : $w_OPUS
- Speex : $w_SPEEX
- Theora : $w_THEORA
- Vorbis : $w_VORBIS
- XML playlists : $w_XMLPLAYLIST
* Supported output formats
- Vorbis : $w_VORBIS
- FDK-AAC : $w_FDKAAC
- Ffmpeg : $w_FFMPEG
- MP3 : $w_LAME
- MP3 (fixed-point) : $w_SHINE
- FDK-AAC : $w_FDKAAC
- SPEEX : $w_SPEEX
- Opus : $w_OPUS
- SPEEX : $w_SPEEX
- Theora : $w_THEORA
- Vorbis : $w_VORBIS
* Tags
- charset detection : $w_CAMOMILE
- Taglib (ID3 tags) : $w_TAGLIB
- Vorbis : $w_VORBIS
- charset detection : $w_CAMOMILE
* Input / output
- Icecast/Shoutcast : $w_CRY
- ALSA : $w_ALSA
- AO : $w_AO
- Icecast/Shoutcast : $w_CRY
- GStreamer : $w_GSTREAMER
- JACK : $w_BJACK
- OSS : $w_OSS
- ALSA : $w_ALSA
- Portaudio : $w_PORTAUDIO
- Pulseaudio : $w_PULSEAUDIO
- JACK : $w_BJACK
- GStreamer : $w_GSTREAMER
- SRT : $w_SRT
* Audio manipulation
- LADSPA : $w_LADSPA
- Samplerate : $w_SAMPLERATE
- SoundTouch : $w_SOUNDTOUCH
- LADSPA : $w_LADSPA
* Video manipulation
- Gavl : $w_GAVL
- camlimages : $w_CAMLIMAGES
- FFmpeg : $w_FFMPEG
- frei0r : $w_FREI0R
- camlimages : $w_CAMLIMAGES
- Gavl : $w_GAVL
* MIDI manipulation
- DSSI : $w_DSSI
* Visualization
- GD : $w_GD
- Graphics : $w_GRAPHICS
- SDL : $w_SDL
- GD : $w_GD
* Additional libraries
- curl URI resolver : requires curl at runtime
......@@ -993,10 +1037,10 @@ cat <<EOMSG
- inotify : $w_INOTIFY
- lo : $w_LO
- magic : $w_MAGIC
- yojson : $w_YOJSON
- ssl : $w_SSL
- SecureTransport : $w_OSX_SECURE_TRANSPORT
- ssl : $w_SSL
- windows service : $w_WINSVC
- yojson : $w_YOJSON
* Graphical interfaces
- Python GUI : $w_PYTHON
......@@ -1044,3 +1088,52 @@ if ! test -f $DEFAULT_FONT ; then
</WARNING>
EOMSG
fi
cat >| liquidsoap.config <<EOCFG
opam-version: "2.0"
variables {
vorbis-enabled: $b_VORBIS
theora-enabled: $b_THEORA
speex-enabled: $b_SPEEX
flac-enabled: $b_FLAC
ogg_flac-enabled: $b_FLAC_OGG
mad-enabled: $b_MAD
faad-enabled: $b_FAAD
ffmpeg-enabled: $b_FFMPEG
xmlplaylist-enabled: $b_XMLPLAYLIST
lastfm-enabled: $b_LASTFM
lame-enabled: $b_LAME
shine-enabled: $b_SHINE
fdkaac-enabled: $b_FDKAAC
opus-enabled: $b_OPUS
taglib-enabled: $b_TAGLIB
camomile-enabled: $b_CAMOMILE
cry-enabled: $b_CRY
ao-enabled: $b_AO
ogg-enabled: $b_OGG
alsa-enabled: $b_ALSA
portaudio-enabled: $b_PORTAUDIO
pulseaudio-enabled: $b_PULSEAUDIO
bjack-enabled: $b_BJACK
gstreamer-enabled: $b_GSTREAMER
samplerate-enabled: $b_SAMPLERATE
soundtouch-enabled: $b_SOUNDTOUCH
ladspa-enabled: $b_LADSPA
gavl-enabled: $b_GAVL
ffmpeg-enabled: $b_FFMPEG
frei0r-enabled: $b_FREI0R
camlimages-enabled: $b_CAMLIMAGES
dssi-enabled: $b_DSSI
graphics-enabled: $b_GRAPHICS
sdl-enabled: $b_SDL
gd-enabled: $b_GD
inotify-enabled: $b_INOTIFY
lo-enabled: $b_LO
magic-enabled: $b_MAGIC
yojson-enabled: $b_YOJSON
ssl-enabled: $b_SSL
secure_transport-enabled: $b_OSX_SECURE_TRANSPORT
srt-enabled: $b_SRT
winscv-enabled: $b_WINSVC
}
EOCFG
......@@ -15,26 +15,26 @@ Build-Depends: debhelper (>= 11),
libcamlimages-ocaml-dev (>= 4.0.1-6),
libcamomile-ocaml-dev (>= 1.0.0),
libcry-ocaml-dev (>= 0.6.0),
libdtools-ocaml-dev (>= 0.3.4),
libduppy-ocaml-dev (>= 0.6.0),
libfaad-ocaml-dev (>= 0.3.3),
libffmpeg-ocaml-dev,
libflac-ocaml-dev (>= 0.1.2),
libdtools-ocaml-dev (>= 0.4.1),
libduppy-ocaml-dev (>= 0.8.0),
libfaad-ocaml-dev (>= 0.4.0),
libffmpeg-ocaml-dev (>= 0.2.),
libflac-ocaml-dev (>= 0.1.5),
libfrei0r-ocaml-dev (>= 0.1.0),
libgavl-ocaml-dev (>= 0.1.4),
libgd-ocaml-dev | libgd-gd2-noxpm-ocaml-dev,
libssl-ocaml-dev (>= 0.5.2),
libgstreamer-ocaml-dev (>= 0.2.0),
libgstreamer-ocaml-dev (>= 0.3.0),
libinotify-ocaml-dev (>= 1.0) [linux-any],
libladspa-ocaml-dev (>= 0.1.4),
liblastfm-ocaml-dev (>= 0.3.0),
liblo-ocaml-dev (>= 0.1.0),
libmad-ocaml-dev (>= 0.4.4),
libmagic-ocaml-dev,
libmm-ocaml-dev (>= 0.3.0),
liblo-ocaml-dev (>= 0.1.2),
libmad-ocaml-dev (>= 0.1.4),
libmagic-ocaml-dev (>= 0.6),
libmm-ocaml-dev (>= 0.5.0),
libmp3lame-ocaml-dev (>= 0.3.2),
libogg-ocaml-dev (>= 0.5.0),
libopus-ocaml-dev (>= 0.1.1),
libopus-ocaml-dev (>= 0.1.3),
libpcre-ocaml-dev,
libportaudio-ocaml-dev (>= 0.2.0),
libpulse-ocaml-dev (>= 0.1.2),
......@@ -51,7 +51,7 @@ Build-Depends: debhelper (>= 11),
libxmlplaylist-ocaml-dev (>= 0.1.3),
libyojson-ocaml-dev,
ocaml-findlib,
ocaml-nox,
ocaml-nox (>= 4.08),
sox
Standards-Version: 4.4.0
Vcs-Git: https://salsa.debian.org/ocaml-team/liquidsoap.git
......
From: Kyle Robbertze <paddatrapper@debian.org>
Date: Tue, 5 Nov 2019 16:29:05 +0200
Subject: Remove embedded videos from docs
---
doc/content/on2.md | 4 +---
doc/content/publications.md | 4 +---
doc/content/video.md | 15 +++++++--------
3 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/doc/content/on2.md b/doc/content/on2.md
index 8191019..06cb3ac 100644
--- a/doc/content/on2.md
+++ b/doc/content/on2.md
@@ -1,8 +1,6 @@
Savonet was at the [ON2: Test Signals](http://testsignals.org/) conference in
Berlin, on October 22-23 2010. We presented Liquidsoap, but also held the first
-Liquidsoap workshop.
-
-<center><iframe src="//player.vimeo.com/video/16528307" width="400" height="300" frameborder="0"></iframe></center>
+Liquidsoap workshop. The video is [here](https://player.vimeo.com/video/16528307)
Liquidsoap Workshop
===================
diff --git a/doc/content/publications.md b/doc/content/publications.md
index 7f74db5..c55cca6 100644
--- a/doc/content/publications.md
+++ b/doc/content/publications.md
@@ -12,9 +12,7 @@ Presentations
Savonet was at the [ON2: Test Signals](http://testsignals.org/) conference in
Berlin, on October 22-23 2010. We presented Liquidsoap, but also held the first
-Liquidsoap workshop.
-
-<center><iframe src="//player.vimeo.com/video/16528307" width="400" height="300" frameborder="0"></iframe></center>L
+Liquidsoap workshop. The video is available [here](https://player.vimeo.com/video/16528307)
Publications
------------
diff --git a/doc/content/video.md b/doc/content/video.md
index 447603b..db3e160 100644
--- a/doc/content/video.md
+++ b/doc/content/video.md
@@ -113,9 +113,8 @@ source = add([img,cam])
Let's design an ``anonymizer'' effect: I want to blur my face and change my voice
so that nobody will recognise me in the street after seeing the youtube
-video. Here is what we are going to achieve:
-
-<center><iframe width="560" height="315" src="//www.youtube.com/embed/E7Fb0wV3h5Q" frameborder="0" allowfullscreen></iframe></center>This video was produced thanks to the following script:
+video. [Here](https://www.youtube.com/embed/E7Fb0wV3h5Q) is what we are going to
+achieve. This video was produced thanks to the following script:
```liquidsoap
# Input from webcam
@@ -155,9 +154,10 @@ output.file(%ogg(%theora(quality=63),%vorbis), "anonymous.ogv", s)
In this example we are going to use OSC integration in order to modify the
parameters in realtime. There are many OSC clients around, for instance I used
-[TouchOSC](http://hexler.net/software/touchosc) :
+[TouchOSC](http://hexler.net/software/touchosc). The video is available
+[here](https://www.youtube.com/embed/EX1PTjiuuXY)
-<center><iframe width="560" height="315" src="//www.youtube.com/embed/EX1PTjiuuXY" frameborder="0" allowfullscreen></iframe></center>Here is how the video was made:
+Here is how the video was made:
```liquidsoap
# Set the OSC port to match TouchOSC's default port
@@ -188,9 +188,8 @@ output.sdl(fallible=true,drop_audio(s))
### Blue screen
-You want to show yourself in front of a video of a bunny, as in
-
-<center><iframe width="640" height="360" src="//www.youtube.com/embed/zHikXRNMQu4?feature=player_detailpage" frameborder="0" allowfullscreen></iframe></center>The idea is to film yourself in front of a blue screen, make this blue screen
+You want to show yourself in front of a video of a bunny, as in [this video](https://www.youtube.com/embed/zHikXRNMQu4?feature=player_detailpage).
+The idea is to film yourself in front of a blue screen, make this blue screen
transparent and put the resulting video in front of the bunny video (actually, I
don't have a blue screen at home, only a white wall but it still kinda works).
From: Kyle Robbertze <krobbertze@gmail.com>
Date: Tue, 8 May 2018 15:24:32 +0200
Subject: remove embedded videos from docs
the docs include embedded YouTube and vimeo videos, so change these
to links instead
---
doc/content/on2.txt | 4 +---
doc/content/publications.txt | 4 +---
doc/content/video.txt | 12 ++++--------
3 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/doc/content/on2.txt b/doc/content/on2.txt
index 0b17670..921b181 100644
--- a/doc/content/on2.txt
+++ b/doc/content/on2.txt
@@ -2,9 +2,7 @@ title: ON2: Test Signals
Savonet was at the "ON2: Test Signals":http://testsignals.org/ conference in
Berlin, on October 22-23 2010. We presented Liquidsoap, but also held the first
-Liquidsoap workshop.
-
-`antiquotation`<center><iframe src="http://player.vimeo.com/video/16528307" width="400" height="300" frameborder="0"></iframe></center>`antiquotation`
+Liquidsoap workshop. A recording can be found "here":https://vimeo.com/16528307
h3. Liquidsoap Workshop
diff --git a/doc/content/publications.txt b/doc/content/publications.txt
index a65c702..6e3ec53 100644
--- a/doc/content/publications.txt
+++ b/doc/content/publications.txt
@@ -8,9 +8,7 @@ h4. ON2 presentation
Savonet was at the "ON2: Test Signals":http://testsignals.org/ conference in
Berlin, on October 22-23 2010. We presented Liquidsoap, but also held the first
-Liquidsoap workshop.
-
-`antiquotation`<center><iframe src="http://player.vimeo.com/video/16528307" width="400" height="300" frameborder="0"></iframe></center>`antiquotation`
+Liquidsoap workshop. A recording can be found "here":https://vimeo.com/16528307
h3. Publications
diff --git a/doc/content/video.txt b/doc/content/video.txt
index d9a053d..e593204 100644
--- a/doc/content/video.txt
+++ b/doc/content/video.txt
@@ -118,9 +118,7 @@ h4@anonymizer. The anonymizer
Let's design an "anonymizer" effect: I want to blur my face and change my voice
so that nobody will recognise me in the street after seeing the youtube
-video. Here is what we are going to achieve:
-
-`antiquotation`<center><iframe width="560" height="315" src="http://www.youtube.com/embed/E7Fb0wV3h5Q" frameborder="0" allowfullscreen></iframe></center>`antiquotation`
+video. "This":http://www.youtube.com/watch?v=E7Fb0wV3h5Q is the result.
This video was produced thanks to the following script:
@@ -162,9 +160,8 @@ h4@osc. Controlling with OSC
In this example we are going to use OSC integration in order to modify the
parameters in realtime. There are many OSC clients around, for instance I used
-"TouchOSC":http://hexler.net/software/touchosc :
-
-`antiquotation`<center><iframe width="560" height="315" src="http://www.youtube.com/embed/EX1PTjiuuXY" frameborder="0" allowfullscreen></iframe></center>`antiquotation`
+"TouchOSC":http://hexler.net/software/touchosc to make
+"this video":http://www.youtube.com/watch?v=EX1PTjiuuXY
Here is how the video was made:
@@ -198,8 +195,7 @@ output.sdl(fallible=true,drop_audio(s))
h4@bluescreen. Blue screen
You want to show yourself in front of a video of a bunny, as in
-
-`antiquotation`<center><iframe width="640" height="360" src="http://www.youtube.com/embed/zHikXRNMQu4?feature=player_detailpage" frameborder="0" allowfullscreen></iframe></center>`antiquotation`
+"this video":http://www.youtube.com/watch?v=zHikXRNMQu4
The idea is to film yourself in front of a blue screen, make this blue screen
transparent and put the resulting video in front of the bunny video (actually, I
From: Kyle Robbertze <paddatrapper@debian.org>
Date: Tue, 23 Jul 2019 17:43:39 -0300
Subject: Fix ogg_flac_duration build failure
decoder/ogg_flac_duration.ml fails to compile due to a syntax typo. This
fixes it by removing the extra argument passed to the function.
---
src/decoder/ogg_flac_duration.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/decoder/ogg_flac_duration.ml b/src/decoder/ogg_flac_duration.ml
index ceb8307..a70af03 100644
--- a/src/decoder/ogg_flac_duration.ml
+++ b/src/decoder/ogg_flac_duration.ml
@@ -45,7 +45,7 @@ let duration file =
Ogg.Stream.put_page os page
in
let callbacks = Ogg_flac.Decoder.get_callbacks (fun _ -> ()) in
- let dec = Ogg_flac.Decoder.create packet os callbacks in
+ let dec = Ogg_flac.Decoder.create packet os in
let rec info () =
try
Flac.Decoder.init dec callbacks
0001-remove-embedded-videos-from-docs.patch
0002-fix-ogg_flac_duration-build-failure.patch
0001-Remove-embedded-videos-from-docs.patch
version=4
opts=filenamemangle=s/.+\/(\d\S+)\///,\
opts=filenamemangle=s/.+\/([\d.]+)\///,\
compression=bz2 \
https://github.com/savonet/liquidsoap/releases .download*/v?\d\S+/liquidsoap.(\d\S+).tar.bz2
https://github.com/savonet/liquidsoap/releases .download*/v?[\d.]+/liquidsoap.([\d.]+).tar.bz2
.PHONY: doc upload all-subdirs
.PHONY: md doc upload all-subdirs
SUBDIRS = content liqi
DISTFILES = liquidsoap.1 Makefile protocols_to_liqi.pl reference_to_liqi.pl no-ref.txt \
template.html snippet.html
SUBDIRS = content
DISTFILES = liquidsoap.1.md.in Makefile template.html snippet.html
DISTDIRS = orig
PERL_DOM = $(shell perl -MXML::DOM -e1 > /dev/null 2>&1 && echo yes)
LIQUIDSOAP = ../src/liquidsoap
PANDOC = pandoc --syntax-definition=liquidsoap.xml --highlight=pygments
CONTENT=$(wildcard content/*.txt)
PRE_HTML=$(shell echo $(CONTENT:.txt=.html) | sed -e 's/content\//html\//g') \
html/reference.html html/settings.html html/protocols.html
HTML=html/scripts/index.html
TEX=$(shell echo $(CONTENT:.txt=.tex) | sed -e 's/content\//tex\//g')
PDF=$(TEX:.tex=.pdf)
MD=$(wildcard content/*.md) content/protocols.md content/reference.md content/settings.md
HTML=$(addprefix html/,$(notdir $(MD:.md=.html)))
PDF=$(addprefix pdf/,$(notdir $(MD:.md=.pdf)))
LIQI = cd html && ../liqi/liqi \
--template ../template.html --snippet-template ../snippet.html \
--subst rel:
LIQI_DEPS = liqi/liqi template.html snippet.html
doc: md man html
# PDF is not ready for end-users yet.
doc: html
md: $(MD)
html: $(HTML)
pdf: liqref.pdf
pdf: $(PDF)
liqref.pdf: tex/liqref.tex $(TEX)
@echo Compiling liqref.pdf...
@cd tex; pdflatex -interaction nonstopmode liqref.tex
man: liquidsoap.1
html/scripts/index.html: html/scripts/index.txt $(LIQI_DEPS)
@echo Generating $(@)...
@#Has to be called from html to put scripts in the right place
$(LIQI) --subst rel:../ -i ../$(<) -o ../$(@)
liquidsoap.1: liquidsoap.1.md
@echo "Generating $(@)..."
@pandoc -s -t man $< -o $@
# I have to tell make that index.txt will be there
# once the HTML have been generated.
# Also ensures that the index is built last even with a concurrent make run.
html/scripts/index.txt: $(PRE_HTML)
html/%.html: content/%.txt $(LIQI_DEPS)
html/%.html: content/%.md template.html language.dtd
@echo Converting $(<) to $(@)...
@test -d html || (mkdir -p html/scripts ; cp -RfL orig/* html)
@#Has to be called from html to put scripts in the right place
@$(LIQI) -i ../$(<) -o ../$(@)
@$(PANDOC) $< --metadata pagetitle="`basename '$<'`" --template=template.html -o $@
tex/%.tex: content/%.txt liqi/liqi
pdf/%.pdf: content/%.md language.dtd
@mkdir -p pdf
@echo Converting $(<) to $(@)...
@test -d tex || mkdir tex
@./liqi/liqi --latex -i $(<) -o $(@)
@$(PANDOC) $< -o $@
tex/%.pdf: tex/%.tex
@echo Converting $(<) to $(@)...
@cd tex; pdflatex ../$(<)
content/protocols.md: $(LIQUIDSOAP)
$(LIQUIDSOAP) --no-pervasives ../libs/pervasives.liq --list-protocols-md > $@
liqi/liqi: all-subdirs
@# If I don't put anything here, make tries to build liqi/liqi
@# from liqi/liqi.o by using gcc
content/reference.md: $(LIQUIDSOAP)
$(LIQUIDSOAP) --no-pervasives ../libs/pervasives.liq --list-functions-md > $@
../src/liquidsoap:
@echo "Liquidsoap does not seem to be built. You have to build it before."
@echo "Go to the toplevel and type 'make'"
exit 1
content/reference.txt: reference_to_liqi.pl ../src/liquidsoap ../scripts/utils.liq
ifeq ($(PERL_DOM),yes)
CAML_LD_LIBRARY_PATH=../src:../src/plugins ../src/liquidsoap --dynamic-plugins-dir ../src/plugins \
--no-pervasives ../scripts/pervasives.liq --list-plugins-xml | \
./reference_to_liqi.pl > $(@)
else
@echo "-> You don't seem to have perl XML::DOM module installed."
@echo "-> Language reference cannot be generated."
@cp no-ref.txt content/reference.txt
endif
content/protocols.txt: protocols_to_liqi.pl ../src/liquidsoap ../scripts/utils.liq
ifeq ($(PERL_DOM),yes)
CAML_LD_LIBRARY_PATH=../src:../src/plugins ../src/liquidsoap --dynamic-plugins-dir ../src/plugins \
--no-pervasives ../scripts/pervasives.liq --list-plugins-xml | \
./protocols_to_liqi.pl > $(@)
else
@echo "-> You don't seem to have perl XML::DOM module installed."
@echo "-> protocols reference cannot be generated."
@cp no-protocols.txt content/protocols.txt
endif
content/settings.txt: ../src/liquidsoap
CAML_LD_LIBRARY_PATH=../src:../src/plugins ../src/liquidsoap --no-pervasives ../scripts/pervasives.liq \
--dynamic-plugins-dir ../src/plugins --conf-descr-liqi > $(@)
VERSION="`../src/liquidsoap --version | head -n 1`"
test: html
@echo "Testing code snippets with \033[1m$(VERSION)\033[0m"
@echo ""
@find html/scripts | grep '\.liq' | sort \
| ./scripts/test_snippets "`pwd`/../src/liquidsoap -p"
@echo ""
@echo "Testing shell scripts.."
@echo "Please remember that it does not test liq syntax used inline.."
@echo ""
@find html/scripts | grep '\.sh' | sort | ./scripts/test_snippets "sh -n"
@echo ""
@echo "Testing perl scripts.."
@echo ""
@find html/scripts | grep '\.pl' | sort | ./scripts/test_snippets "perl -c"
spell-check: $(CONTENT:.txt=.txt.spell)
content/%.txt.spell: content/%.txt
-aspell -d en_US-w_accents -c $(<)
touch $(@)
content/settings.md: $(LIQUIDSOAP)
$(LIQUIDSOAP) --no-pervasives ../libs/pervasives.liq --conf-descr-md > $@
VERSION="`$(LIQUIDSOAP) --version | head -n 1`"
doc-install:
$(INSTALL) -d $(datadir)/doc/$(DISTDIR)/html
$(INSTALL) -d $(datadir)/doc/liquidsoap/html
if [ -f html/index.html ] ; then \
cp -RfL html/* $(datadir)/doc/$(DISTDIR)/html ; \
cp -RfL html/* $(datadir)/doc/liquidsoap/html ; \
fi
if [ -f liquidsoap.1 ] ; then \
$(INSTALL) -d $(mandir)/man1 ; \
$(INSTALL_DATA) liquidsoap.1 $(mandir)/man1 ; \
fi
$(INSTALL) -d $(mandir)/man1
$(INSTALL_DATA) liquidsoap.1 $(mandir)/man1
clean-local:
rm -rf html $(TEX) content/reference.txt content/protocols.txt content/settings.txt content/*.txt.spell
RCP=rsync -rLtCP --include="*.exe" --exclude="*.swp" --exclude="*.svn" \
--delete --stats
RHOST=shell.sf.net:/home/groups/s/sa/savonet/htdocs/new/liq-svn
upload: update
cd html ; $(RCP) . $(RHOST)
ssh $(USER)@shell.sf.net "chgrp -R savonet \
/home/groups/s/sa/savonet/htdocs \
> /dev/null 2>&1"
ssh $(USER)@shell.sf.net "find /home/groups/s/sa/savonet/htdocs \
-type d -exec chmod 2775 '{}' ';' \
> /dev/null 2>&1"
ssh $(USER)@shell.sf.net "find /home/groups/s/sa/savonet/htdocs \
-type f -exec chmod 664 '{}' ';' \
> /dev/null 2>&1"
rm -rf html pdf content/reference.md content/protocols.md content/settings.md
$(LIQUIDSOAP):
@echo "Liquidsoap does not seem to be built. You have to build it before."
@echo "Go to the toplevel and type 'make'"
@exit 1
language.dtd:
curl https://raw.githubusercontent.com/jgm/highlighting-kate/master/xml/language.dtd -o $@
top_srcdir=..
include $(top_srcdir)/Makefile.rules
############ SPHINX DOC #########################
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build
sphinx-html:
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
# %: Makefile md
# @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
DISTFILES = $(wildcard *.txt) Makefile
DISTFILES = $(wildcard *.md) $(wildcard *.md.in) Makefile
top_srcdir = ../..
include $(top_srcdir)/Makefile.rules
......
title: Advanced techniques
h3. Advanced techniques
Advanced techniques
===================
We shall now see two things that are essential
to using liquidsoap fully: the server which allows you
to control a running instance of liquidsoap,
and the usage of the @init.d/liquidsoap@ service script
and the usage of the `init.d/liquidsoap` service script
for running your radios in production in a clean and convenient way.
h4. Protocols
Protocols in liquidsoap are used to resolve requests URIs. The syntax is: @protocol:arguments@,
for instance: @http://www.example.com@, @say:Something to say@ etc.
Protocols
---------
Protocols in liquidsoap are used to resolve requests URIs. The syntax is: `protocol:arguments`,
for instance: `http://www.example.com`, `say:Something to say` etc.
Most protocols are written using the script language. You can look at the file @protocols.liq@ for a list
Most protocols are written using the script language. You can look at the file `protocols.liq` for a list
of them.
In particular, the @process:@ protocol can use an external command to prepare resolve a request. Here's an example
In particular, the `process:` protocol can use an external command to prepare resolve a request. Here's an example
using the AWS command-line to download a file from S3:
%%(s3_protocol.liq)
```liquidsoap
def s3_protocol(~rlog,~maxtime,arg) =
extname = file.extension(dir_sep="/",arg)
extname = file.extension(leading_dot=false,dir_sep="/",arg)
[process_uri(extname=extname,"aws s3 cp s3:#{arg} $(output)")]
end
add_protocol("s3",s3_protocol,doc="Fetch files from s3 using the AWS CLI",
syntax="s3://uri")
%%
```
Each protocol needs to register a handler, here the @s3_protocol@ function. This function takes
Each protocol needs to register a handler, here the `s3_protocol` function. This function takes
the protocol arguments and returns a list of new requests or files. Liquidsoap will then call
this function, collect the returned list and keep resolving requests from the list until it finds a
suitable file.
This makes it possible to create your own custom resolution chain, including for instance cue-points. Here's an example:
%%(custom_cue_points.liq)
```liquidsoap
def cue_protocol(~rlog,~maxtime,arg) =
[process_uri(extname="wav",uri=uri,"ffmpeg -y -i $(input) -af -ss 10 -t 30 $(output)")]
end
add_protocol("cue_cut",cue_protocol)
%%
```
This protocol returns 30s of data from the input file, stating at the 10s mark.
Likewise, you can apply a normalization program:
%%(normalization_protocol.liq)
```liquidsoap
def normalization_protocol(~rlog,~maxtime,arg) =
# "normalize" command here is just an example..
[process_uri(extname="wav",uri=arg,"normalize $(inpuit)")]
end
add_protocol("normalize",normalization_protoco)
%%
```
Now, you can push requests of the form: @normalize:cue_cut:http://www.server.com/file.mp3@ and the file will be cut and normalized
Now, you can push requests of the form:
```
normalize:cue_cut:http://www.server.com/file.mp3
```
and the file will be cut and normalized
before being played by liquidsoap.
When defining custom protocols, you should pay attention to two variables:
* @rlog@ is the logging function. Messages passed to this function will be registered with the request and can be used to debug any issue
* @maxtime@ is the maximun time (in UNIX epoch) that the requests should run. After that time, it should return and be considered timed out. You may want to read from @protocols.liq@ to see how to enforce this when calling external processes.
h4. Interaction with the server
* `rlog` is the logging function. Messages passed to this function will be registered with the request and can be used to debug any issue
* `maxtime` is the maximun time (in UNIX epoch) that the requests should run. After that time, it should return and be considered timed out. You may want to read from `protocols.liq` to see how to enforce this when calling external processes.
Interaction with the server
---------------------------
Liquidsoap starts with one or several scripts as its configuration,
and then streams forever if everything goes well.
Once started, you can still interact with it by means of the _server_.
Once started, you can still interact with it by means of the *server*.
The server allows you to run commands. Some are general and always available,
some belong to a specific operator. For example the @request.queue()@ instances register commands to enqueue new requests, the outputs register commands
some belong to a specific operator. For example the `request.queue()` instances register commands to enqueue new requests, the outputs register commands
to start or stop the outputting, display the last ten metadata chunks, etc.
The protocol of the server is a simple human-readable one.
......@@ -75,26 +78,26 @@ Currently it does not have any kind of authentication and permissions.
It is currently available via two media: TCP and Unix sockets.
The TCP socket provides a simple telnet-like interface, available only on
the local host by default.
The Unix socket interface (_cf._ the @server.socket@ setting)
The Unix socket interface (*cf.* the `server.socket` setting)
is through some sort of virtual file.
This is more constraining, which allows one to restrict the use of the socket
to some priviledged users.
You can find more details on how to configure the server in the
"documentation":help.html#settings of the settings key @server@,
in particular @server.telnet@ for the TCP interface and @server.socket@
[documentation](help.html#settings) of the settings key `server`,
in particular `server.telnet` for the TCP interface and `server.socket`
for the Unix interface.
Liquidsoap also embeds some "documentation":help.html#server
Liquidsoap also embeds some [documentation](help.html#server)
about the available server commands.
Now, we shall simply enable the Telnet interface to the server,
by setting @set("server.telnet",true)@ or simply passing the @-t@ option on
by setting `set("server.telnet",true)` or simply passing the `-t` option on
the command-line.
In a "complete case analysis":complete_case.html we set up a @request.queue()@
instance to play user requests. It had the identifier @"queue"@.
In a [complete case analysis](complete_case.html) we set up a `request.queue()`
instance to play user requests. It had the identifier `"queue"`.
We are now going to interact via the server to push requests into that queue:
%%
```
dbaelde@selassie:~$ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.localdomain.
......@@ -112,33 +115,35 @@ trace 6
[...see if the download started/succeeded...]
END
exit
%%
```
Of course, the server isn't very user-friendly.
But it is easy to write scripts to interact with Liquidsoap in that way,
to implement a website or an IRC interface to your radio.
However, this sort of tool is often bound to a specific usage, so we have
not released any of ours. Feel free to
"ask the community":mailto:savonet-users@lists.sf.net about code that you could re-use.
h4. Using in production
[ask the community](mailto:savonet-users@lists.sf.net) about code that you could re-use.
Using in production
-------------------
The full installation of liquidsoap will typically install
@/etc/liquidsoap@, @/etc/init.d/liquidsoap@ and @/var/log/liquidsoap@.
`/etc/liquidsoap`, `/etc/init.d/liquidsoap` and `/var/log/liquidsoap`.
All these are meant for a particular usage of liquidsoap
when running a stable radio.
Your production @.liq@ files should go in @/etc/liquidsoap@.
You'll then start/stop them using the init script, _e.g._
@/etc/init.d/liquidsoap start@.
Your scripts don't need to have the @#!@ line,
and liquidsoap will automatically be ran on daemon mode (@-d@ option) for them.
Your production `.liq` files should go in `/etc/liquidsoap`.
You'll then start/stop them using the init script, *e.g.*
`/etc/init.d/liquidsoap start`.
Your scripts don't need to have the `#!` line,
and liquidsoap will automatically be ran on daemon mode (`-d` option) for them.
You should not override the @log.file.path@ setting because a
You should not override the `log.file.path` setting because a
logrotate configuration is also installed so that log files
in the standard directory are truncated and compressed if they grow too big.
It is not very convenient to detect errors when using the init script.
We advise users to check their scripts after modification (use
@liquidsoap --check /etc/liquidsoap/script.liq@)
`liquidsoap --check /etc/liquidsoap/script.liq`)
before effectively restarting the daemon.