This commit is contained in:
2026-04-06 12:31:17 +02:00
6 changed files with 58 additions and 25 deletions

View File

@@ -94,7 +94,7 @@
(set-ao-shm-bufsize! shm (- bs buf-len))) (set-ao-shm-bufsize! shm (- bs buf-len)))
(mutex-unlock (ao-shm-mutex shm)) (mutex-unlock (ao-shm-mutex shm))
(ao_play ao-device buf buf-len) ; Play this buffer part (ao_play ao-device buf buf-len) ; Play this buffer part
(free buf) ; Free the previously malloc 'raw (see libao.rkt) ;(free buf) ; Free the previously malloc 'raw (see libao.rkt)
)] )]
) )
(player) (player)
@@ -185,9 +185,10 @@
(let ((q (ao-shm-queue shm))) (let ((q (ao-shm-queue shm)))
(while (> (queue-length q) 0) (while (> (queue-length q) 0)
;(displayln (format "queue-length: ~a" (queue-length q))) ;(displayln (format "queue-length: ~a" (queue-length q)))
(let* ((elem (dequeue! q)) ;(let* ((elem (dequeue! q))
(buf (car (cddddr elem)))) ;(buf (car (cddddr elem))))
(free buf)))) ;(free buf))))
(dequeue! q)))
(set-ao-shm-queue! shm (make-queue)) (set-ao-shm-queue! shm (make-queue))
(set-ao-shm-bufsize! shm 0) (set-ao-shm-bufsize! shm 0)
) )

View File

@@ -68,7 +68,7 @@
(define-libao ao_close (_fun _libao-pointer -> _int)) (define-libao ao_close (_fun _libao-pointer -> _int))
; void ao_shutdown(); ; void ao_shutdown();
(define-libao ao_shutdown (_fun -> _int)) (define-libao ao_shutdown (_fun -> _void))
; int ao_append_option(ao_option **options, const char *key, const char *value); ; int ao_append_option(ao_option **options, const char *key, const char *value);
(define-libao ao_append_option (_fun _pointer _pointer _pointer -> _int)) (define-libao ao_append_option (_fun _pointer _pointer _pointer -> _int))

View File

