132 lines
3.4 KiB
Racket
132 lines
3.4 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
|
|
(log! "!!! ao-placed-player: close")
|
|
(ao-close h)
|
|
(set! h #f)))
|
|
|
|
(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)
|
|
(close!)
|
|
(place-channel-put cmd-ch 'closed)]
|
|
|
|
[`(stop)
|
|
(close!)
|
|
(place-channel-put cmd-ch 'stopped)
|
|
(loop)]
|
|
|
|
[msg
|
|
(log! "unknown message: ~a" msg)
|
|
(loop)]))) |