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))