logging added.
This commit is contained in:
+37
-6
@@ -3,12 +3,15 @@
|
|||||||
;; Stateful local-file player built on racket-audio metadata and racket-upnp.
|
;; Stateful local-file player built on racket-audio metadata and racket-upnp.
|
||||||
|
|
||||||
(require racket/file
|
(require racket/file
|
||||||
|
simple-log
|
||||||
racket/path
|
racket/path
|
||||||
racket/string
|
racket/string
|
||||||
racket/udp
|
racket/udp
|
||||||
racket-audio/taglib
|
racket-audio/taglib
|
||||||
racket-upnp)
|
racket-upnp)
|
||||||
|
|
||||||
|
(sl-def-log dlna-player)
|
||||||
|
|
||||||
(provide make-dlna-player
|
(provide make-dlna-player
|
||||||
dlna-player?
|
dlna-player?
|
||||||
dlna-player-play!
|
dlna-player-play!
|
||||||
@@ -105,7 +108,9 @@
|
|||||||
#f))
|
#f))
|
||||||
|
|
||||||
(define (read-track-info path)
|
(define (read-track-info path)
|
||||||
(with-handlers ([exn:fail? (lambda (_) (fallback-track-info path))])
|
(with-handlers ([exn:fail? (lambda (exception)
|
||||||
|
(warn-dlna-player "Could not read metadata for ~a: ~a" path (exn-message exception))
|
||||||
|
(fallback-track-info path))])
|
||||||
(call-with-id3-tags
|
(call-with-id3-tags
|
||||||
path
|
path
|
||||||
(lambda (tags)
|
(lambda (tags)
|
||||||
@@ -149,8 +154,12 @@
|
|||||||
(dlna-player-cache-lock player)
|
(dlna-player-cache-lock player)
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(hash-ref (dlna-player-metadata-cache player) key #f)))])
|
(hash-ref (dlna-player-metadata-cache player) key #f)))])
|
||||||
(or cached
|
(if cached
|
||||||
|
(begin
|
||||||
|
(dbg-dlna-player "Metadata cache hit for ~a" path)
|
||||||
|
cached)
|
||||||
(let ([info (read-track-info path)])
|
(let ([info (read-track-info path)])
|
||||||
|
(dbg-dlna-player "Metadata cache miss for ~a" path)
|
||||||
(call-with-semaphore
|
(call-with-semaphore
|
||||||
(dlna-player-cache-lock player)
|
(dlna-player-cache-lock player)
|
||||||
(lambda ()
|
(lambda ()
|
||||||
@@ -178,6 +187,7 @@
|
|||||||
(format "track-~a~a" number (file-extension path))))))
|
(format "track-~a~a" number (file-extension path))))))
|
||||||
|
|
||||||
(define (publish-track! player track)
|
(define (publish-track! player track)
|
||||||
|
(dbg-dlna-player "Publishing track file=~a title=~a" (dlna-track-info-file track) (dlna-track-info-title track))
|
||||||
(let* ([server (dlna-player-server player)]
|
(let* ([server (dlna-player-server player)]
|
||||||
[uri
|
[uri
|
||||||
(media-file-server-publish!
|
(media-file-server-publish!
|
||||||
@@ -189,6 +199,7 @@
|
|||||||
(with-handlers
|
(with-handlers
|
||||||
([exn:fail?
|
([exn:fail?
|
||||||
(lambda (exception)
|
(lambda (exception)
|
||||||
|
(err-dlna-player "Could not create DIDL-Lite metadata for ~a: ~a" uri (exn-message exception))
|
||||||
(media-file-server-unpublish! server uri)
|
(media-file-server-unpublish! server uri)
|
||||||
(raise exception))])
|
(raise exception))])
|
||||||
(publication
|
(publication
|
||||||
@@ -207,7 +218,10 @@
|
|||||||
|
|
||||||
(define (safe-unpublish! player item)
|
(define (safe-unpublish! player item)
|
||||||
(when item
|
(when item
|
||||||
(with-handlers ([exn:fail? (lambda (_) (void))])
|
(with-handlers ([exn:fail? (lambda (exception)
|
||||||
|
(warn-dlna-player "Could not unpublish ~a: ~a" (publication-uri item) (exn-message exception))
|
||||||
|
(void))])
|
||||||
|
(dbg-dlna-player "Unpublishing track URI ~a" (publication-uri item))
|
||||||
(media-file-server-unpublish!
|
(media-file-server-unpublish!
|
||||||
(dlna-player-server player)
|
(dlna-player-server player)
|
||||||
(publication-uri item)))))
|
(publication-uri item)))))
|
||||||
@@ -256,6 +270,7 @@
|
|||||||
(with-handlers
|
(with-handlers
|
||||||
([exn:fail?
|
([exn:fail?
|
||||||
(lambda (exception)
|
(lambda (exception)
|
||||||
|
(err-dlna-player "Renderer operation failed: ~a" (exn-message exception))
|
||||||
(set-reachable! player #f)
|
(set-reachable! player #f)
|
||||||
(raise exception))])
|
(raise exception))])
|
||||||
(let ([result
|
(let ([result
|
||||||
@@ -298,13 +313,17 @@
|
|||||||
(define (refresh-volume! player #:force? [force? #f])
|
(define (refresh-volume! player #:force? [force? #f])
|
||||||
(when (or force? (volume-refresh-due? player))
|
(when (or force? (volume-refresh-due? player))
|
||||||
(let ([renderer (dlna-player-renderer player)])
|
(let ([renderer (dlna-player-renderer player)])
|
||||||
(with-handlers ([exn:fail? (lambda (_) (void))])
|
(with-handlers ([exn:fail? (lambda (exception)
|
||||||
|
(warn-dlna-player "Could not refresh renderer volume: ~a" (exn-message exception))
|
||||||
|
(void))])
|
||||||
(let ([volume (media-renderer-volume renderer)])
|
(let ([volume (media-renderer-volume renderer)])
|
||||||
(update-cache!
|
(update-cache!
|
||||||
player
|
player
|
||||||
(lambda (info)
|
(lambda (info)
|
||||||
(struct-copy dlna-info info [volume volume])))))
|
(struct-copy dlna-info info [volume volume])))))
|
||||||
(with-handlers ([exn:fail? (lambda (_) (void))])
|
(with-handlers ([exn:fail? (lambda (exception)
|
||||||
|
(warn-dlna-player "Could not refresh renderer mute state: ~a" (exn-message exception))
|
||||||
|
(void))])
|
||||||
(let ([muted? (media-renderer-muted? renderer)])
|
(let ([muted? (media-renderer-muted? renderer)])
|
||||||
(update-cache!
|
(update-cache!
|
||||||
player
|
player
|
||||||
@@ -318,7 +337,8 @@
|
|||||||
(define (refresh-player! player #:force-volume? [force-volume? #f])
|
(define (refresh-player! player #:force-volume? [force-volume? #f])
|
||||||
(with-handlers
|
(with-handlers
|
||||||
([exn:fail?
|
([exn:fail?
|
||||||
(lambda (_)
|
(lambda (exception)
|
||||||
|
(warn-dlna-player "Could not refresh renderer state: ~a" (exn-message exception))
|
||||||
(set-reachable! player #f)
|
(set-reachable! player #f)
|
||||||
#f)])
|
#f)])
|
||||||
(call-with-semaphore
|
(call-with-semaphore
|
||||||
@@ -335,6 +355,7 @@
|
|||||||
[renderer-duration
|
[renderer-duration
|
||||||
(and position
|
(and position
|
||||||
(transport-position-duration position))])
|
(transport-position-duration position))])
|
||||||
|
(dbg-dlna-player "Renderer state=~a uri=~a position=~a duration=~a" state (or uri "") (or seconds "unknown") (or renderer-duration "unknown"))
|
||||||
(promote-or-clear-publications! player uri)
|
(promote-or-clear-publications! player uri)
|
||||||
(let* ([current (dlna-player-current player)]
|
(let* ([current (dlna-player-current player)]
|
||||||
[next (dlna-player-next player)]
|
[next (dlna-player-next player)]
|
||||||
@@ -429,6 +450,7 @@
|
|||||||
volume-poll-seconds))
|
volume-poll-seconds))
|
||||||
(let* ([local-address
|
(let* ([local-address
|
||||||
(or listen-ip (renderer-local-address renderer))]
|
(or listen-ip (renderer-local-address renderer))]
|
||||||
|
[_ (info-dlna-player "Creating DLNA player renderer=~a address=~a listen-ip=~a port=~a path=~a" (media-renderer-name renderer) (media-renderer-address renderer) local-address port path)]
|
||||||
[server
|
[server
|
||||||
(start-media-file-server
|
(start-media-file-server
|
||||||
(server-base-url local-address port path)
|
(server-base-url local-address port path)
|
||||||
@@ -458,6 +480,7 @@
|
|||||||
player))
|
player))
|
||||||
|
|
||||||
(define (dlna-player-play! player file)
|
(define (dlna-player-play! player file)
|
||||||
|
(info-dlna-player "Play requested file=~a" file)
|
||||||
(check-player 'dlna-player-play! player)
|
(check-player 'dlna-player-play! player)
|
||||||
(let* ([track (player-track-info 'dlna-player-play! player file)]
|
(let* ([track (player-track-info 'dlna-player-play! player file)]
|
||||||
[item (publish-track! player track)])
|
[item (publish-track! player track)])
|
||||||
@@ -501,6 +524,7 @@
|
|||||||
(void))))
|
(void))))
|
||||||
|
|
||||||
(define (dlna-player-set-next-file! player file)
|
(define (dlna-player-set-next-file! player file)
|
||||||
|
(info-dlna-player "Set next track requested file=~a" file)
|
||||||
(check-player 'dlna-player-set-next-file! player)
|
(check-player 'dlna-player-set-next-file! player)
|
||||||
(let* ([track
|
(let* ([track
|
||||||
(player-track-info
|
(player-track-info
|
||||||
@@ -537,6 +561,7 @@
|
|||||||
(void))))
|
(void))))
|
||||||
|
|
||||||
(define (dlna-player-pause! player)
|
(define (dlna-player-pause! player)
|
||||||
|
(info-dlna-player "Pause requested")
|
||||||
(check-player 'dlna-player-pause! player)
|
(check-player 'dlna-player-pause! player)
|
||||||
(let ([position (dlna-info-position (estimated-info player))])
|
(let ([position (dlna-info-position (estimated-info player))])
|
||||||
(call-renderer
|
(call-renderer
|
||||||
@@ -554,6 +579,7 @@
|
|||||||
(void)))
|
(void)))
|
||||||
|
|
||||||
(define (dlna-player-resume! player)
|
(define (dlna-player-resume! player)
|
||||||
|
(info-dlna-player "Resume requested")
|
||||||
(check-player 'dlna-player-resume! player)
|
(check-player 'dlna-player-resume! player)
|
||||||
(call-renderer
|
(call-renderer
|
||||||
player
|
player
|
||||||
@@ -567,6 +593,7 @@
|
|||||||
(void))
|
(void))
|
||||||
|
|
||||||
(define (dlna-player-stop! player)
|
(define (dlna-player-stop! player)
|
||||||
|
(info-dlna-player "Stop requested")
|
||||||
(check-player 'dlna-player-stop! player)
|
(check-player 'dlna-player-stop! player)
|
||||||
(call-renderer
|
(call-renderer
|
||||||
player
|
player
|
||||||
@@ -583,6 +610,7 @@
|
|||||||
(void))
|
(void))
|
||||||
|
|
||||||
(define (dlna-player-seek! player seconds)
|
(define (dlna-player-seek! player seconds)
|
||||||
|
(info-dlna-player "Seek requested seconds=~a" seconds)
|
||||||
(check-player 'dlna-player-seek! player)
|
(check-player 'dlna-player-seek! player)
|
||||||
(unless (and (rational? seconds) (not (negative? seconds)))
|
(unless (and (rational? seconds) (not (negative? seconds)))
|
||||||
(raise-argument-error 'dlna-player-seek!
|
(raise-argument-error 'dlna-player-seek!
|
||||||
@@ -622,6 +650,7 @@
|
|||||||
(* duration (/ (min 100 (max 0 percentage)) 100.0)))))
|
(* duration (/ (min 100 (max 0 percentage)) 100.0)))))
|
||||||
|
|
||||||
(define (dlna-player-volume! player percentage)
|
(define (dlna-player-volume! player percentage)
|
||||||
|
(info-dlna-player "Volume requested percentage=~a" percentage)
|
||||||
(check-player 'dlna-player-volume! player)
|
(check-player 'dlna-player-volume! player)
|
||||||
(unless (rational? percentage)
|
(unless (rational? percentage)
|
||||||
(raise-argument-error 'dlna-player-volume! "real?" percentage))
|
(raise-argument-error 'dlna-player-volume! "real?" percentage))
|
||||||
@@ -646,6 +675,7 @@
|
|||||||
(void)))
|
(void)))
|
||||||
|
|
||||||
(define (dlna-player-muted! player muted?)
|
(define (dlna-player-muted! player muted?)
|
||||||
|
(info-dlna-player "Mute requested muted?=~a" muted?)
|
||||||
(check-player 'dlna-player-muted! player)
|
(check-player 'dlna-player-muted! player)
|
||||||
(unless (boolean? muted?)
|
(unless (boolean? muted?)
|
||||||
(raise-argument-error 'dlna-player-muted! "boolean?" muted?))
|
(raise-argument-error 'dlna-player-muted! "boolean?" muted?))
|
||||||
@@ -673,6 +703,7 @@
|
|||||||
(unless (dlna-player? player)
|
(unless (dlna-player? player)
|
||||||
(raise-argument-error 'dlna-player-close! "dlna-player?" player))
|
(raise-argument-error 'dlna-player-close! "dlna-player?" player))
|
||||||
(when (dlna-player-running? player)
|
(when (dlna-player-running? player)
|
||||||
|
(info-dlna-player "Closing DLNA player")
|
||||||
(set-dlna-player-running?! player #f)
|
(set-dlna-player-running?! player #f)
|
||||||
(let ([poll-thread (dlna-player-poll-thread player)])
|
(let ([poll-thread (dlna-player-poll-thread player)])
|
||||||
(when poll-thread
|
(when poll-thread
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#lang info
|
#lang info
|
||||||
|
|
||||||
(define pkg-authors '(hnmdijkema))
|
(define pkg-authors '(hnmdijkema))
|
||||||
(define version "0.1.1")
|
(define version "0.1.2")
|
||||||
(define license 'GPL-2.0-or-later)
|
(define license 'GPL-2.0-or-later)
|
||||||
(define collection "racket-audio-dlna")
|
(define collection "racket-audio-dlna")
|
||||||
(define pkg-desc
|
(define pkg-desc
|
||||||
@@ -10,8 +10,9 @@
|
|||||||
(define deps
|
(define deps
|
||||||
'("base"
|
'("base"
|
||||||
"net-lib"
|
"net-lib"
|
||||||
|
"simple-log"
|
||||||
"racket-audio"
|
"racket-audio"
|
||||||
("racket-upnp" #:version "0.1.3")))
|
("racket-upnp" #:version "0.1.4")))
|
||||||
|
|
||||||
(define build-deps
|
(define build-deps
|
||||||
'("racket-doc"
|
'("racket-doc"
|
||||||
|
|||||||
Reference in New Issue
Block a user