more defensive constructs with early-return & let-assert
This commit is contained in:
+62
-40
@@ -108,21 +108,6 @@
|
||||
undefined
|
||||
)))
|
||||
|
||||
|
||||
;typedef enum {
|
||||
; FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0,
|
||||
; FLAC__STREAM_DECODER_READ_METADATA,
|
||||
; FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC,
|
||||
; FLAC__STREAM_DECODER_READ_FRAME,
|
||||
; FLAC__STREAM_DECODER_END_OF_STREAM,
|
||||
; FLAC__STREAM_DECODER_OGG_ERROR,
|
||||
; FLAC__STREAM_DECODER_SEEK_ERROR,
|
||||
; FLAC__STREAM_DECODER_ABORTED,
|
||||
; FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR,
|
||||
; FLAC__STREAM_DECODER_UNINITIALIZED,
|
||||
; FLAC__STREAM_DECODER_END_OF_LINK
|
||||
;} FLAC__StreamDecoderState;
|
||||
|
||||
(define _FLAC_StreamDecoderState
|
||||
(_enum '(search-for-metadata = 0
|
||||
read-metadata
|
||||
@@ -247,23 +232,6 @@
|
||||
;; FLAC Metadata
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;typedef struct FLAC__StreamMetadata {
|
||||
; FLAC__MetadataType type;
|
||||
; FLAC__bool is_last;
|
||||
; uint32_t length;
|
||||
; union {
|
||||
; FLAC__StreamMetadata_StreamInfo stream_info;
|
||||
; FLAC__StreamMetadata_Padding padding;
|
||||
; FLAC__StreamMetadata_Application application;
|
||||
; FLAC__StreamMetadata_SeekTable seek_table;
|
||||
; FLAC__StreamMetadata_VorbisComment vorbis_comment;
|
||||
; FLAC__StreamMetadata_CueSheet cue_sheet;
|
||||
; FLAC__StreamMetadata_Picture picture;
|
||||
; FLAC__StreamMetadata_Unknown unknown;
|
||||
; } data;
|
||||
;} FLAC__StreamMetadata;
|
||||
|
||||
|
||||
(define-cstruct _FLAC__StreamMetadata_StreamInfo
|
||||
(
|
||||
[min_blocksize _uint32_t]
|
||||
@@ -498,6 +466,52 @@
|
||||
;; Our interface for decoding to racket
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define (endian-little? e)
|
||||
(cond [(eq? e 'little-endian) #t]
|
||||
[(eq? e 'big-endian) #f]
|
||||
[(eq? e 'native-endian) (not (system-big-endian?))]
|
||||
[else (error (format "unknown endian value: ~a" e))]))
|
||||
|
||||
(define (flac-channels->interleaved-buffer buffer block-size channels bits endianness)
|
||||
;; buffer = FLAC__int32 * const buffer[]
|
||||
;; block-size = samples per channel
|
||||
|
||||
(let* ([bytes (quotient bits 8)]
|
||||
[big? (not (endian-little? endianness))]
|
||||
[buf-size (* block-size channels bytes)]
|
||||
[bs (make-bytes buf-size)]
|
||||
;[out (malloc buf-size 'atomic-interior)]
|
||||
[out-pos 0])
|
||||
|
||||
(for ([k (in-range block-size)])
|
||||
(for ([channel (in-range channels)])
|
||||
(let* ([chan (ptr-ref buffer _pointer channel)]
|
||||
[sample (ptr-ref chan _int32 k)])
|
||||
(integer->int-bytes sample bytes #t big? bs out-pos)
|
||||
(set! out-pos (+ out-pos bytes)))))
|
||||
|
||||
;(memcpy out bs buf-size)
|
||||
;(list out buf-size)
|
||||
(list bs buf-size)
|
||||
))
|
||||
|
||||
(define (copy-flac-frame frame buffer)
|
||||
(let* ((h (flac-ffi-frame-header frame))
|
||||
(channels (hash-ref h 'channels))
|
||||
(block-size (hash-ref h 'blocksize))
|
||||
(bits (hash-ref h 'bits-per-sample))
|
||||
(endianness 'native-endian)
|
||||
(result (flac-channels->interleaved-buffer
|
||||
buffer block-size channels bits endianness))
|
||||
(bs (car result))
|
||||
(buf-size (cadr result)))
|
||||
(hash-set! h 'type 'interleaved)
|
||||
(hash-set! h 'endianness endianness)
|
||||
(hash-set! h 'bits-per-sample bits)
|
||||
(hash-set! h 'sample (hash-ref h 'number))
|
||||
(cons h bs)))
|
||||
|
||||
|
||||
(define (flac-ffi-decoder-handler)
|
||||
(define write-data '())
|
||||
(define meta-data '())
|
||||
@@ -506,14 +520,21 @@
|
||||
(define flac-file #f)
|
||||
(define client-data #f)
|
||||
|
||||
;(define (write-callback fl frame buffer client-data)
|
||||
; (set! write-data (append write-data (list (cons frame buffer))))
|
||||
; 0)
|
||||
(define (write-callback fl frame buffer client-data)
|
||||
(set! write-data (append write-data (list (cons frame buffer))))
|
||||
(set! write-data (cons (copy-flac-frame frame buffer) write-data))
|
||||
0)
|
||||
|
||||
;(define (meta-callback fl meta client-data)
|
||||
; (let ((meta-clone (FLAC__metadata_object_clone meta)))
|
||||
; (unless (eq? meta-clone #f)
|
||||
; (set! meta-data (append meta-data (list meta-clone))))))
|
||||
(define (meta-callback fl meta client-data)
|
||||
(let ((meta-clone (FLAC__metadata_object_clone meta)))
|
||||
(unless (eq? meta-clone #f)
|
||||
(set! meta-data (append meta-data (list meta-clone))))))
|
||||
(set! meta-data (cons meta-clone meta-data)))))
|
||||
|
||||
(define (error-callback fl errno client-data)
|
||||
(set! error-no errno)
|
||||
@@ -557,16 +578,16 @@
|
||||
(decoder-state (int-state)))
|
||||
|
||||
(define (process-meta-data cb)
|
||||
(for-each (λ (meta-entry)
|
||||
(for-each (lambda (meta-entry)
|
||||
(cb meta-entry)
|
||||
(FLAC__metadata_object_delete meta-entry))
|
||||
meta-data)
|
||||
(reverse meta-data))
|
||||
(set! meta-data '()))
|
||||
|
||||
(define (process-write-data cb)
|
||||
(for-each (lambda (d)
|
||||
(cb (car d) (cdr d)))
|
||||
write-data)
|
||||
(for-each (lambda (d)
|
||||
(cb (car d) (cdr d)))
|
||||
(reverse write-data))
|
||||
(set! write-data '()))
|
||||
|
||||
(define (buffer->vectorlist buffer channels size)
|
||||
@@ -618,4 +639,5 @@
|
||||
))
|
||||
)
|
||||
|
||||
); end of module
|
||||
); end of module
|
||||
|
||||
|
||||
Reference in New Issue
Block a user