update liquidsoap library scripts
-git commit hash f776e7f4c5d3729cbcf863381f3cadd96c578a5b
This commit is contained in:
parent
e5bbed3782
commit
e285bcfba1
6 changed files with 46 additions and 349 deletions
|
@ -1,314 +0,0 @@
|
||||||
# These operators need to be updated..
|
|
||||||
|
|
||||||
|
|
||||||
# Stream data from mplayer
|
|
||||||
# @category Source / Input
|
|
||||||
# @param s data URI.
|
|
||||||
# @param ~restart restart on exit.
|
|
||||||
# @param ~restart_on_error restart on exit with error.
|
|
||||||
# @param ~buffer Duration of the pre-buffered data.
|
|
||||||
# @param ~max Maximum duration of the buffered data.
|
|
||||||
def input.mplayer(~id="input.mplayer",
|
|
||||||
~restart=true,~restart_on_error=false,
|
|
||||||
~buffer=0.2,~max=10.,s) =
|
|
||||||
input.external(id=id,restart=restart,
|
|
||||||
restart_on_error=restart_on_error,
|
|
||||||
buffer=buffer,max=max,
|
|
||||||
"mplayer -really-quiet -ao pcm:file=/dev/stdout \
|
|
||||||
-vc null -vo null #{quote(s)} 2>/dev/null")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# Output the stream using aplay.
|
|
||||||
# Using this turns "root.sync" to false
|
|
||||||
# since aplay will do the synchronisation
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~device Alsa pcm device name
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s Source to play
|
|
||||||
def output.aplay(~id="output.aplay",~device="default",
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
~restart_on_crash=false,s)
|
|
||||||
def aplay_p(m) =
|
|
||||||
"aplay -D #{device}"
|
|
||||||
end
|
|
||||||
log(label=id,level=3,"Setting root.sync to false")
|
|
||||||
set("root.sync",false)
|
|
||||||
output.pipe.external(id=id,
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
restart_on_crash=restart_on_crash,
|
|
||||||
restart_on_new_track=false,
|
|
||||||
process=aplay_p,s)
|
|
||||||
end
|
|
||||||
|
|
||||||
%ifdef output.icecast.external
|
|
||||||
# Output to icecast using the lame command line encoder.
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~start Start output threads on operator initialization.
|
|
||||||
# @param ~restart Restart output after a failure. By default, liquidsoap will stop if the output failed.
|
|
||||||
# @param ~restart_delay Delay, in seconds, before attempting new connection, if restart is enabled.
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~restart_on_new_track Restart encoder upon new track.
|
|
||||||
# @param ~restart_encoder_delay Restart the encoder after this delay, in seconds.
|
|
||||||
# @param ~user User for shout source connection. Useful only in special cases, like with per-mountpoint users.
|
|
||||||
# @param ~lame The lame binary
|
|
||||||
# @param ~bitrate Encoder bitrate
|
|
||||||
# @param ~swap Swap audio samples. Depends on local machine's endianess and lame's version. Test this parameter if you experience garbaged mp3 audio data. On intel 32 and 64 architectures, the parameter should be "true" for lame version >= 3.98.
|
|
||||||
# @param ~dumpfile Dump stream to file, for debugging purpose. Disabled if empty.
|
|
||||||
# @param ~protocol Protocol of the streaming server: 'http' for Icecast, 'icy' for Shoutcast.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s The source to output
|
|
||||||
def output.icecast.lame(
|
|
||||||
~id="output.icecast.lame",~start=true,
|
|
||||||
~restart=false,~restart_delay=3,
|
|
||||||
~host="localhost",~port=8000,
|
|
||||||
~user="source",~password="hackme",
|
|
||||||
~genre="Misc",~url="http://savonet.sf.net/",
|
|
||||||
~description="Liquidsoap Radio!",~public=true,
|
|
||||||
~dumpfile="",~mount="Use [name]",
|
|
||||||
~name="Use [mount]",~protocol="http",
|
|
||||||
~lame="lame",~bitrate=128,~swap=false,
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
~restart_on_crash=false,~restart_on_new_track=false,
|
|
||||||
~restart_encoder_delay=3600,~headers=[],s)
|
|
||||||
samplerate = get(default=44100,"frame.samplerate")
|
|
||||||
samplerate = float_of_int(samplerate) / 1000.
|
|
||||||
channels = get(default=2,"frame.channels")
|
|
||||||
swap = if swap then "-x" else "" end
|
|
||||||
mode =
|
|
||||||
if channels == 2 then
|
|
||||||
"j" # Encoding in joint stereo..
|
|
||||||
else
|
|
||||||
"m"
|
|
||||||
end
|
|
||||||
# Metadata update is set by ICY with icecast
|
|
||||||
def lame_p(m)
|
|
||||||
"#{lame} -b #{bitrate} -r --bitwidth 16 -s #{samplerate} \
|
|
||||||
--signed -m #{mode} --nores #{swap} -t - -"
|
|
||||||
end
|
|
||||||
output.icecast.external(id=id,
|
|
||||||
process=lame_p,bitrate=bitrate,start=start,
|
|
||||||
restart=restart,restart_delay=restart_delay,
|
|
||||||
host=host,port=port,user=user,password=password,
|
|
||||||
genre=genre,url=url,description=description,
|
|
||||||
public=public,dumpfile=dumpfile,restart_encoder_delay=restart_encoder_delay,
|
|
||||||
name=name,mount=mount,protocol=protocol,
|
|
||||||
header=false,restart_on_crash=restart_on_crash,
|
|
||||||
restart_on_new_track=restart_on_new_track,headers=headers,
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
s)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Output to shoutcast using the lame encoder.
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~start Start output threads on operator initialization.
|
|
||||||
# @param ~restart Restart output after a failure. By default, liquidsoap will stop if the output failed.
|
|
||||||
# @param ~restart_delay Delay, in seconds, before attempting new connection, if restart is enabled.
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~restart_on_new_track Restart encoder upon new track.
|
|
||||||
# @param ~restart_encoder_delay Restart the encoder after this delay, in seconds.
|
|
||||||
# @param ~user User for shout source connection. Useful only in special cases, like with per-mountpoint users.
|
|
||||||
# @param ~lame The lame binary
|
|
||||||
# @param ~bitrate Encoder bitrate
|
|
||||||
# @param ~icy_reset Reset shoutcast source buffer upon connecting (necessary for NSV).
|
|
||||||
# @param ~dumpfile Dump stream to file, for debugging purpose. Disabled if empty.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s The source to output
|
|
||||||
def output.shoutcast.lame(
|
|
||||||
~id="output.shoutcast.mp3",~start=true,
|
|
||||||
~restart=false,~restart_delay=3,
|
|
||||||
~host="localhost",~port=8000,
|
|
||||||
~user="source",~password="hackme",
|
|
||||||
~genre="Misc",~url="http://savonet.sf.net/",
|
|
||||||
~description="Liquidsoap Radio!",~public=true,
|
|
||||||
~dumpfile="",~name="Use [mount]",~icy_reset=true,
|
|
||||||
~lame="lame",~aim="",~icq="",~irc="",
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
~restart_on_crash=false,~restart_on_new_track=false,
|
|
||||||
~restart_encoder_delay=3600,~bitrate=128,s) =
|
|
||||||
icy_reset = if icy_reset then "1" else "0" end
|
|
||||||
headers = [("icy-aim",aim),("icy-irc",irc),
|
|
||||||
("icy-icq",icq),("icy-reset",icy_reset)]
|
|
||||||
output.icecast.lame(
|
|
||||||
id=id, headers=headers, lame=lame,
|
|
||||||
bitrate=bitrate, start=start,
|
|
||||||
restart=restart, restart_encoder_delay=restart_encoder_delay,
|
|
||||||
host=host, port=port, user=user, password=password,
|
|
||||||
genre=genre, url=url, description=description,
|
|
||||||
public=public, dumpfile=dumpfile,
|
|
||||||
restart_on_crash=restart_on_crash,
|
|
||||||
restart_on_new_track=restart_on_new_track,
|
|
||||||
name=name, mount="/", protocol="icy",
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
s)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Output to icecast using the flac command line encoder.
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~start Start output threads on operator initialization.
|
|
||||||
# @param ~restart Restart output after a failure. By default, liquidsoap will stop if the output failed.
|
|
||||||
# @param ~restart_delay Delay, in seconds, before attempting new connection, if restart is enabled.
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~restart_on_new_track Restart encoder upon new track. If false, the resulting stream will have a single track.
|
|
||||||
# @param ~restart_encoder_delay Restart the encoder after this delay, in seconds.
|
|
||||||
# @param ~user User for shout source connection. Useful only in special cases, like with per-mountpoint users.
|
|
||||||
# @param ~flac The flac binary
|
|
||||||
# @param ~quality Encoder quality (0..8)
|
|
||||||
# @param ~dumpfile Dump stream to file, for debugging purpose. Disabled if empty.
|
|
||||||
# @param ~protocol Protocol of the streaming server: 'http' for Icecast, 'icy' for Shoutcast.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s The source to output
|
|
||||||
def output.icecast.flac(
|
|
||||||
~id="output.icecast.flac",~start=true,
|
|
||||||
~restart=false,~restart_delay=3,
|
|
||||||
~host="localhost",~port=8000,
|
|
||||||
~user="source",~password="hackme",
|
|
||||||
~genre="Misc",~url="http://savonet.sf.net/",
|
|
||||||
~description="Liquidsoap Radio!",~public=true,
|
|
||||||
~dumpfile="",~mount="Use [name]",
|
|
||||||
~name="Use [mount]",~protocol="http",
|
|
||||||
~flac="flac",~quality=6,
|
|
||||||
~restart_on_crash=false,
|
|
||||||
~restart_on_new_track=true,
|
|
||||||
~restart_encoder_delay=(-1),
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
s)
|
|
||||||
# We will use raw format, to
|
|
||||||
# bypass input length value in WAV
|
|
||||||
# header (input length is not known)
|
|
||||||
channels = get(default=2,"frame.channels")
|
|
||||||
samplerate = get(default=44100,"frame.samplerate")
|
|
||||||
def flac_p(m)=
|
|
||||||
def option(x) =
|
|
||||||
"-T #{quote(fst(x))}=#{quote(snd(x))}"
|
|
||||||
end
|
|
||||||
m = list.map(option,m)
|
|
||||||
m = string.concat(separator=" ",m)
|
|
||||||
"#{flac} --force-raw-format --endian=little --channels=#{channels} \
|
|
||||||
--bps=16 --sample-rate=#{samplerate} --sign=signed #{m} \
|
|
||||||
-#{quality} --ogg -c -"
|
|
||||||
end
|
|
||||||
output.icecast.external(id=id,
|
|
||||||
process=flac_p,bitrate=(-1),start=start,
|
|
||||||
restart=restart,restart_delay=restart_delay,
|
|
||||||
host=host,port=port,user=user,password=password,
|
|
||||||
genre=genre,url=url,description=description,
|
|
||||||
public=public,dumpfile=dumpfile,
|
|
||||||
name=name,mount=mount,protocol=protocol,
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
restart_on_new_track=restart_on_new_track,
|
|
||||||
format="ogg",header=false,icy_metadata=false,
|
|
||||||
restart_on_crash=restart_on_crash,
|
|
||||||
restart_encoder_delay=restart_encoder_delay,
|
|
||||||
s)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Output to icecast using the aacplusenc command line encoder.
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~start Start output threads on operator initialization.
|
|
||||||
# @param ~restart Restart output after a failure. By default, liquidsoap will stop if the output failed.
|
|
||||||
# @param ~restart_delay Delay, in seconds, before attempting new connection, if restart is enabled.
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~restart_on_new_track Restart encoder upon new track.
|
|
||||||
# @param ~restart_encoder_delay Restart the encoder after this delay, in seconds.
|
|
||||||
# @param ~user User for shout source connection. Useful only in special cases, like with per-mountpoint users.
|
|
||||||
# @param ~aacplusenc The aacplusenc binary
|
|
||||||
# @param ~bitrate Encoder bitrate
|
|
||||||
# @param ~dumpfile Dump stream to file, for debugging purpose. Disabled if empty.
|
|
||||||
# @param ~protocol Protocol of the streaming server: 'http' for Icecast, 'icy' for Shoutcast.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s The source to output
|
|
||||||
def output.icecast.aacplusenc(
|
|
||||||
~id="output.icecast.aacplusenc",~start=true,
|
|
||||||
~restart=false,~restart_delay=3,
|
|
||||||
~host="localhost",~port=8000,
|
|
||||||
~user="source",~password="hackme",
|
|
||||||
~genre="Misc",~url="http://savonet.sf.net/",
|
|
||||||
~description="Liquidsoap Radio!",~public=true,
|
|
||||||
~dumpfile="",~mount="Use [name]",
|
|
||||||
~name="Use [mount]",~protocol="http",
|
|
||||||
~aacplusenc="aacplusenc",~bitrate=64,
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
~restart_on_crash=false,~restart_on_new_track=false,
|
|
||||||
~restart_encoder_delay=3600,~headers=[],s)
|
|
||||||
# Metadata update is set by ICY with icecast
|
|
||||||
def aacplusenc_p(m)
|
|
||||||
"#{aacplusenc} - - #{bitrate}"
|
|
||||||
end
|
|
||||||
output.icecast.external(id=id,
|
|
||||||
process=aacplusenc_p,bitrate=bitrate,start=start,
|
|
||||||
restart=restart,restart_delay=restart_delay,
|
|
||||||
host=host,port=port,user=user,password=password,
|
|
||||||
genre=genre,url=url,description=description,
|
|
||||||
public=public,dumpfile=dumpfile,
|
|
||||||
name=name,mount=mount,protocol=protocol,
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
header=true,restart_on_crash=restart_on_crash,
|
|
||||||
restart_on_new_track=restart_on_new_track,headers=headers,
|
|
||||||
restart_encoder_delay=restart_encoder_delay,format="audio/aacp",s)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Output to shoutcast using the aacplusenc encoder.
|
|
||||||
# @category Source / Output
|
|
||||||
# @param ~id Output's ID
|
|
||||||
# @param ~start Start output threads on operator initialization.
|
|
||||||
# @param ~restart Restart output after a failure. By default, liquidsoap will stop if the output failed.
|
|
||||||
# @param ~restart_delay Delay, in seconds, before attempting new connection, if restart is enabled.
|
|
||||||
# @param ~restart_on_crash Restart external process on crash. If false, liquidsoap will stop.
|
|
||||||
# @param ~restart_on_new_track Restart encoder upon new track.
|
|
||||||
# @param ~restart_encoder_delay Restart the encoder after this delay, in seconds.
|
|
||||||
# @param ~user User for shout source connection. Useful only in special cases, like with per-mountpoint users.
|
|
||||||
# @param ~aacplusenc The aacplusenc binary
|
|
||||||
# @param ~bitrate Encoder bitrate
|
|
||||||
# @param ~icy_reset Reset shoutcast source buffer upon connecting (necessary for NSV).
|
|
||||||
# @param ~dumpfile Dump stream to file, for debugging purpose. Disabled if empty.
|
|
||||||
# @param ~fallible Allow the child source to fail, in which case the output will be (temporarily) stopped.
|
|
||||||
# @param ~on_start Callback executed when outputting starts.
|
|
||||||
# @param ~on_stop Callback executed when outputting stops.
|
|
||||||
# @param s The source to output
|
|
||||||
def output.shoutcast.aacplusenc(
|
|
||||||
~id="output.shoutcast.aacplusenc",~start=true,
|
|
||||||
~restart=false,~restart_delay=3,
|
|
||||||
~host="localhost",~port=8000,
|
|
||||||
~user="source",~password="hackme",
|
|
||||||
~genre="Misc",~url="http://savonet.sf.net/",
|
|
||||||
~description="Liquidsoap Radio!",~public=true,
|
|
||||||
~fallible=false,~on_start={()},~on_stop={()},
|
|
||||||
~dumpfile="",~name="Use [mount]",~icy_reset=true,
|
|
||||||
~aim="",~icq="",~irc="",~aacplusenc="aacplusenc",
|
|
||||||
~restart_on_crash=false,~restart_on_new_track=false,
|
|
||||||
~restart_encoder_delay=3600,~bitrate=64,s) =
|
|
||||||
icy_reset = if icy_reset then "1" else "0" end
|
|
||||||
headers = [("icy-aim",aim),("icy-irc",irc),
|
|
||||||
("icy-icq",icq),("icy-reset",icy_reset)]
|
|
||||||
output.icecast.aacplusenc(
|
|
||||||
id=id, headers=headers, aacplusenc=aacplusenc,
|
|
||||||
bitrate=bitrate, start=start,
|
|
||||||
restart=restart, restart_delay=restart_delay,
|
|
||||||
host=host, port=port, user=user, password=password,
|
|
||||||
genre=genre, url=url, description=description,
|
|
||||||
public=public, dumpfile=dumpfile,
|
|
||||||
fallible=fallible,on_start=on_start,on_stop=on_stop,
|
|
||||||
restart_on_crash=restart_on_crash, restart_encoder_delay=restart_encoder_delay,
|
|
||||||
restart_on_new_track=restart_on_new_track,
|
|
||||||
name=name, mount="/", protocol="icy",
|
|
||||||
s)
|
|
||||||
end
|
|
||||||
%endif
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# Enable external Musepack decoder. Requires the
|
# Enable external Musepack decoder. Requires the
|
||||||
# mpcdec binary in the path. Does not work on
|
# mpcdec binary in the path. Does not work on
|
||||||
# Win32.
|
# Win32.
|
||||||
|
# @category Liquidsoap
|
||||||
def enable_external_mpc_decoder() =
|
def enable_external_mpc_decoder() =
|
||||||
# A list of know extensions and content-type for Musepack.
|
# A list of know extensions and content-type for Musepack.
|
||||||
# Values from http://en.wikipedia.org/wiki/Musepack
|
# Values from http://en.wikipedia.org/wiki/Musepack
|
||||||
|
|
|
@ -13,18 +13,12 @@ def http_response(~protocol="HTTP/1.1",
|
||||||
~headers=[],
|
~headers=[],
|
||||||
~data="") =
|
~data="") =
|
||||||
status = http_codes[string_of(code)]
|
status = http_codes[string_of(code)]
|
||||||
# Set content-length if needed and not set by the
|
# Set content-length and connection: close
|
||||||
# user.
|
|
||||||
headers =
|
headers =
|
||||||
if data != "" and
|
list.append(headers,
|
||||||
not list.mem_assoc("Content-Length",headers)
|
[("Content-Length", "#{string.length(data)}"),
|
||||||
then
|
("Connection", "close")])
|
||||||
list.append([("Content-Length",
|
|
||||||
"#{string.length(data)}")],
|
|
||||||
headers)
|
|
||||||
else
|
|
||||||
headers
|
|
||||||
end
|
|
||||||
headers = list.map(fun (x) -> "#{fst(x)}: #{snd(x)}",headers)
|
headers = list.map(fun (x) -> "#{fst(x)}: #{snd(x)}",headers)
|
||||||
headers = string.concat(separator="\r\n",headers)
|
headers = string.concat(separator="\r\n",headers)
|
||||||
# If no headers are provided, we should avoid
|
# If no headers are provided, we should avoid
|
||||||
|
|
|
@ -4,4 +4,5 @@
|
||||||
%include "lastfm.liq"
|
%include "lastfm.liq"
|
||||||
%include "flows.liq"
|
%include "flows.liq"
|
||||||
%include "http.liq"
|
%include "http.liq"
|
||||||
%include "video_text.liq"
|
%include "video_text.liq"
|
||||||
|
%include "gstreamer.liq"
|
||||||
|
|
|
@ -21,10 +21,14 @@ end
|
||||||
# @param a Key to look for
|
# @param a Key to look for
|
||||||
# @param l List of pairs (key,value)
|
# @param l List of pairs (key,value)
|
||||||
def list.mem_assoc(a,l)
|
def list.mem_assoc(a,l)
|
||||||
v = list.assoc(a,l)
|
def f(cur, el) =
|
||||||
# We check for existence, since "" may indicate
|
if not cur then
|
||||||
# either a binding (a,"") or no binding..
|
fst(el) == a
|
||||||
list.mem((a,v),l)
|
else
|
||||||
|
cur
|
||||||
|
end
|
||||||
|
end
|
||||||
|
list.fold(f, false, l)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Remove a pair from an associative list
|
# Remove a pair from an associative list
|
||||||
|
@ -164,8 +168,7 @@ def out(s)
|
||||||
output.prefered(mksafe(s))
|
output.prefered(mksafe(s))
|
||||||
end
|
end
|
||||||
|
|
||||||
# Special track insensitive fallback that
|
# Special track insensitive fallback that always skips current song before switching.
|
||||||
# always skip current song before switching.
|
|
||||||
# @category Source / Track Processing
|
# @category Source / Track Processing
|
||||||
# @param ~input The input source
|
# @param ~input The input source
|
||||||
# @param f The fallback source
|
# @param f The fallback source
|
||||||
|
@ -212,14 +215,17 @@ end
|
||||||
# Simple crossfade.
|
# Simple crossfade.
|
||||||
# @category Source / Track Processing
|
# @category Source / Track Processing
|
||||||
# @param ~start_next Duration in seconds of the crossed end of track.
|
# @param ~start_next Duration in seconds of the crossed end of track.
|
||||||
# @param ~fade_in Duration of the fade in for next track
|
# @param ~fade_in Duration of the fade in for next track.
|
||||||
# @param ~fade_out Duration of the fade out for previous track
|
# @param ~fade_out Duration of the fade out for previous track.
|
||||||
# @param s The source to use
|
# @param ~conservative Always prepare for a premature end-of-track.
|
||||||
def crossfade(~id="",~start_next,~fade_in,~fade_out,s)
|
# @param s The source to use.
|
||||||
|
def crossfade(~id="",~conservative=true,
|
||||||
|
~start_next=5.,~fade_in=3.,~fade_out=3.,
|
||||||
|
s)
|
||||||
s = fade.in(duration=fade_in,s)
|
s = fade.in(duration=fade_in,s)
|
||||||
s = fade.out(duration=fade_out,s)
|
s = fade.out(duration=fade_out,s)
|
||||||
fader = fun (a,b) -> add(normalize=false,[b,a])
|
fader = fun (a,b) -> add(normalize=false,[b,a])
|
||||||
cross(id=id,conservative=true,duration=start_next,fader,s)
|
cross(id=id,conservative=conservative,duration=start_next,fader,s)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Append speech-synthesized tracks reading the metadata.
|
# Append speech-synthesized tracks reading the metadata.
|
||||||
|
@ -242,8 +248,7 @@ def helium(s)
|
||||||
end
|
end
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
# Return true if process exited with 0 code.
|
# Return true if process exited with 0 code. Command should return quickly.
|
||||||
# Command should return quickly.
|
|
||||||
# @category System
|
# @category System
|
||||||
# @param command Command to test
|
# @param command Command to test
|
||||||
def test_process(command)
|
def test_process(command)
|
||||||
|
@ -277,12 +282,9 @@ def url.split(uri) =
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Register a server/telnet command to
|
# Register a server/telnet command to update a source's metadata. Returns
|
||||||
# update a source's metadata. Returns
|
# a new source, which will receive the updated metadata. The command has
|
||||||
# a new source, which will receive the
|
# the following format: insert key1="val1",key2="val2",...
|
||||||
# updated metadata. It behaves just like
|
|
||||||
# the pre-1.0 insert_metadata() operator,
|
|
||||||
# i.e. insert key1="val1",key2="val2",...
|
|
||||||
# @category Source / Track Processing
|
# @category Source / Track Processing
|
||||||
# @param ~id Force the value of the source ID.
|
# @param ~id Force the value of the source ID.
|
||||||
def server.insert_metadata(~id="",s) =
|
def server.insert_metadata(~id="",s) =
|
||||||
|
@ -424,15 +426,15 @@ end
|
||||||
# @param ~conservative Always prepare for a premature end-of-track.
|
# @param ~conservative Always prepare for a premature end-of-track.
|
||||||
# @param ~default Transition used when no rule applies \
|
# @param ~default Transition used when no rule applies \
|
||||||
# (default: sequence).
|
# (default: sequence).
|
||||||
# @param ~high Value, in dB, for loud sound level
|
# @param ~high Value, in dB, for loud sound level.
|
||||||
# @param ~medium Value, in dB, for medium sound level
|
# @param ~medium Value, in dB, for medium sound level.
|
||||||
# @param ~margin Margin to detect sources that have too different \
|
# @param ~margin Margin to detect sources that have too different \
|
||||||
# sound level for crossing.
|
# sound level for crossing.
|
||||||
# @param s The input source.
|
# @param s The input source.
|
||||||
def smart_crossfade (~start_next=5.,~fade_in=3.,~fade_out=3.,
|
def smart_crossfade (~start_next=5.,~fade_in=3.,~fade_out=3.,
|
||||||
~default=(fun (a,b) -> sequence([a, b])),
|
~default=(fun (a,b) -> sequence([a, b])),
|
||||||
~high=-15., ~medium=-32., ~margin=4.,
|
~high=-15., ~medium=-32., ~margin=4.,
|
||||||
~width=2.,~conservative=false,s)
|
~width=2.,~conservative=true,s)
|
||||||
fade.out = fade.out(type="sin",duration=fade_out)
|
fade.out = fade.out(type="sin",duration=fade_out)
|
||||||
fade.in = fade.in(type="sin",duration=fade_in)
|
fade.in = fade.in(type="sin",duration=fade_in)
|
||||||
add = fun (a,b) -> add(normalize=false,[b, a])
|
add = fun (a,b) -> add(normalize=false,[b, a])
|
||||||
|
@ -549,7 +551,18 @@ def playlist.reloadable(~id="",~random=false,~on_done={()},uri)
|
||||||
if request.resolve(playlist) then
|
if request.resolve(playlist) then
|
||||||
playlist = request.filename(playlist)
|
playlist = request.filename(playlist)
|
||||||
files = playlist.parse(playlist)
|
files = playlist.parse(playlist)
|
||||||
list.map(snd,files)
|
def file_request(el) =
|
||||||
|
meta = fst(el)
|
||||||
|
file = snd(el)
|
||||||
|
s = list.fold(fun (cur, el) ->
|
||||||
|
"#{cur},#{fst(el)}=#{string.escape(snd(el))}", "", meta)
|
||||||
|
if s == "" then
|
||||||
|
file
|
||||||
|
else
|
||||||
|
"annotate:#{s}:#{file}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
list.map(file_request,files)
|
||||||
else
|
else
|
||||||
log(label=id,"Couldn't read playlist: request resolution failed.")
|
log(label=id,"Couldn't read playlist: request resolution failed.")
|
||||||
[]
|
[]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
%ifdef video.add_text.gd
|
%ifdef video.add_text.gd
|
||||||
# Add a scrolling line of text on video frames.
|
# Add a scrolling line of text on video frames.
|
||||||
|
# @category Source / Video Processing
|
||||||
# @param ~id Force the value of the source ID.
|
# @param ~id Force the value of the source ID.
|
||||||
# @param ~color Text color (in 0xRRGGBB format).
|
# @param ~color Text color (in 0xRRGGBB format).
|
||||||
# @param ~cycle Cycle text.
|
# @param ~cycle Cycle text.
|
||||||
|
@ -22,6 +23,7 @@ end
|
||||||
|
|
||||||
%ifdef video.add_text.sdl
|
%ifdef video.add_text.sdl
|
||||||
# Add a scrolling line of text on video frames.
|
# Add a scrolling line of text on video frames.
|
||||||
|
# @category Source / Video Processing
|
||||||
# @param ~id Force the value of the source ID.
|
# @param ~id Force the value of the source ID.
|
||||||
# @param ~color Text color (in 0xRRGGBB format).
|
# @param ~color Text color (in 0xRRGGBB format).
|
||||||
# @param ~cycle Cycle text.
|
# @param ~cycle Cycle text.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue