savonet / liquidsoap

Liquidsoap is a statically typed scripting general-purpose language with dedicated operators and backend for all thing media, streaming, file generation, automation, HTTP backend and more.
http://liquidsoap.info
GNU General Public License v2.0
1.39k stars 128 forks source link

Dummy outputs leak? #3541

Closed Parakovsky closed 10 months ago

Parakovsky commented 10 months ago

Describe the bug I think I have dummy outputs leak, if Allowing replaygain my system start produce dummy outputs each time it encounters weird errors like this one `

Decoding "/storage/Audio/James Holden - Imagine This Is A High Dimensional Space Of All Possibilities (2023) - WEB FLAC 24-48/01. You Are In A Clearing.flac" ended: Ffmpeg_decoder.End_of_file.`

It happens only for replaygain function available, it looks like this on the tellnet:

Available commands:
| Audio.next
| Audio.reload
| Audio.skip
| Audio.uri [<uri>]
| dummy.10.metadata
| dummy.10.remaining
| dummy.10.skip
| dummy.11.metadata
| dummy.11.remaining
| dummy.11.skip
| dummy.12.metadata
| dummy.12.remaining
| dummy.12.skip
| dummy.13.metadata
| dummy.13.remaining
| dummy.13.skip
| dummy.14.metadata
| dummy.14.remaining
| dummy.14.skip
| dummy.15.metadata
| dummy.15.remaining
| dummy.15.skip
| dummy.16.metadata
| dummy.16.remaining
| dummy.16.skip
| dummy.2.metadata
| dummy.2.remaining
| dummy.2.skip
| dummy.3.metadata
| dummy.3.remaining
| dummy.3.skip
| dummy.4.metadata
| dummy.4.remaining
| dummy.4.skip
| dummy.5.metadata
| dummy.5.remaining
| dummy.5.skip
| dummy.6.metadata
| dummy.6.remaining
| dummy.6.skip
| dummy.7.metadata
| dummy.7.remaining
| dummy.7.skip
| dummy.8.metadata
| dummy.8.remaining
| dummy.8.skip
| dummy.9.metadata
| dummy.9.remaining
| dummy.9.skip
| dummy.metadata
| dummy.remaining
| dummy.skip
| exit
| help [<command>]
| input.harbor.buffer_length
| input.harbor.status
| input.harbor.stop
| liq_ogg.metadata
| liq_ogg.remaining
| liq_ogg.skip
| quit
| request.alive
| request.all
| request.flush_and_skip
| request.metadata <rid>
| request.on_air
| request.push <uri>
| request.queue
| request.resolving
| request.skip
| request.trace <rid>
| uptime
| var.get
| var.list
| var.set <name> = <value>
| version

To Reproduce Here is my setup:

#!/home/parakovsky/.opam/default/bin/liquidsoap

settings.server.telnet := true
server.harbor()
# interactive.harbor()
# 
enable_replaygain_metadata()

# Main

# x = playlist("/home/parakovsky/to-play.m3u", reload_mode="watch")
s = replaygain(playlist(reload_mode="watch", "/storage/Audio"))
# LIVE DJ SET INTERRUPTION
live = input.harbor("tuziknet", port=8090, password="DJ4")
settings.harbor.bind_addrs := ["0.0.0.0"]
s = fallback (track_sensitive=false, [live, request.queue(id="request"), s])
s = crossfade(smart=true, s)

# OUTPUTS AND STUFF

# s = fallback([ request.queue(id="request"),
                    # s])

# mic = input.pulseaudio(device = "alsa_card.usb-Samson_Technologies_Samson_Meteor_Mic-00")
# mic = blank.strip(max_blank=2., min_noise=.1, threshold=-20., mic)

output.icecast(%ogg(%flac), 
     host = "localhost", port = 8030, fallible=true,
     password = "DjCreative1822", format = "audio/ogg", mount = "liq.ogg", s)

# output.file.hls("/tmp/hls", fallible=true,
# [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))],
# s)

# output.icecast(%vorbis(samplerate=44100, channels=2, quality=0.9),
# host = "localhost", port = 8030, fallible=true,
# password = "DjCreati22", format = "audio/ogg", mount = "lossy.ogg", s)

# output.dummy(s)

# a = source.mux.video(video=mksafe(video.cover(s)), s)

# TWITCH STREAM

# key = string.trim(file.contents("twitch-key"))
# url = "rtmp://hel03.contribute.live-video.net/app/#{key}"
# enc = %ffmpeg(format="flv",
# %audio(codec="libmp3lame", samplerate=44100, b="320k"),
# %video(codec="libx264", width=854, height=480,
# b="800k", g=50, preset="veryfast"))
# output.url(fallible=true, url=url, enc, a)

Expected behavior I would like to not have this dummy devices clogging my help output.

Version details Everything updated on Arch.

Install method OPAM

Common issues My common issue is to think that liquidsoap is too awesome.

vitoyucepi commented 10 months ago

I can confirm this behavior. With each new track, the dummy is registered to calculate the replay gain.

  1. Generate tracks
    mkdir music;
    for i in $(seq 1 9); do
     ffmpeg \
       -f lavfi -i "sine=frequency=${i}00:duration=10" \
       -c:a libmp3lame -b:a 128k \
       "music/$i.mp3";
    done
  2. main.liq

    enable_replaygain_metadata()
    
    s = playlist("/tmp/test/music")
    s = replaygain(s)
    output.dummy(s, fallible=true)

You don't even need to connect to the telnet server to see the growing number of dummy ids in the log.

[decoder.ffmpeg:3] Requested content-type for "/tmp/test/music/8.mp3": {audio=pcm(stereo)}
[decoder.ffmpeg:3] FFmpeg recognizes "/tmp/test/music/8.mp3" as audio: {codec: mp3, 44100Hz, 1 channel(s)} 
[decoder.ffmpeg:3] Decoded content-type for "/tmp/test/music/8.mp3": {audio=pcm(mono)}
[file.replaygain.70:3] Computing replay gain for "/tmp/test/music/8.mp3"
[dummy.71:3] Content type is {audio=pcm(stereo)}.
[source.replaygain.compute.70:3] Content type is {audio=pcm(stereo)}.
[request.once.70:3] Content type is {audio=pcm(stereo)}.
[decoder.ffmpeg:3] Requested content-type for "/tmp/test/music/8.mp3": {audio=pcm(stereo)}
[decoder.ffmpeg:3] FFmpeg recognizes "/tmp/test/music/8.mp3" as audio: {codec: mp3, 44100Hz, 1 channel(s)} 
[decoder.ffmpeg:3] Decoded content-type for "/tmp/test/music/8.mp3": {audio=pcm(mono)}
[request.once.70:3] Prepared "/tmp/test/music/8.mp3" (RID 139).
[decoder:2] Decoding "/tmp/test/music/8.mp3" ended: Ffmpeg_decoder.End_of_file.
[dummy.71:3] Source failed (no more tracks) stopping output... 
[file.replaygain.70:3] Computed replay gain 7.12 dB for "/tmp/test/music/8.mp3" (time: 0.306236982346 s).