82 lines
1.8 KiB
Markdown
82 lines
1.8 KiB
Markdown
# 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`.
|
|
|
|
```racket
|
|
#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:
|
|
|
|
```racket
|
|
(make-dlna-player
|
|
renderer
|
|
#:listen-ip "10.7.3.108"
|
|
#:port 8081
|
|
#:path "/music/")
|
|
```
|
|
|
|
## Controls
|
|
|
|
```racket
|
|
(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:
|
|
|
|
```racket
|
|
(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:
|
|
|
|
```racket
|
|
(dlna-player-info player #:refresh? #t)
|
|
```
|
|
|
|
Close the player when it is no longer needed:
|
|
|
|
```racket
|
|
(dlna-player-close! player)
|
|
```
|
|
|
|
Closing stops playback, removes published files, stops the web server, and
|
|
terminates the polling thread.
|