88 lines
3.0 KiB
Racket
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))
|