From c2ef8bcc996d5138f6b76e42a83703302da8ea4d Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 15:53:58 +0100 Subject: [PATCH 1/8] - --- libao/libao-ffi.rkt | 2 +- libflac/libflac-ffi.rkt | 30 ++++++++++++++++++------------ play-test.rkt | 3 ++- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/libao/libao-ffi.rkt b/libao/libao-ffi.rkt index c37c1c8..6688176 100644 --- a/libao/libao-ffi.rkt +++ b/libao/libao-ffi.rkt @@ -68,7 +68,7 @@ (define-libao ao_close (_fun _libao-pointer -> _int)) ; 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); (define-libao ao_append_option (_fun _pointer _pointer _pointer -> _int)) diff --git a/libflac/libflac-ffi.rkt b/libflac/libflac-ffi.rkt index 677e4f3..d5b5020 100644 --- a/libflac/libflac-ffi.rkt +++ b/libflac/libflac-ffi.rkt @@ -402,7 +402,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define _FLAC__StreamDecoder-pointer (_cpointer 'flac-streamdecoder)) -(define _FLAC__Data-pointer (_cpointer 'flac-client-data)) +(define _FLAC__Data-pointer (_cpointer/null 'flac-client-data)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FLAC Callback function definitions @@ -414,18 +414,21 @@ (_fun _FLAC__StreamDecoder-pointer _FLAC__Frame-pointer 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) (define _FLAC__StreamDecoderMetadataCallback (_fun _FLAC__StreamDecoder-pointer _FLAC__StreamMetadata-pointer - _FLAC__Data-pointer -> _void)) + _FLAC__Data-pointer + -> _void)) (define _FLAC__StreamDecoderErrorCallback (_fun _FLAC__StreamDecoder-pointer _int - _FLAC__Data-pointer -> _void)) + _FLAC__Data-pointer + -> _void)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -464,6 +467,7 @@ _FLAC__StreamDecoderWriteCallback _FLAC__StreamDecoderMetadataCallback _FLAC__StreamDecoderErrorCallback + _FLAC__Data-pointer ; Seen by Jens Axel Søgaard - Is already present in FLAC 1.4.3 -> _int)) (define-libflac FLAC__stream_decoder_process_single @@ -488,15 +492,16 @@ (define error-no -1) (define fl #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)))) 0) - (define (meta-callback fl meta data) + (define (meta-callback fl meta client-data) (set! meta-data (append meta-data (list meta)))) - (define (error-callback fl errno data) + (define (error-callback fl errno client-data) (set! error-no errno) ) @@ -506,11 +511,12 @@ (define (init file) (let ((r (FLAC__stream_decoder_init_file - fl - file - write-callback - meta-callback - error-callback))) + fl + file + write-callback + meta-callback + error-callback + client-data))) (set! flac-file file) r)) diff --git a/play-test.rkt b/play-test.rkt index ae2304b..257a30b 100644 --- a/play-test.rkt +++ b/play-test.rkt @@ -15,6 +15,7 @@ ) ) +(ao-set-async-mode! 'scheme) ;(define fmt (ao-mk-format 24 48000 2 'big-endian)) ;(define ao-h (ao-open-live #f fmt)) @@ -34,7 +35,7 @@ (when (eq? ao-h #f) (let ((fmt (ao-mk-format bits-per-sample rate channels 'big-endian))) (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 ((s (inexact->exact (round (ao-at-second ao-h))))) (unless (= s current-seconds) From eac031c17fc66fcfead5b564fa6c52a3f9a27850 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 16:51:01 +0100 Subject: [PATCH 2/8] - --- libao/libao-async.rkt | 2 +- libao/libao.rkt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libao/libao-async.rkt b/libao/libao-async.rkt index 8f8a335..597112b 100644 --- a/libao/libao-async.rkt +++ b/libao/libao-async.rkt @@ -94,7 +94,7 @@ (set-ao-shm-bufsize! shm (- bs buf-len))) (mutex-unlock (ao-shm-mutex shm)) (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) diff --git a/libao/libao.rkt b/libao/libao.rkt index 04747af..7fdf92e 100644 --- a/libao/libao.rkt +++ b/libao/libao.rkt @@ -187,7 +187,7 @@ (audio-buf-len (* channels bytes-per-sample buf-len)) (audio (if (eq? libao-async-mode 'ffi) (malloc 'atomic audio-buf-len) - (malloc 'raw audio-buf-len))) + (malloc 'atomic audio-buf-len))) ; was: 'raw (get-sample (lambda (k channel) (let ((chan-buf (list-ref buffer channel))) (vector-ref chan-buf k)))) From 1221f198b2322d1f4c3030176260282b60b06bfb Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 16:53:17 +0100 Subject: [PATCH 3/8] - --- libao/libao-async.rkt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libao/libao-async.rkt b/libao/libao-async.rkt index 597112b..d3bd0ff 100644 --- a/libao/libao-async.rkt +++ b/libao/libao-async.rkt @@ -185,9 +185,10 @@ (let ((q (ao-shm-queue shm))) (while (> (queue-length q) 0) ;(displayln (format "queue-length: ~a" (queue-length q))) - (let* ((elem (dequeue! q)) - (buf (car (cddddr elem)))) - (free buf)))) + ;(let* ((elem (dequeue! q)) + ;(buf (car (cddddr elem)))) + ;(free buf)))) + (dequeue! q)) (set-ao-shm-queue! shm (make-queue)) (set-ao-shm-bufsize! shm 0) ) From 5eabcfb2b1bc5d0883806ea7cb0d2f1d08de57c4 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 16:54:15 +0100 Subject: [PATCH 4/8] - --- libao/libao-async.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libao/libao-async.rkt b/libao/libao-async.rkt index d3bd0ff..0fba0e1 100644 --- a/libao/libao-async.rkt +++ b/libao/libao-async.rkt @@ -188,7 +188,7 @@ ;(let* ((elem (dequeue! q)) ;(buf (car (cddddr elem)))) ;(free buf)))) - (dequeue! q)) + (dequeue! q))) (set-ao-shm-queue! shm (make-queue)) (set-ao-shm-bufsize! shm 0) ) From 674123dc835aeef885e56fb3813d9a2a5fa2388a Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 17:00:37 +0100 Subject: [PATCH 5/8] - --- libao/libao.rkt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libao/libao.rkt b/libao/libao.rkt index 7fdf92e..b5bb368 100644 --- a/libao/libao.rkt +++ b/libao/libao.rkt @@ -55,8 +55,10 @@ (lambda (my-handle) (hash-for-each devices (lambda (handle-num device) + (displayln (format "closing ao handle ~a" handle-num)) (ao-close handle-num))) (set! devices (make-hash)) + (displayln "shutting down ao") (ao_shutdown) (plumber-flush-handle-remove! my-handle) ))) From 8eadceac21a87a472acf98b36770685d459b63cb Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 17:05:17 +0100 Subject: [PATCH 6/8] - --- libao/libao.rkt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libao/libao.rkt b/libao/libao.rkt index b5bb368..d7cd10a 100644 --- a/libao/libao.rkt +++ b/libao/libao.rkt @@ -156,11 +156,16 @@ (if (number? handle) (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 ((ao-device (hash-ref devices handle-num #f))) - (displayln (format "ao-device = ~a" ao-device)) - (close-device handle ao-device)) + (unless (eq? ao-device #f) + (displayln (format "ao-device = ~a" ao-device)) + (close-device handle ao-device) + (hash-remove! devices handle-num))) ) ) ) From 0a2516df1e4bbccbb79ffa1b23279e4d450832b4 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 17:39:18 +0100 Subject: [PATCH 7/8] - --- libflac/libflac-ffi.rkt | 20 ++++++++++++++++++-- play-test.rkt | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libflac/libflac-ffi.rkt b/libflac/libflac-ffi.rkt index d5b5020..77c1d7a 100644 --- a/libflac/libflac-ffi.rkt +++ b/libflac/libflac-ffi.rkt @@ -403,6 +403,7 @@ (define _FLAC__StreamDecoder-pointer (_cpointer 'flac-streamdecoder)) (define _FLAC__Data-pointer (_cpointer/null 'flac-client-data)) +;(define _FLAC__StreamMetadata-pointer (_cpointer/null 'flac-stream-metadata)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FLAC Callback function definitions @@ -482,6 +483,16 @@ (_fun _FLAC__StreamDecoder-pointer FLAC__uint64 -> _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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -499,7 +510,9 @@ 0) (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 client-data) (set! error-no errno) @@ -530,7 +543,10 @@ (decoder-state (int-state))) (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 '())) (define (process-write-data cb) diff --git a/play-test.rkt b/play-test.rkt index 257a30b..04a0c92 100644 --- a/play-test.rkt +++ b/play-test.rkt @@ -15,7 +15,7 @@ ) ) -(ao-set-async-mode! 'scheme) +(ao-set-async-mode! 'ffi) ;(define fmt (ao-mk-format 24 48000 2 'big-endian)) ;(define ao-h (ao-open-live #f fmt)) From dd174469d91f5a9c8d70e6db3d7fcf026b59ba3d Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 26 Feb 2026 17:46:07 +0100 Subject: [PATCH 8/8] - --- libtag/taglib.rkt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libtag/taglib.rkt b/libtag/taglib.rkt index 7d1e8ff..2cf3fa9 100644 --- a/libtag/taglib.rkt +++ b/libtag/taglib.rkt @@ -67,7 +67,9 @@ (disc-number -1) (picture #f)) (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? (let ((tag (taglib_file_tag tag-file)) (ap (taglib_file_audioproperties tag-file))