#lang racket/base (require rackunit racket/file racket/tcp racket-upnp racket-upnp/private/model "../main.rkt") (define (available-port) (let ((listener (tcp-listen 0 4 #t "127.0.0.1"))) (let-values (((_local-host port _remote-host _remote-port) (tcp-addresses listener #t))) (tcp-close listener) port))) (define (test-renderer id) (upnp-device id "urn:schemas-upnp-org:device:MediaRenderer:1" "Test renderer" "Test" "Test" "1" #f "http://127.0.0.1/device.xml" "127.0.0.1" #f '() '() (hash))) (define port (available-port)) (define file (make-temporary-file "racket-audio-dlna-shared-~a.flac")) (define server #f) (define first-player #f) (define second-player #f) (dynamic-wind (λ () (call-with-output-file file #:exists 'truncate (λ (output) (write-bytes #"test audio" output))) (set! server (start-media-file-server (format "http://127.0.0.1:~a/media/" port) #:listen-ip "127.0.0.1")) (set! first-player (make-dlna-player (test-renderer "uuid:first") #:media-file-server server #:listen-ip "127.0.0.1" #:poll-seconds 60)) (set! second-player (make-dlna-player (test-renderer "uuid:second") #:media-file-server server #:listen-ip "127.0.0.1" #:poll-seconds 60))) (λ () (dlna-player-close! first-player) (set! first-player #f) (define first-uri (media-file-server-publish! server file "after-first.flac")) (check-true (string? first-uri)) (media-file-server-unpublish! server first-uri) (dlna-player-close! second-player) (set! second-player #f) (define second-uri (media-file-server-publish! server file "after-second.flac")) (check-true (string? second-uri)) (media-file-server-unpublish! server second-uri)) (λ () (when first-player (dlna-player-close! first-player)) (when second-player (dlna-player-close! second-player)) (when server (media-file-server-stop! server)) (when (file-exists? file) (delete-file file))))