Files

1.8 KiB

racket-audio-dlna

racket-audio-dlna plays local audio files on UPnP/DLNA media renderers. It combines TagLib metadata from racket-audio with the HTTP server, DIDL-Lite support, and renderer controls from racket-upnp.

#lang racket/base

(require racket-audio-dlna
         racket-upnp)

(define renderer
  (get-media-renderer "Denon"))

(define player
  (make-dlna-player renderer))

(dlna-player-play!
 player
 "/muziek/radiohead/in-rainbows.flac")

(dlna-player-set-next-file!
 player
 "/muziek/radiohead/bodysnatchers.flac")

The constructor determines the local address used to reach the renderer and starts a media file server on port 8080. The address, port, and URL path can be overridden when required:

(make-dlna-player
 renderer
 #:listen-ip "10.7.3.108"
 #:port 8081
 #:path "/music/")

Controls

(dlna-player-pause! player)
(dlna-player-resume! player)
(dlna-player-seek! player 120)
(dlna-player-seek-percentage! player 50)
(dlna-player-volume! player 35)
(dlna-player-muted! player #t)
(dlna-player-stop! player)

dlna-player-info returns a cached snapshot:

(define info (dlna-player-info player))

(dlna-info-state info)
(dlna-info-position info)
(dlna-info-duration info)
(dlna-info-volume info)
(dlna-info-reachable? info)

Transport state and position are refreshed by a background thread. Position is advanced locally between polls. Volume and mute state use a slower cache. Commands update the cache immediately after the renderer accepts them.

Use #:refresh? #t for a synchronous refresh:

(dlna-player-info player #:refresh? #t)

Close the player when it is no longer needed:

(dlna-player-close! player)

Closing stops playback, removes published files, stops the web server, and terminates the polling thread.