Source / Track processing
append
Append an extra track to every track. Set the metadata ‘liq_append’ to false to inhibit appending on one track.
Type:
(?id : string?, ?insert_missing : bool, ?merge : bool, source('a),
(([string * string]) -> source('a))) -> source('a)
where 'a is an orderable type
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults to"append")insert_missing(of typebool, which defaults totrue): Treat track beginnings without metadata as having empty one.merge(of typebool, which defaults tofalse): Merge the track with its appended track.(unlabeled)(of typesource('a) where 'a is an orderable type): Given the metadata, build the source producing the track to append. The function can returnnullto prevent appending a new track.(unlabeled)(of type([string * string]) -> source('a) where 'a is an orderable type)
Methods:
buffered(of type() -> [string * float]): Length of buffered data.cancel_pending(of type() -> unit):clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.pending(of type() -> source('A)? where 'A is an orderable type):register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).selected(of type() -> source('A)? where 'A is an orderable type): Currently selected source.self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):set_pending(of type(source('A)?) -> unit where 'A is an orderable type):skip(of type(?cancel_pending : bool) -> unit):time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit where 'A is an orderable type): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A) where 'A is an orderable type): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
autocue.plot
Plot two sine tracks with given autocue params. Used for visualizing and testing autocue crossfade transitions.
Type:
(?png : string?, ?dir : string?, ?font : 'a?, ?font_size : int,
old_autocue : 'h
.{
amplify? : 'c,
cue_in : float,
cue_out : float,
extra_metadata? : [string * string],
fade_in : 'b,
fade_in_curve? : 'e,
fade_in_type? : 'd,
fade_out : float,
fade_out_curve? : 'g,
fade_out_type? : 'f,
start_next? : float
}, new_autocue : 'o
.{
amplify? : 'j,
cue_in : float,
cue_out : float,
extra_metadata? : [string * string],
fade_in : 'i,
fade_in_curve? : 'l,
fade_in_type? : 'k,
fade_out : float,
fade_out_curve? : 'n,
fade_out_type? : 'm,
start_next? : float
}, ?sync : string, on_stop : (() -> 'p)) -> unit
Arguments:
png(of typestring?, which defaults tonull)dir(of typestring?, which defaults tonull)font(of type'a?, which defaults tonull)font_size(of typeint, which defaults to10)old_autocue(of type'h .{ amplify? : 'c, cue_in : float, cue_out : float, extra_metadata? : [string * string], fade_in : 'b, fade_in_curve? : 'e, fade_in_type? : 'd, fade_out : float, fade_out_curve? : 'g, fade_out_type? : 'f, start_next? : float })new_autocue(of type'o .{ amplify? : 'j, cue_in : float, cue_out : float, extra_metadata? : [string * string], fade_in : 'i, fade_in_curve? : 'l, fade_in_type? : 'k, fade_out : float, fade_out_curve? : 'n, fade_out_type? : 'm, start_next? : float })sync(of typestring, which defaults to"auto")on_stop(of type() -> 'p)
chop
Regularly insert track boundaries in a stream (useful for testing tracks).
Type:
(?every : {float}, ?metadata : {[string * string]}, source('a)) -> source('a)
Arguments:
every(of type{float}, which defaults to3.0): Duration of a track (in seconds).metadata(of type{[string * string]}, which defaults to[]): Metadata for tracks.(unlabeled)(of typesource('a)): The stream.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
cross.plot
Plot the first crossfade transition. Used for visualizing and testing crossfade transitions.
Type:
(?png : string?, ?dir : string?, ?font : 'a?, ?font_size : int,
source(audio=pcm('b), 'c)) -> source(audio=pcm('b), 'c)
where
'c is a set of tracks to be muxed into a source and a set of internal tracks and an orderable type
Composition:
This source uses file composition by default.
Arguments:
png(of typestring?, which defaults tonull)dir(of typestring?, which defaults tonull)font(of type'a?, which defaults tonull)font_size(of typeint, which defaults to10)(unlabeled)(of typesource(audio=pcm('b), 'c) where 'c is a set of tracks to be muxed into a source and a set of internal tracks and an orderable type)
Methods:
buffered(of type() -> [string * float]):clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockcross_duration(of type() -> float):duration(of type() -> float):elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source uses file composition by default.on_leave(of type({source : source(audio=pcm('B), 'A), track_sensitive : bool}) -> unit where 'A is a set of tracks to be muxed into a source and a set of internal tracks and an orderable type): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type( { ending : source(audio=pcm('B), 'A)?, replay_metadata : bool, starting : source(audio=pcm('B), 'A) }) -> source(audio=pcm('B), 'A) where 'A is a set of tracks to be muxed into a source and a set of internal tracks and an orderable type): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
fallback.skip
Special track insensitive fallback that always skips current song before switching.
Type:
(source('a), ?fallback : source('a)?) -> source('a)
where 'a is a set of internal tracks
Composition:
This source inherits composition from its effective source.
Arguments:
(unlabeled)(of typesource('a) where 'a is a set of internal tracks): The main source.fallback(of typesource('a)? where 'a is a set of internal tracks, which defaults tonull): The fallback source. Defaults toblankifnull.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).selected(of type() -> source('A)? where 'A is a set of internal tracks): Currently selected source.self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit where 'A is a set of internal tracks): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A) where 'A is a set of internal tracks): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
map_first_track
Apply a function to the first track of a source
Type:
(?id : string?, ((source('a)) -> source('a)), source('a)) -> source('a)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults to"map_first_track"): Force the value of the source ID.(unlabeled)(of type(source('a)) -> source('a)): The applied function.(unlabeled)(of typesource('a)): The input source.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).selected(of type() -> source('A)?): Currently selected source.self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
native.fallback
At the beginning of each track, select the first ready child.
Type:
(?id : string?, ?track_sensitive : bool, {[source('a)]}) -> source('a)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults tonull): Force the value of the source ID.track_sensitive(of typebool, which defaults totrue): Re-select only on end of tracks.(unlabeled)(of type{[source('a)]})
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockcurrent_source(of type() -> source('A)?): Return the source currently selected.duration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.prepare(of type(source('A)) -> source('A).{activation : activation}): Prepare a source that will be returned later. Returned source has new activation attached to it and should be used to submit to the source later.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
native.once
Create a source that plays only one track of the input source.
Type:
(source('c).{on_track : (synchronous : bool, (('a) -> unit)) -> 'b}) ->
source('c)
Composition:
This source inherits composition from its effective source.
Arguments:
(unlabeled)(of typesource('c).{on_track : (synchronous : bool, (('a) -> unit)) -> 'b})
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
native.sequence
Play only one track of every successive source, except for the last one which is played as much as available.
Type:
(?id : string?,
[source('a)
.{
buffered : () -> [string * float],
clear_last_metadata : () -> unit,
clock : clock,
composition_type : (() -> string)
.{set : (string) -> unit
},
duration : () -> float,
elapsed : () -> float,
fallible : bool,
generate_frame : () -> unit,
id : () -> string,
insert_metadata : (?override : bool, ?new_track : bool,
[string * string]) -> unit,
is_active : () -> bool,
is_ready : () -> bool,
is_up : () -> bool,
last_metadata : () -> [string * string]?,
log :
{level : (() -> int).{set : (int) -> unit}
},
on_collect : (synchronous : bool, (() -> unit)) -> unit,
on_frame : (?before : bool, synchronous : bool, (() -> unit)) -> unit,
on_frame_checksum : (?before : ((string?) -> unit)?, synchronous : bool,
((cache : string?, string) -> unit)) -> unit,
on_leave : ({source : source('a), track_sensitive : bool}) -> unit,
on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit,
on_position : (position : {float}, ?remaining : bool,
?allow_partial : bool, synchronous : bool,
((float, [string * string]) -> unit)) -> unit,
on_select : (
{
ending : source('a)?,
replay_metadata : bool,
starting : source('a)
}) -> source('a),
on_shutdown : (synchronous : bool, (() -> unit)) -> unit,
on_track : (synchronous : bool, (([string * string]) -> unit)) -> unit,
on_wake_up : (synchronous : bool, (() -> unit)) -> unit,
register_command : (?usage : string?, description : string, string,
((string) -> string)) -> unit,
remaining : () -> float,
replay_metadata : {bool},
reset_last_metadata_on_track : (() -> bool)
.{set : (bool) -> unit
},
seek : (float) -> float,
self_sync : () -> bool,
self_sync_description : () -> string,
single : bool,
skip : () -> unit,
time : () -> float,
track_sensitive : {bool}
}]) -> source('a)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults tonull): Force the value of the source ID.(unlabeled)(of type[source('a) .{ buffered : () -> [string * float], clear_last_metadata : () -> unit, clock : clock, composition_type : (() -> string) .{set : (string) -> unit }, duration : () -> float, elapsed : () -> float, fallible : bool, generate_frame : () -> unit, id : () -> string, insert_metadata : (?override : bool, ?new_track : bool, [string * string]) -> unit, is_active : () -> bool, is_ready : () -> bool, is_up : () -> bool, last_metadata : () -> [string * string]?, log : {level : (() -> int).{set : (int) -> unit} }, on_collect : (synchronous : bool, (() -> unit)) -> unit, on_frame : (?before : bool, synchronous : bool, (() -> unit)) -> unit, on_frame_checksum : (?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit, on_leave : ({source : source('a), track_sensitive : bool}) -> unit, on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit, on_position : (position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit, on_select : ( { ending : source('a)?, replay_metadata : bool, starting : source('a) }) -> source('a), on_shutdown : (synchronous : bool, (() -> unit)) -> unit, on_track : (synchronous : bool, (([string * string]) -> unit)) -> unit, on_wake_up : (synchronous : bool, (() -> unit)) -> unit, register_command : (?usage : string?, description : string, string, ((string) -> string)) -> unit, remaining : () -> float, replay_metadata : {bool}, reset_last_metadata_on_track : (() -> bool) .{set : (bool) -> unit }, seek : (float) -> float, self_sync : () -> bool, self_sync_description : () -> string, single : bool, skip : () -> unit, time : () -> float, track_sensitive : {bool} }]): List of sources to play tracks from.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockcurrent_source(of type() -> source('A)?): Return the source currently selected.duration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.prepare(of type(source('A)) -> source('A).{activation : activation}): Prepare a source that will be returned later. Returned source has new activation attached to it and should be used to submit to the source later.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
native.switch
Select the first source whose predicate is true in a list. If the second argument is a getter, the source will be dynamically created.
Type:
(?id : string?, ?track_sensitive : bool, [{bool} * source('a)]) -> source('a)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults tonull): Force the value of the source ID.track_sensitive(of typebool, which defaults totrue): Re-select only on end of tracks.(unlabeled)(of type[{bool} * source('a)]): Sources with the predicate telling when they can be played.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockcurrent_source(of type() -> source('A)?): Return the source currently selected.duration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.prepare(of type(source('A)) -> source('A).{activation : activation}): Prepare a source that will be returned later. Returned source has new activation attached to it and should be used to submit to the source later.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
notify_metadata
Use notify to display metadata info.
Type:
(?urgency : string, ?icon : string, ?timeout : float,
?display : (([string * string]) -> string), ?title : string, 'b
.{on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> 'a}) ->
'a
Arguments:
urgency(of typestring, which defaults to"low"): Urgency (low|normal|critical).icon(of typestring, which defaults to"stock_smiley-22"): Icon filename or stock icon to display.timeout(of typefloat, which defaults to3.0): Timeout in seconds.display(of type([string * string]) -> string, which defaults tofun (m) -> ...): Function used to display a metadata packet.title(of typestring, which defaults to"Liquidsoap: new track"): Title of the notification message.(unlabeled)(of type'b.{on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> 'a})
osd_metadata
Use X On Screen Display to display metadata info.
Type:
(?color : string, ?position : string, ?font : string,
?display : (([string * string]) -> string), 'b
.{on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> 'a}) ->
'a
Arguments:
color(of typestring, which defaults to"green"): Color of the text.position(of typestring, which defaults to"top"): Position of the text (top|middle|bottom).font(of typestring, which defaults to"-*-courier-*-r-*-*-*-240-*-*-*-*-*-*"): Font used (xfontsel is your friend...)display(of type([string * string]) -> string, which defaults tofun (m) -> ...): Function used to display a metadata packet.(unlabeled)(of type'b.{on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> 'a})
overlap_sources
Rotate between overlapping sources. Next track starts according to 'liq_start_next' offset metadata.
Type:
(?id : string?, ?normalize : bool, ?start_next : string,
?weights : [{float}],
[source('d)
.{
on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit,
on_position : (synchronous : bool, allow_partial : bool,
position : (() -> float), (('a, 'b) -> unit)) -> unit,
on_track : (synchronous : bool, (('c) -> unit)) -> unit
}]) -> source('d)
where
'd is a set of tracks to be muxed into a source and a set of internal tracks
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults to"overlap_sources"): Force the value of the source ID.normalize(of typebool, which defaults tofalse)start_next(of typestring, which defaults to"liq_start_next"): Metadata field indicating when the next track should start, relative to current track's time.weights(of type[{float}], which defaults to[]): Relative weight of the sources in the sum. The empty list stands for the homogeneous distribution.(unlabeled)(of type[source('d) .{ on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit, on_position : (synchronous : bool, allow_partial : bool, position : (() -> float), (('a, 'b) -> unit)) -> unit, on_track : (synchronous : bool, (('c) -> unit)) -> unit }] where 'd is a set of tracks to be muxed into a source and a set of internal tracks): Sources to toggle from
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit where 'A is a set of tracks to be muxed into a source and a set of internal tracks): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A) where 'A is a set of tracks to be muxed into a source and a set of internal tracks): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
playlog
Keep a record of played files. This is primarily useful to know when a song was last played and avoid repetitions.
Type:
(?duration : float, ?persistency : string?,
?hash : (([string * string]) -> string)) -> unit
Arguments:
duration(of typefloat, which defaults toinf): Duration (in seconds) after which songs are forgotten. By default, songs are not forgotten which means that the playlog will contain all the songs ever played.persistency(of typestring?, which defaults tonull): Set a file name where the values are stored and loaded in case the script is restarted.hash(of type([string * string]) -> string, which defaults tofun (m) -> ...): Function to extract an identifier from the metadata. By default, the filename is used but we could return the artist to know when a song from a given artist was last played for instance.
Methods:
add(of type([string * string]) -> unit): Record that file with given metadata has been played.last(of type([string * string]) -> float): How long ago a file was played (in seconds),infinityis returned if the song has never been played.
prepend
Prepend an extra track before every track. Set the metadata liq_prepend to false to inhibit prepending on one track.
Type:
(?id : string?, ?merge : bool, source('a)
.{
on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit,
on_track : (synchronous : bool, (([string * string]) -> unit)) -> unit
}, (([string * string]) -> source('a)?)) -> source('a)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults to"prepend")merge(of typebool, which defaults tofalse): Merge the track with its appended track.(unlabeled)(of typesource('a) .{ on_metadata : (synchronous : bool, (([string * string]) -> unit)) -> unit, on_track : (synchronous : bool, (([string * string]) -> unit)) -> unit }): Given the metadata, build the source producing the track to append. The function can returnnullto prevent any track prepend.(unlabeled)(of type([string * string]) -> source('a)?)
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).selected(of type() -> source('A)?): Currently selected source.self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A)): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
rotate.merge
Same operator as rotate but merges tracks from each sources. For instance, rotate.merge([intro,main,outro]) creates a source that plays a sequence [intro,main,outro] as single track and loops back.
Type:
(?id : string?,
[source('e)
.{
on_leave? : ({source : source('a), track_sensitive : bool}) -> unit,
on_select? : (
{
ending : source('c)?,
replay_metadata : bool,
starting : source('b)
}) -> source('d),
replay_metadata? : {bool},
single? : bool,
track_sensitive? : {bool},
weight? : {int}
}]) -> source('e)
where
'e is a set of internal tracks and a set of tracks to be muxed into a source
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults to"rotate.merge"): Force the value of the source ID.(unlabeled)(of type[source('e) .{ on_leave? : ({source : source('a), track_sensitive : bool}) -> unit, on_select? : ( { ending : source('c)?, replay_metadata : bool, starting : source('b) }) -> source('d), replay_metadata? : {bool}, single? : bool, track_sensitive? : {bool}, weight? : {int} }] where 'e is a set of internal tracks and a set of tracks to be muxed into a source): Sequence of sources to be merged.
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).selected(of type() -> source('A)? where 'A is a set of internal tracks and a set of tracks to be muxed into a source): Currently selected source.self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source inherits composition from its effective source.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit where 'A is a set of internal tracks and a set of tracks to be muxed into a source): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A) where 'A is a set of internal tracks and a set of tracks to be muxed into a source): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).
server.insert_metadata
Register a server/telnet command to update a source's metadata. Returns a new source, which will receive the updated metadata. The command has the following format: insert key1="val1",key2="val2",...
Type:
('d
.{
register_command : (description : string, usage : string, string,
(('b.{insert_metadata : ([string * string]) -> 'a}) ->
string)) -> 'c
}) -> 'd
Arguments:
(unlabeled)(of type'd .{ register_command : (description : string, usage : string, string, (('b.{insert_metadata : ([string * string]) -> 'a}) -> string)) -> 'c })
Methods:
register_command(of type(description : string, usage : string, string, (('B.{insert_metadata : ([string * string]) -> 'C}) -> string)) -> 'A):
skipper
Regularly skip tracks from a source (useful for testing skipping).
Type:
(?every : {float}, 'b
.{on_frame : ((() -> unit)) -> 'a, skip : () -> unit, time : () -> float}) ->
'b
Arguments:
every(of type{float}, which defaults to5.0): How often to skip tracks.(unlabeled)(of type'b.{on_frame : ((() -> unit)) -> 'a, skip : () -> unit, time : () -> float}): The stream.
Methods:
on_frame(of type((() -> unit)) -> 'A):skip(of type() -> unit):time(of type() -> float):
source.cue
Generate a CUE file for the source. This function will generate a new track in the file for each metadata of the source. This function tries to map metadata to the appropriate CUE file standard values. You can use the map_metadata argument to add your own pre-processing. The following metadata are recognized on tracks: "title", "artist", "album", "isrc", and "cue_year".
Type:
(?title : string?, ?performer : string?, ?file : {string?},
?file_type : string?, ?comment : string?, ?year : 'a?,
?map_metadata : (([string * string]) -> [string * string]),
?last_tracks : int?, ?temp_dir : string?, ?deduplicate_using : [string],
?delete : bool, {string}, source('b)) -> source('b)
where 'b is a set of tracks to be muxed into a source
Composition:
This source uses file composition by default.
Arguments:
title(of typestring?, which defaults tonull): Title of the stream.performer(of typestring?, which defaults tonull)file(of type{string?}, which defaults tonull): File where the stream is stored.file_type(of typestring?, which defaults tonull): Format in which the stream is stored.comment(of typestring?, which defaults tonull): Comment about the stream.year(of type'a?, which defaults tonull): Year for the stream.map_metadata(of type([string * string]) -> [string * string], which defaults tofun (m) -> ...): Function to apply to metadata before writing the CUE file (useful for pre-processing metadata).last_tracks(of typeint?, which defaults tonull): Only report the number of last tracks.temp_dir(of typestring?, which defaults tonull): Temporary directory for atomic write.deduplicate_using(of type[string], which defaults to["title", "artist", "album", "isrc", "cue_year"]): To avoid duplicate entries, duplicate metadata are filtered. Set this to a list of labels to use for detecting duplicated metadata.delete(of typebool, which defaults totrue): Delete the CUE files when starting if it exists.(unlabeled)(of type{string}): Path where the CUE file should be written.(unlabeled)(of typesource('b) where 'b is a set of tracks to be muxed into a source)
Methods:
buffered(of type() -> [string * float]): Length of buffered data.clear_last_metadata(of type() -> unit): Clear the last metadata from the source.clock(of typeclock): The source's clockduration(of type() -> float): Estimation of the duration of the current track.elapsed(of type() -> float): Elapsed time in the current track.fallible(of typebool): Indicate if a source may fail, i.e. may not be ready to stream.generate_frame(of type() -> unit): Generate a frame from the source without consuming it. This can be useful in advanced cases where generating a frame is required to trigger some side effect like calculating some metadata before making a decision. You should make sure that the source is available before calling this function and it should only be called inside synchronous streaming loop callback such ason_frame!id(of type() -> string): Identifier of the source.insert_metadata(of type(?override : bool, ?new_track : bool, [string * string]) -> unit): Dynamically insert metadata in a stream. Inserts a new track with the given metadata ifnew_trackistrue. Whenoverrideisfalse, metadata that the source provides itself takes precedence over the inserted one.is_active(of type() -> bool):trueif the source is active, i.e. it is continuously animated by its own clock whenever it is ready. Typically,truefor outputs and sources such asinput.http.is_ready(of type() -> bool): Indicate if a source is ready to stream. This does not mean that the source is currently streaming, just that its resources are all properly initialized.is_up(of type() -> bool): Indicate that the source can be asked to produce some data at any time. This istruewhen the source is currently being used or if it could be used at any time, typically inside aswitchorfallback.last_metadata(of type() -> [string * string]?): Return the last metadata from the source.log(of type{level : (() -> int).{set : (int) -> unit}}): Get or set the source's log level, from1to5.register_command(of type(?usage : string?, description : string, string, ((string) -> string)) -> unit): Register a server command for this source. Command is registered under the source's id namespace when it gets up and de-registered when it gets down.remaining(of type() -> float): Estimation of remaining time in the current track.reset_last_metadata_on_track(of type(() -> bool).{set : (bool) -> unit}): Iftrue, the source'slast_metadatais reset on each new track. If a metadata is present along with the track mark, then it becomes the newlast_metadata, otherwise,last_metadata becomesnull`.seek(of type(float) -> float): Seek forward, in seconds (returns the amount of time effectively seeked).self_sync(of type() -> bool): Is the source currently controlling its own real-time loop.self_sync_description(of type() -> string):skip(of type() -> unit): Skip to the next track.time(of type() -> float): Get a source's time, based on its assigned clock.
Callbacks:
on_collect(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source is collectedon_frame(of type(?before : bool, synchronous : bool, (() -> unit)) -> unit): Call a given handler on frame. Whenbeforeistrue, callback is executed before computing the frame and after otherwiseon_frame_checksum(of type(?before : ((string?) -> unit)?, synchronous : bool, ((cache : string?, string) -> unit)) -> unit): Call a given handler Register callbacks to compute frame checksums for debugging purposes. This is useful to track frame content changes through the streaming pipeline. Thebeforecallback is called before computing the frame with the checksum of the cached frame (if any,nullotherwise). The main callback is called after computing the frame with the checksum of the generated frame and the remaining cache (if any).on_metadata(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler to execute on each metadataon_position(of type(position : {float}, ?remaining : bool, ?allow_partial : bool, synchronous : bool, ((float, [string * string]) -> unit)) -> unit): Call a given handler on track position. Ifremainingisfalse, callback is executed when position in track is more or equal toposition. Ifremainingistrue, callback is executed when remaining time in the current track is less or equal toposition. Keep in mind that elapsed time is exact while remaining time is always estimated. Remaining time is usually more accurate for file-based sources. Whenallow_partialistrue, if the current track ends before theoffsetposition is reached, callback is still executedon_shutdown(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called when source shuts downon_track(of type(synchronous : bool, (([string * string]) -> unit)) -> unit): Call a given handler on track markson_wake_up(of type(synchronous : bool, (() -> unit)) -> unit): Call a given handler to be called after the source is asked to get ready
Composition methods:
composition_type(of type(() -> string).{set : (string) -> unit}): This source uses file composition by default.on_leave(of type({source : source('A), track_sensitive : bool}) -> unit where 'A is a set of tracks to be muxed into a source): Called after switching away from this source in a switch operator, once the transition using the ending source has completed. Receives a record withsource(the source being left) andtrack_sensitive(trueif the ending source's last frame had a track mark, i.e. it finished naturally;falseif it was preempted mid-track). This function must return quickly as it runs in the streaming thread. The default depends on the active composition profile: file sources (source.composition.file) skip the source when preempted mid-track so it starts fresh on its next selection, and do nothing when it finished naturally; live sources (source.composition.live) do nothing.on_select(of type({ending : source('A)?, replay_metadata : bool, starting : source('A)}) -> source('A) where 'A is a set of tracks to be muxed into a source): Called when selecting this source in a switch operator. Receives a record withstarting(the incoming source) andending(the previous source, ornullwhen the ending source reached a track boundary). Returns the source to use. By default, both file and live profiles fade outendingwhen non-null (up to 1 second). The default is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).replay_metadata(of type{bool}): Whether to replay the latest metadata on this source when it is selected in a switch operator. Defaults totrue. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).single(of typebool): Forbid the selection of this source for two consecutive tracks in switch operators. Defaults tofalse.track_sensitive(of type{bool}): Whether this source insists on track boundaries in switch operators: whentrue, it prefers not to be interrupted mid-track and not to be started mid-track. A switch may only cut into a track that is still playing when at least one of the two sources involved hastrack_sensitiveset tofalse; otherwise it waits for the playing source to reach a track boundary. File-based sources default totrue; live network and hardware inputs default tofalse. The value is looked up at runtime from the active composition profile (source.composition.fileorsource.composition.livedepending oncomposition_type).