@@ -55,8 +55,10 @@
(lambda (my-handle) (lambda (my-handle)
(hash-for-each devices (hash-for-each devices
(lambda (handle-num device) (lambda (handle-num device)
(displayln (format "closing ao handle ~a" handle-num))
(ao-close handle-num))) (ao-close handle-num)))
(set! devices (make-hash)) (set! devices (make-hash))
(displayln "shutting down ao")
(ao_shutdown) (ao_shutdown)
(plumber-flush-handle-remove! my-handle) (plumber-flush-handle-remove! my-handle)
))) )))
@@ -154,11 +156,16 @@
(if (number? handle) (if (number? handle)
(let ((ao-device (hash-ref devices handle #f))) (let ((ao-device (hash-ref devices handle #f)))
(close-device #f ao-device)) (unless (eq? ao-device #f)
(displayln (format "Closing ao device ~a" ao-device))
(close-device #f ao-device)
(hash-remove! devices handle)))
(let ((handle-num (ao-handle-handle-num handle))) (let ((handle-num (ao-handle-handle-num handle)))
(let ((ao-device (hash-ref devices handle-num #f))) (let ((ao-device (hash-ref devices handle-num #f)))
(displayln (format "ao-device = ~a" ao-device)) (unless (eq? ao-device #f)
(close-device handle ao-device)) (displayln (format "ao-device = ~a" ao-device))
(close-device handle ao-device)
(hash-remove! devices handle-num)))
) )
) )
) )
@@ -187,7 +194,7 @@
(audio-buf-len (* channels bytes-per-sample buf-len)) (audio-buf-len (* channels bytes-per-sample buf-len))
(audio (if (eq? libao-async-mode 'ffi) (audio (if (eq? libao-async-mode 'ffi)
(malloc 'atomic audio-buf-len) (malloc 'atomic audio-buf-len)
(malloc 'raw audio-buf-len))) (malloc 'atomic audio-buf-len))) ; was: 'raw
(get-sample (lambda (k channel) (get-sample (lambda (k channel)
(let ((chan-buf (list-ref buffer channel))) (let ((chan-buf (list-ref buffer channel)))
(vector-ref chan-buf k)))) (vector-ref chan-buf k))))

View File

@@ -402,7 +402,8 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define _FLAC__StreamDecoder-pointer (_cpointer 'flac-streamdecoder)) (define _FLAC__StreamDecoder-pointer (_cpointer 'flac-streamdecoder))
(define _FLAC__Data-pointer (_cpointer 'flac-client-data)) (define _FLAC__Data-pointer (_cpointer/null 'flac-client-data))
;(define _FLAC__StreamMetadata-pointer (_cpointer/null 'flac-stream-metadata))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FLAC Callback function definitions ;; FLAC Callback function definitions
@@ -414,18 +415,21 @@
(_fun _FLAC__StreamDecoder-pointer (_fun _FLAC__StreamDecoder-pointer
_FLAC__Frame-pointer _FLAC__Frame-pointer
FLAC__int32** FLAC__int32**
_FLAC__Data-pointer -> _int)) _FLAC__Data-pointer
-> _int))
;typedef void(* FLAC__StreamDecoderMetadataCallback) (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) ;typedef void(* FLAC__StreamDecoderMetadataCallback) (const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
(define _FLAC__StreamDecoderMetadataCallback (define _FLAC__StreamDecoderMetadataCallback
(_fun _FLAC__StreamDecoder-pointer (_fun _FLAC__StreamDecoder-pointer
_FLAC__StreamMetadata-pointer _FLAC__StreamMetadata-pointer
_FLAC__Data-pointer -> _void)) _FLAC__Data-pointer
-> _void))
(define _FLAC__StreamDecoderErrorCallback (define _FLAC__StreamDecoderErrorCallback
(_fun _FLAC__StreamDecoder-pointer (_fun _FLAC__StreamDecoder-pointer
_int _int
_FLAC__Data-pointer -> _void)) _FLAC__Data-pointer
-> _void))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -464,6 +468,7 @@
_FLAC__StreamDecoderWriteCallback _FLAC__StreamDecoderWriteCallback
_FLAC__StreamDecoderMetadataCallback _FLAC__StreamDecoderMetadataCallback
_FLAC__StreamDecoderErrorCallback _FLAC__StreamDecoderErrorCallback
_FLAC__Data-pointer ; Seen by Jens Axel Søgaard - Is already present in FLAC 1.4.3
-> _int)) -> _int))
(define-libflac FLAC__stream_decoder_process_single (define-libflac FLAC__stream_decoder_process_single
@@ -478,6 +483,16 @@
(_fun _FLAC__StreamDecoder-pointer FLAC__uint64 (_fun _FLAC__StreamDecoder-pointer FLAC__uint64
-> _bool)) -> _bool))
;FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object);
(define-libflac FLAC__metadata_object_clone
(_fun _FLAC__StreamMetadata-pointer
-> _FLAC__StreamMetadata-pointer))
;FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object);
(define-libflac FLAC__metadata_object_delete
(_fun _FLAC__StreamMetadata-pointer
-> _void))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Our interface for decoding to racket ;; Our interface for decoding to racket
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -488,15 +503,18 @@
(define error-no -1) (define error-no -1)
(define fl #f) (define fl #f)
(define flac-file #f) (define flac-file #f)
(define client-data #f)
(define (write-callback fl frame buffer data) (define (write-callback fl frame buffer client-data)
(set! write-data (append write-data (list (cons frame buffer)))) (set! write-data (append write-data (list (cons frame buffer))))
0) 0)
(define (meta-callback fl meta data) (define (meta-callback fl meta client-data)
(set! meta-data (append meta-data (list meta)))) (let ((meta-clone (FLAC__metadata_object_clone meta)))
(unless (eq? meta-clone #f)
(set! meta-data (append meta-data (list meta-clone))))))
(define (error-callback fl errno data) (define (error-callback fl errno client-data)
(set! error-no errno) (set! error-no errno)
) )
@@ -506,11 +524,12 @@
(define (init file) (define (init file)
(let ((r (FLAC__stream_decoder_init_file (let ((r (FLAC__stream_decoder_init_file
fl fl
file file
write-callback write-callback
meta-callback meta-callback
error-callback))) error-callback
client-data)))
(set! flac-file file) (set! flac-file file)
r)) r))
@@ -524,7 +543,10 @@
(decoder-state (int-state))) (decoder-state (int-state)))
(define (process-meta-data cb) (define (process-meta-data cb)
(for-each cb meta-data) (for-each (λ (meta-entry)
(cb meta-entry)
(FLAC__metadata_object_delete meta-entry))
meta-data)
(set! meta-data '())) (set! meta-data '()))
(define (process-write-data cb) (define (process-write-data cb)

View File

@@ -15,6 +15,7 @@
) )
) )
(ao-set-async-mode! 'ffi)
;(define fmt (ao-mk-format 24 48000 2 'big-endian)) ;(define fmt (ao-mk-format 24 48000 2 'big-endian))
;(define ao-h (ao-open-live #f fmt)) ;(define ao-h (ao-open-live #f fmt))
@@ -34,7 +35,7 @@
(when (eq? ao-h #f) (when (eq? ao-h #f)
(let ((fmt (ao-mk-format bits-per-sample rate channels 'big-endian))) (let ((fmt (ao-mk-format bits-per-sample rate channels 'big-endian)))
(set! ao-h (ao-open-live #f fmt)))) (set! ao-h (ao-open-live #f fmt))))
(ao-play ao-h second buffer) (ao-play ao-h second duration buffer)
(let ((second-printer (λ () (let ((second-printer (λ ()
(let ((s (inexact->exact (round (ao-at-second ao-h))))) (let ((s (inexact->exact (round (ao-at-second ao-h)))))
(unless (= s current-seconds) (unless (= s current-seconds)

View File

@@ -67,7 +67,9 @@
(disc-number -1) (disc-number -1)
(picture #f)) (picture #f))
(let ((tag-file (taglib_file_new file))) (let ((tag-file (taglib_file_new file)))
(set! valid? (taglib_file_is_valid tag-file)) (if (eq? tag-file #f)
(set! valid? #f)
(set! valid? (taglib_file_is_valid tag-file)))
(when valid? (when valid?
(let ((tag (taglib_file_tag tag-file)) (let ((tag (taglib_file_tag tag-file))
(ap (taglib_file_audioproperties tag-file)) (ap (taglib_file_audioproperties tag-file))