asteroid/cl-streamer
Glenn Thompson fcda723577 feat: Broadcast buffer, sequential playlist, ICY metadata
- Broadcast buffer: single-producer multi-consumer ring buffer with
  per-client read cursors. 32KB burst-on-connect for fast playback.
  Never blocks producer (overwrites old data for slow clients).
- Sequential playlist: play-list runs tracks one at a time using
  Harmony's on-end callback + condition variable for completion.
- ICY metadata: set-now-playing called on each track change.
- Fixed string vs pathname bug in harmony:play (etypecase mismatch).
- Debug logging for client disconnect diagnosis.

Verified: browser plays shuffled FLAC playlist via 128kbps MP3 stream.
2026-03-03 18:15:31 +03:00
..
README.org feat: Add Harmony backend with dummy drain for streaming pipeline 2026-03-03 16:56:24 +03:00
aac-encoder.lisp feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
buffer.lisp feat: Broadcast buffer, sequential playlist, ICY metadata 2026-03-03 18:15:31 +03:00
cl-streamer.asd feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
cl-streamer.lisp feat: Initial cl-streamer skeleton for CL-native streaming 2026-03-03 16:30:49 +03:00
conditions.lisp feat: Initial cl-streamer skeleton for CL-native streaming 2026-03-03 16:30:49 +03:00
encoder.lisp feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
fdkaac-ffi.lisp feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
harmony-backend.lisp feat: Broadcast buffer, sequential playlist, ICY metadata 2026-03-03 18:15:31 +03:00
icy-protocol.lisp feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
lame-ffi.lisp feat: Add MP3 and AAC encoder FFI bindings 2026-03-03 16:46:29 +03:00
package.lisp feat: Broadcast buffer, sequential playlist, ICY metadata 2026-03-03 18:15:31 +03:00
stream-server.lisp feat: Broadcast buffer, sequential playlist, ICY metadata 2026-03-03 18:15:31 +03:00
test-stream.lisp feat: Broadcast buffer, sequential playlist, ICY metadata 2026-03-03 18:15:31 +03:00

README.org

CL-Streamer

Overview

CL-Streamer is a Common Lisp audio streaming server designed to replace Icecast and Liquidsoap in the Asteroid Radio project.

Status

EXPERIMENTAL - This is an early proof-of-concept.

Features

  • HTTP streaming with ICY metadata protocol
  • Multiple mount points
  • Thread-safe ring buffers for audio data
  • Listener statistics

Dependencies

  • alexandria
  • bordeaux-threads
  • usocket
  • flexi-streams
  • chunga
  • log4cl
  • split-sequence

Optional (for audio backend):

  • harmony
  • cl-mixed
  • cl-mixed-mpg123

Quick Start

(ql:quickload :cl-streamer)

;; Create and start server
(cl-streamer:start :port 8000)

;; Add a mount point
(cl-streamer:add-mount cl-streamer:*server* "/stream.mp3"
                       :content-type "audio/mpeg"
                       :bitrate 128
                       :name "Asteroid Radio")

;; Update now-playing metadata
(cl-streamer:set-now-playing "/stream.mp3" "Artist - Track Title")

;; Write audio data (from encoder)
(cl-streamer:write-audio-data "/stream.mp3" encoded-mp3-bytes)

;; Check listeners
(cl-streamer:get-listener-count)

;; Stop server
(cl-streamer:stop)

Architecture

See docs/CL-STREAMING-ARCHITECTURE.org for the full design document.

License

AGPL-3.0