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.