Source / Liquidsoap
buffer
Create a buffer between two different clocks.
Type:
(?id : string?, ?add_track_mark : bool, ?buffer : float, ?fallible : bool,
?max : float, ?register_telnet : bool, ?replay_metadata : bool,
?start : 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.add_track_mark(of typebool, which defaults totrue): Insert a track mark when the buffer becomes available again.buffer(of typefloat, which defaults to1.0): Amount of data to pre-buffer, in seconds.fallible(of typebool, which defaults totrue): Allow the child source to fail.max(of typefloat, which defaults to10.0): Maximum amount of buffered data, in seconds.register_telnet(of typebool, which defaults totrue): Register telnet commands for this output.replay_metadata(of typebool, which defaults totrue): Replay the last metadata when the buffer becomes available again.start(of typebool, which defaults totrue): Start output as soon as it is available.(unlabeled)(of typesource('a))
Methods:
buffer_length(of type() -> int): Buffer length, in main ticksbuffered(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).
buffer.adaptative
Create a buffer between two different clocks. The speed of the output is adapted so that no buffer underrun or overrun occurs. This wonderful behavior has a cost: the pitch of the sound might be changed a little.
Type:
(?id : string?, ?averaging : float, ?buffer : float, ?fallible : bool,
?limit : float, ?max : float, ?register_telnet : bool, ?resample : bool,
?reset : bool, ?start : bool, source(audio=pcm('a), 'b)) ->
source(audio=pcm('a), 'b)
Composition:
This source inherits composition from its effective source.
Arguments:
id(of typestring?, which defaults tonull): Force the value of the source ID.averaging(of typefloat, which defaults to30.0): Length of the buffer averaging, in seconds (the time constant of the smoothing to be precise). The greater this is, the less reactive to local variations we are.buffer(of typefloat, which defaults to1.0): Amount of data to prebuffer, in seconds.fallible(of typebool, which defaults tofalse): Allow the child source to fail, in which case the output will be stopped until the source is available again.limit(of typefloat, which defaults to1.25): Maximum acceleration or deceleration factor, ie how fast or slow we can be compared to realtime.max(of typefloat, which defaults to10.0): Maximum amount of buffered data, in seconds.register_telnet(of typebool, which defaults totrue): Register telnet commands for this output.resample(of typebool, which defaults totrue): Use proper resampling instead of simply duplicating samples.reset(of typebool, which defaults tofalse): Reset speed estimation to 1 when the source becomes available again (resuming from a buffer underflow).start(of typebool, which defaults totrue): Start output as soon as it is available.(unlabeled)(of typesource(audio=pcm('a), '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): Current buffer duration, in seconds.elapsed(of type() -> float): Elapsed time in the current track.estimated(of type() -> float): Current smoothed buffer duration, in seconds.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.ratio(of type() -> float): Get the current scaling ratio.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(audio=pcm('B), '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(audio=pcm('B), 'A)?, replay_metadata : bool, starting : source(audio=pcm('B), 'A) }) -> source(audio=pcm('B), '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).
This function is experimental.
format.description
Return a description of the given format as a record with optional methods. For PCM audio: { channels, channel_layout }. For YUV420P video: { width, height }. For MIDI: { channels }. Returns an empty record for formats without a description (e.g. metadata, track marks).
Type:
(content_format) -> unit
Arguments:
(unlabeled)(of typecontent_format)
Methods:
ffmpeg_copy?(of typestring)ffmpeg_raw_audio?(of typestring)ffmpeg_raw_video?(of typestring)metadata?(of typestring)midi?(of type{channels : int})pcm?(of type{channel_layout : string, channels : int})pcm_f32?(of type{channel_layout : string, channels : int})pcm_s16?(of type{channel_layout : string, channels : int})subtitle?(of typestring)track_marks?(of typestring)yuv420p?(of type{alpha : bool?, height : int, width : int})
request.dump
Immediately encode the whole contents of a request into a file.
Type:
(format('a), string, request, ?ratio : float, ?timeout : float,
?sleep_latency : float) -> unit
Arguments:
(unlabeled)(of typeformat('a)): Encoding format.(unlabeled)(of typestring): Name of the file.(unlabeled)(of typerequest): Request to encode.ratio(of typefloat, which defaults to50.0): Time ratio. A value of50means process data at50xreal rate, when possible.timeout(of typefloat, which defaults to1.0): Stop processing the source if it has not started after the given timeout.sleep_latency(of typefloat, which defaults to0.1): How much time ahead, in seconds, should we should be before pausing the processing.
This function is experimental.
request.process
Given a request and an optional function to process this request, animate the source as fast as possible until the request is fully processed.
Type:
(request, ?process : ((source('a)) -> source('b)), ?ratio : float,
?timeout : float, ?sleep_latency : float) -> unit
Arguments:
(unlabeled)(of typerequest): Request to processprocess(of type(source('a)) -> source('b), which defaults tofun (_) -> (builtin)): Callback to create the source to animate.ratio(of typefloat, which defaults to50.0): Time ratio. A value of50means process data at50xreal rate, when possible.timeout(of typefloat, which defaults to1.0): Stop processing the source if it has not started after the given timeout.sleep_latency(of typefloat, which defaults to0.1): How much time ahead, in seconds, should we should be before pausing the processing.
source.content
Return the content type of the source as an associative list mapping frame field names (e.g. "audio", "video") to their content format. Use format.description to introspect a format value.
Type:
(source('a)) -> [string * content_format]
Arguments:
(unlabeled)(of typesource('a))
source.duration
Estimation of the duration in the current track.
Type:
(source('a)) -> float
Arguments:
(unlabeled)(of typesource('a))
source.effective
Returns the effective source for the given source that is the source effectively being animated during the current streaming cycle. For instance, this return the currently active source in a switch and etc. The operator is recursive so it is applied through the whole streaming graph until it finds a leaf source.
Type:
(source('a)) -> source('a)
Arguments:
(unlabeled)(of typesource('a))
source.elapsed
Elapsed time in the current track.
Type:
(source('a)) -> float
Arguments:
(unlabeled)(of typesource('a))
source.fallible
Indicate if a source may fail, i.e. may not be ready to stream.
Type:
(source('a)) -> bool
Arguments:
(unlabeled)(of typesource('a))
source.id
Get the identifier of a source.
Type:
(source('a)) -> string
Arguments:
(unlabeled)(of typesource('a))
source.is_ready
Indicate if a source is ready to stream (we also say that it is available), or currently streaming.
Type:
(source('a)) -> bool
Arguments:
(unlabeled)(of typesource('a))
source.methods
Returns the given source decorated with all its methods.
Type:
(source('a)) -> source('a)
Arguments:
(unlabeled)(of typesource('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).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).
source.on_shutdown
Register a function to be called when source is not used anymore by another source.
Type:
(source('a), (() -> unit)) -> unit
Arguments:
(unlabeled)(of typesource('a))(unlabeled)(of type() -> unit)
source.remaining
Estimation of remaining time in the current track.
Type:
(source('a)) -> float
Arguments:
(unlabeled)(of typesource('a))
source.seek
Seek forward, in seconds. Returns the amount of time effectively seeked.
Type:
(source('a), float) -> float
Arguments:
(unlabeled)(of typesource('a))(unlabeled)(of typefloat)
source.set_id
Set the id of an operator.
Type:
(source('a), string) -> unit
Arguments:
(unlabeled)(of typesource('a))(unlabeled)(of typestring)
source.skip
Skip to the next track.
Type:
(source('a)) -> unit
Arguments:
(unlabeled)(of typesource('a))
source.time
Get a source's time, based on its assigned clock
Type:
(source('a)) -> float
Arguments:
(unlabeled)(of typesource('a))