Files
racket-upnp/services/rendering-control.rkt
T
2026-07-15 18:00:11 +02:00

88 lines
3.0 KiB
Racket

#lang racket/base
;; Typed interface for the UPnP RenderingControl service.
(require "../service.rkt")
(provide rendering-control?
device-rendering-control
rendering-control-volume
rendering-control-set-volume!
rendering-control-muted?
rendering-control-set-muted!)
(define (rendering-control? value)
(and (upnp-service? value)
(eq? (upnp-service-kind value) 'rendering-control)))
(define (check-rendering-control who value)
(unless (rendering-control? value)
(raise-argument-error who "rendering-control?" value)))
(define (device-rendering-control device)
(upnp-device-service device 'rendering-control))
(define (result-ref result name [default #f])
(hash-ref result name default))
(define (upnp-boolean value)
(and value
(or (string=? value "1")
(string-ci=? value "true")
(string-ci=? value "yes"))))
(define (rendering-control-volume control
#:channel [channel "Master"]
#:instance-id [instance-id 0])
(check-rendering-control 'rendering-control-volume control)
(let* ([result
(upnp-service-call
control
"GetVolume"
(list (cons "InstanceID" instance-id)
(cons "Channel" channel)))]
[volume (result-ref result "CurrentVolume" #f)])
(and volume (string->number volume))))
(define (rendering-control-set-volume! control volume
#:channel [channel "Master"]
#:instance-id [instance-id 0])
(check-rendering-control 'rendering-control-set-volume! control)
(unless (and (exact-integer? volume) (<= 0 volume 65535))
(raise-argument-error 'rendering-control-set-volume!
"(integer-in 0 65535)"
volume))
(upnp-service-call
control
"SetVolume"
(list (cons "InstanceID" instance-id)
(cons "Channel" channel)
(cons "DesiredVolume" volume)))
(void))
(define (rendering-control-muted? control
#:channel [channel "Master"]
#:instance-id [instance-id 0])
(check-rendering-control 'rendering-control-muted? control)
(let ([result
(upnp-service-call
control
"GetMute"
(list (cons "InstanceID" instance-id)
(cons "Channel" channel)))])
(upnp-boolean (result-ref result "CurrentMute" #f))))
(define (rendering-control-set-muted! control muted?
#:channel [channel "Master"]
#:instance-id [instance-id 0])
(check-rendering-control 'rendering-control-set-muted! control)
(unless (boolean? muted?)
(raise-argument-error 'rendering-control-set-muted! "boolean?" muted?))
(upnp-service-call
control
"SetMute"
(list (cons "InstanceID" instance-id)
(cons "Channel" channel)
(cons "DesiredMute" muted?)))
(void))