Files
gemigreerd-racket-audio/ao-placed-player.rkt
T
2026-05-12 15:12:03 +02:00

137 lines
3.6 KiB
Racket

#lang racket/base
(require racket/place
racket/match
"libao.rkt")
(provide ao-placed-player-main)
(define (closed-status)
(hash 'open? #f
'valid? #f
'at-second 0.0
'duration 0.0
'music-id 0
'buf-size 0
'reuse-buf-len 0
'sample-queue-len 0
'volume 100.0
'device-bits 0))
(define (handle-status h)
(if (and h (ao-valid? h))
(hash 'open? #t
'valid? #t
'at-second (ao-at-second h)
'duration (ao-music-duration h)
'music-id (ao-at-music-id h)
'buf-size (ao-bufsize-async h)
'reuse-buf-len (ao-reuse-buf-len-async h)
'sample-queue-len (ao-sample-queue-len-async h)
'volume (ao-volume h)
'device-bits (ao-device-bits h))
(closed-status)))
(define (ao-placed-player-main cmd-ch)
;; First message must provide the log channel.
(define log-ch (place-channel-get cmd-ch))
(define (log! fmt . args)
(place-channel-put log-ch (apply format fmt args)))
(log! "!!! ao-placed-player: started")
(define h #f)
(define (close!)
(when h
(let ((old-h h))
(set! h #f)
(log! "closing ao handle")
(when (ao-valid? old-h)
(ao-close old-h))
(log! "ao handle closed"))))
(place-channel-put cmd-ch 'started)
(let loop ()
(match (place-channel-get cmd-ch)
[`(open-file ,bits ,rate ,channels ,endianness ,wav-output-file)
(log! "!!! open-file bits=~a rate=~a channels=~a endian=~a file=~a"
bits rate channels endianness wav-output-file)
(close!)
(set! h (ao-open-file bits rate channels endianness wav-output-file))
(place-channel-put
cmd-ch
(if (and h (ao-valid? h))
(hash 'ok? #t 'device-bits (ao-device-bits h))
(hash 'ok? #f 'device-bits 0)))
(loop)]
[`(open-live ,bits ,rate ,channels ,endianness)
(log! "!!! open-live bits=~a rate=~a channels=~a endian=~a"
bits rate channels endianness)
(close!)
(set! h (ao-open-live bits rate channels endianness))
(place-channel-put
cmd-ch
(if (and h (ao-valid? h))
(hash 'ok? #t 'device-bits (ao-device-bits h))
(hash 'ok? #f 'device-bits 0)))
(loop)]
[`(play ,music-id ,second ,duration ,buffer ,buf-len ,ao-type)
(when (and h (ao-valid? h))
(ao-play h music-id second duration buffer buf-len ao-type))
(loop)]
[`(clear)
(log! "clear")
(when (and h (ao-valid? h))
(ao-clear-async h))
(loop)]
[`(pause ,paused?)
(log! "pause ~a" paused?)
(when (and h (ao-valid? h))
(ao-pause h paused?))
(loop)]
[`(set-volume ,volume)
(log! "set-volume ~a" volume)
(when (and h (ao-valid? h))
(ao-set-volume! h volume))
(loop)]
[`(status)
(place-channel-put cmd-ch (handle-status h))
(loop)]
[`(valid?)
(place-channel-put cmd-ch (and h (ao-valid? h)))
(loop)]
[`(playback-buf-ms)
(place-channel-put cmd-ch (ao-playback-buf-ms))
(loop)]
[`(set-playback-buf-ms ,ms)
(ao-set-playback-buf-ms! ms)
(place-channel-put cmd-ch 'ok)
(loop)]
[`(close)
(log! "!!! close received")
(close!)
(place-channel-put cmd-ch 'closed)]
[`(stop)
(log! "!!! stop received")
(close!)
(place-channel-put cmd-ch 'stopped)
(loop)]
[msg
(log! "unknown message: ~a" msg)
(loop)])))