some simple cleanup
parent
e3c7e3e05a
commit
5340fc7bae
|
@ -239,14 +239,13 @@
|
|||
(residual (read-residual-partitioned-rice blocksize lpc-order)))
|
||||
(restore-linear-prediction warmup residual coefs lpc-order shift)))
|
||||
|
||||
|
||||
;; TODO: clean up the channel decorrelation this is kind of ugly
|
||||
(define (read-subframes stream-info frame-header)
|
||||
(let ((channels (stream-info-channels stream-info))
|
||||
(channel-assignment (frame-header-channel-assignment frame-header)))
|
||||
(map! (λ (channel) (read-subframe frame-header channel)) (iota channels))))
|
||||
|
||||
e; TODO: actually verify the checksum
|
||||
; TODO: actually verify the checksum
|
||||
(define (read-frame-footer)
|
||||
(flac-read-uint 16))
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
flac-subframe-type
|
||||
flac-entropy-coding-method-type
|
||||
|
||||
make-frame-header
|
||||
%make-frame-header
|
||||
frame-header-strategy frame-header-blocksize frame-header-sample-rate
|
||||
frame-header-channel-assignment frame-header-bits-per-sample
|
||||
frame-header-frame/sample-number frame-header-crc
|
||||
|
@ -31,48 +31,20 @@
|
|||
%make-frame
|
||||
frame-header frame-subframes frame-footer frame-samples
|
||||
|
||||
%make-subframe-constant
|
||||
subframe-constant-value
|
||||
%make-metadata-padding metadata-padding?
|
||||
padding-length
|
||||
|
||||
%make-subframe-verbatim
|
||||
subframe-verbatim-value
|
||||
|
||||
%make-subframe-lpc
|
||||
|
||||
%make-rice-partition
|
||||
partitioned-rice-order partitioned-rice-contents
|
||||
|
||||
%make-entropy-coding-method
|
||||
entropy-coding-method-type entropy-coding-method-data
|
||||
|
||||
%make-entropy-coding-method-partitioned-rice-contents
|
||||
entropy-coding-method-partitioned-rice-contents-parameters
|
||||
entropy-coding-method-partitioned-rice-contents-raw-bits
|
||||
entropy-coding-method-partitioned-rice-contents?
|
||||
|
||||
%make-subframe-fixed
|
||||
subframe-fixed-entropy-coding-method
|
||||
subframe-fixed-predictor-order
|
||||
subframe-fixed-warmup
|
||||
subframe-fixed-residual
|
||||
|
||||
make-metadata-block-header
|
||||
metadata-block-header-last?
|
||||
metadata-block-header-type
|
||||
metadata-block-header-length
|
||||
|
||||
make-metadata-padding
|
||||
make-metadata-stream-info metadata-stream-info?
|
||||
%make-metadata-stream-info metadata-stream-info?
|
||||
stream-info-min-block-size stream-info-max-block-size
|
||||
stream-info-min-frame-size stream-info-max-frame-size
|
||||
stream-info-sample-rate stream-info-channels
|
||||
stream-info-bits-per-sample stream-info-samples stream-info-md5
|
||||
|
||||
make-metadata-vorbis-comment
|
||||
%make-metadata-vorbis-comment
|
||||
vorbis-comment-vendor
|
||||
vorbis-comment-comments
|
||||
|
||||
make-flac-metadata
|
||||
%make-flac-metadata
|
||||
flac-metadata-stream-info set-flac-metadata-stream-info!
|
||||
flac-metadata-seek-table set-flac-metadata-seek-table!
|
||||
flac-metadata-vorbis-comment set-flac-metadata-vorbis-comment!
|
||||
|
@ -81,11 +53,11 @@
|
|||
flac-metadata-application set-flac-metadata-application!
|
||||
flac-metadata-cuesheet set-flac-metadata-cuesheet!
|
||||
|
||||
|
||||
make-metadata-picture
|
||||
%make-metadata-picture
|
||||
flac-picture-type
|
||||
|
||||
make-metadata-seek-point make-metadata-seek-table
|
||||
%make-metadata-seek-table
|
||||
%make-metadata-seek-point
|
||||
|
||||
flac-metadata-type flac-metadata-type-index))
|
||||
|
||||
|
@ -122,56 +94,8 @@
|
|||
(header subframe-header)
|
||||
(data subframe-data))
|
||||
|
||||
(define-record-type <subframe-lpc>
|
||||
(%make-subframe-lpc entropy-coding-method order qlp-coefficient-precision quantization-level qlp-coefficients warmup residual)
|
||||
subframe-lpc?
|
||||
(entropy-coding-method subframe-lpc-entropy-coding-method)
|
||||
(order subframe-lpc-order)
|
||||
(qlp-coefficient-precision subframe-lpc-qlp-coefficient-precision)
|
||||
(quantization-level subframe-lpc-quantization-level)
|
||||
(qlp-coefficients subframe-lpc-qlp-coefficients)
|
||||
(warmup subframe-lpc-warmup)
|
||||
(residual subframe-lpc-residual))
|
||||
|
||||
(define-record-type <subframe-verbatim>
|
||||
(%make-subframe-verbatim value)
|
||||
subframe-verbatim?
|
||||
(value subframe-verbatim-value))
|
||||
|
||||
(define-record-type <subframe-fixed>
|
||||
(%make-subframe-fixed entropy-coding-method predictor-order warmup residual)
|
||||
subframe-fixed?
|
||||
(entropy-coding-method subframe-fixed-entropy-coding-method)
|
||||
(predictor-order subframe-fix-predictor-order)
|
||||
(warmup subframe-fixed-warmup)
|
||||
(residual subframe-fixed-residual))
|
||||
|
||||
(define-record-type <subframe-constant>
|
||||
(%make-subframe-constant value)
|
||||
subframe-constant?
|
||||
(value subframe-constant-value))
|
||||
|
||||
(define-record-type <entropy-coding-method-partitioned-rice-contents>
|
||||
(%make-entropy-coding-method-partitioned-rice-contents parameters raw-bits capacity-by-order)
|
||||
entropy-coding-method-partitioned-rice-contents?
|
||||
(parameters entropy-coding-method-partitioned-rice-contents-parameters)
|
||||
(raw-bits entropy-coding-method-partitioned-rice-contents-raw-bits)
|
||||
(capacity-by-order entropy-coding-method-partitioned-rice-contents-capacity-by-order))
|
||||
|
||||
(define-record-type <rice-partition>
|
||||
(%make-rice-partition order contents)
|
||||
rice-partition?
|
||||
(order rice-partition-order)
|
||||
(contents rice-partition-contents))
|
||||
|
||||
(define-record-type <entropy-coding-method>
|
||||
(%make-entropy-coding-method type data)
|
||||
entropy-coding-method?
|
||||
(type entropy-coding-method-type)
|
||||
(data entropy-coding-method-data))
|
||||
|
||||
(define-record-type <frame-header>
|
||||
(make-frame-header blocking-strategy blocksize sample-rate channel-assignment bits-per-sample frame/sample-number crc)
|
||||
(%make-frame-header blocking-strategy blocksize sample-rate channel-assignment bits-per-sample frame/sample-number crc)
|
||||
frame-header?
|
||||
(blocking-strategy frame-header-blocking-strategy)
|
||||
(blocksize frame-header-blocksize)
|
||||
|
@ -194,7 +118,6 @@
|
|||
(samples frame-samples))
|
||||
|
||||
; metadata
|
||||
|
||||
(define flac-metadata-type
|
||||
(make-enumeration '(stream-info
|
||||
padding
|
||||
|
@ -205,15 +128,8 @@
|
|||
picture
|
||||
invalid)))
|
||||
|
||||
(define-record-type <metadata-block-header>
|
||||
(make-metadata-block-header last? type length)
|
||||
metadata-block-header?
|
||||
(last? metadata-block-header-last?)
|
||||
(type metadata-block-header-type)
|
||||
(length metadata-block-header-length))
|
||||
|
||||
(define-record-type <stream-info>
|
||||
(make-metadata-stream-info min-block-size max-block-size min-frame-size max-frame-size sample-rate channels bits-per-sample samples md5)
|
||||
(%make-metadata-stream-info min-block-size max-block-size min-frame-size max-frame-size sample-rate channels bits-per-sample samples md5)
|
||||
metadata-stream-info?
|
||||
(min-block-size stream-info-min-block-size)
|
||||
(max-block-size stream-info-max-block-size)
|
||||
|
@ -231,19 +147,19 @@
|
|||
; (format port "#<stream-info>")))
|
||||
|
||||
(define-record-type <seek-table>
|
||||
(make-metadata-seek-table seek-points)
|
||||
(%make-metadata-seek-table seek-points)
|
||||
metadata-seek-table?
|
||||
(seek-points seek-table-seek-points))
|
||||
|
||||
(define-record-type <seek-point>
|
||||
(make-metadata-seek-point sample-number offset total-samples)
|
||||
(%make-metadata-seek-point sample-number offset total-samples)
|
||||
metadata-seek-point?
|
||||
(sample-number seek-point-sample-number)
|
||||
(offset seek-point-offset)
|
||||
(total-samples seek-point-total-samples))
|
||||
|
||||
(define-record-type <vorbis-comment>
|
||||
(make-metadata-vorbis-comment vendor comments)
|
||||
(%make-metadata-vorbis-comment vendor comments)
|
||||
metadata-vorbis-comment?
|
||||
(vendor vorbis-comment-vendor)
|
||||
(comments vorbis-comment-comments))
|
||||
|
@ -254,12 +170,12 @@
|
|||
(format port "#<<vorbis-comment> vendor: ~a comments: ~a>" (vorbis-comment-vendor record) (length (vorbis-comment-comments record)))))
|
||||
|
||||
(define-record-type <padding>
|
||||
(make-metadata-padding length)
|
||||
(%make-metadata-padding length)
|
||||
metadata-padding?
|
||||
(length padding-length))
|
||||
|
||||
(define-record-type <application>
|
||||
(make-metadata-application id data)
|
||||
(%make-metadata-application id data)
|
||||
metadata-application?
|
||||
(id application-id)
|
||||
(data application-data))
|
||||
|
@ -267,7 +183,7 @@
|
|||
(define flac-cuesheet-track-type (make-enumeration '(audio non-audio)))
|
||||
|
||||
(define-record-type <cuesheet-track>
|
||||
(make-metadata-cuesheet-track offset number isrc type pre-emphasis indices)
|
||||
(%make-metadata-cuesheet-track offset number isrc type pre-emphasis indices)
|
||||
metadata-cuesheet-track?
|
||||
(offset cuesheet-track-offset)
|
||||
(number cuesheet-track-number)
|
||||
|
@ -277,13 +193,13 @@
|
|||
(indices cuesheet-track-indices))
|
||||
|
||||
(define-record-type <cuesheet-index>
|
||||
(make-metadata-cuesheet-index offset number)
|
||||
(%make-metadata-cuesheet-index offset number)
|
||||
metadata-cuesheet-index?
|
||||
(offset cuesheet-index-offset)
|
||||
(number cuesheet-index-number))
|
||||
|
||||
(define-record-type <cuesheet>
|
||||
(make-metadata-cuesheet catalog-number lead-in cd? tracks)
|
||||
(%make-metadata-cuesheet catalog-number lead-in cd? tracks)
|
||||
metadata-cuesheet?
|
||||
(catalog-number cuesheet-catalog-number)
|
||||
(lead-in cuesheet-lead-in)
|
||||
|
@ -315,7 +231,7 @@
|
|||
publisher/studio-logotype)))
|
||||
|
||||
(define-record-type <picture>
|
||||
(make-metadata-picture type mime-type description width height depth colors data)
|
||||
(%make-metadata-picture type mime-type description width height depth colors data)
|
||||
metadata-picture?
|
||||
(type picture-type)
|
||||
(mime-type picture-mime-type)
|
||||
|
@ -337,7 +253,7 @@
|
|||
; (format port "#<<frame> header: ~a>" (frame-header record))))
|
||||
|
||||
(define-record-type <flac-metadata>
|
||||
(make-flac-metadata stream-info padding application seek-table vorbis-comment cuesheet pictures)
|
||||
(%make-flac-metadata stream-info padding application seek-table vorbis-comment cuesheet pictures)
|
||||
flac-metadata?
|
||||
(stream-info flac-metadata-stream-info set-flac-metadata-stream-info!)
|
||||
(padding flac-metadata-padding set-flac-metadata-padding!)
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
(flac-read-uint 24)))
|
||||
|
||||
(define (read-metadata-block-stream-info)
|
||||
(make-metadata-stream-info
|
||||
(%make-metadata-stream-info
|
||||
(flac-read-uint 16)
|
||||
(flac-read-uint 16)
|
||||
(flac-read-uint 24)
|
||||
|
@ -31,9 +31,9 @@
|
|||
(flac-read-bytes 16)))
|
||||
|
||||
(define (read-metadata-block-seek-table length)
|
||||
(make-metadata-seek-table
|
||||
(%make-metadata-seek-table
|
||||
(map (λ (_)
|
||||
(make-metadata-seek-point
|
||||
(%make-metadata-seek-point
|
||||
(flac-read-uint 64)
|
||||
(flac-read-uint 64)
|
||||
(flac-read-uint 16)))
|
||||
|
@ -41,16 +41,16 @@
|
|||
|
||||
(define (read-metadata-block-vorbis-comment)
|
||||
(define (read-native-u32) (bytevector-u32-native-ref (flac-read-bytes 4) 0))
|
||||
(make-metadata-vorbis-comment
|
||||
(%make-metadata-vorbis-comment
|
||||
(utf8->string (flac-read-bytes (read-native-u32)))
|
||||
(map (λ (_) (string-split (utf8->string (flac-read-bytes (read-native-u32))) #\=)) (iota (read-native-u32)))))
|
||||
|
||||
(define (read-metadata-block-padding length)
|
||||
(flac-read-bytes length)
|
||||
(make-metadata-padding length))
|
||||
(%make-metadata-padding length))
|
||||
|
||||
(define (read-metadata-block-picture)
|
||||
(make-metadata-picture
|
||||
(%make-metadata-picture
|
||||
(list-ref (enum-set->list flac-picture-type) (flac-read-uint 32))
|
||||
(utf8->string (flac-read-bytes (flac-read-uint 32)))
|
||||
(utf8->string (flac-read-bytes (flac-read-uint 32)))
|
||||
|
@ -81,7 +81,7 @@
|
|||
|
||||
(define (read-flac-metadata)
|
||||
(flac-read/assert-magic)
|
||||
(let metadata-loop ((metadata (make-flac-metadata #f #f #f #f #f #f #f)))
|
||||
(let metadata-loop ((metadata (%make-flac-metadata #f #f #f #f #f #f #f)))
|
||||
(receive (last-block? block-type block-length)
|
||||
(read-metadata-block-header)
|
||||
(if last-block?
|
||||
|
@ -104,13 +104,13 @@
|
|||
|
||||
(define* (flac-metadata port #:optional (type #f))
|
||||
(with-flac-input-port port
|
||||
(λ ()
|
||||
(if (symbol? type)
|
||||
(read-flac-metadata-type type)
|
||||
(read-flac-metadata)))))
|
||||
(λ ()
|
||||
(if (symbol? type)
|
||||
(read-flac-metadata-type type)
|
||||
(read-flac-metadata)))))
|
||||
|
||||
(define* (flac-file-metadata filename #:optional (type #f))
|
||||
(with-flac-input-port (open-input-file filename #:binary #t)
|
||||
(λ ()
|
||||
(flac-read/assert-magic)
|
||||
(flac-metadata (current-input-port) type))))
|
||||
(λ ()
|
||||
(flac-read/assert-magic)
|
||||
(flac-metadata (current-input-port) type))))
|
||||
|
|
|
@ -56,13 +56,11 @@
|
|||
(with-flac-input-port
|
||||
(open-bytevector-input-port example-1)
|
||||
(λ ()
|
||||
(let* ((expected-metadata (make-flac-metadata
|
||||
(make-metadata-stream-info
|
||||
(let* ((expected-streaminfo (%make-metadata-stream-info
|
||||
4096 4096 15 15 44100 2 16 1
|
||||
#vu8(62 132 180 24 7 220 105 3 7 88 106 61 173 26 46 15))
|
||||
#f #f #f #f #f #f))
|
||||
#vu8(62 132 180 24 7 220 105 3 7 88 106 61 173 26 46 15)))
|
||||
(expected-frame (%make-frame
|
||||
(make-frame-header 'fixed 1 44100 'independent 16 0 191)
|
||||
(%make-frame-header 'fixed 1 44100 'independent 16 0 191)
|
||||
43674
|
||||
'((25588) (10416))))
|
||||
|
||||
|
@ -73,29 +71,29 @@
|
|||
(test-equal
|
||||
"stream info"
|
||||
(flac-metadata-stream-info actual-metadata)
|
||||
(flac-metadata-stream-info expected-metadata)))
|
||||
expected-streaminfo))
|
||||
(test-group "Frame"
|
||||
(test-equal "first frame" expected-frame expected-frame))))))
|
||||
(test-group "Example 2"
|
||||
(with-flac-input-port
|
||||
(open-bytevector-input-port example-2)
|
||||
(λ ()
|
||||
(let* ((expected-stream-info (make-metadata-stream-info
|
||||
(let* ((expected-stream-info (%make-metadata-stream-info
|
||||
16 16 23 68 44100 2 16 19
|
||||
#vu8(213 176 86 73 117 233 139 141 139 147 4 34 117 123 129 3)))
|
||||
(expected-vorbis-comment (make-metadata-vorbis-comment
|
||||
(expected-vorbis-comment (%make-metadata-vorbis-comment
|
||||
"reference libFLAC 1.3.3 20190804"
|
||||
(list '("TITLE" "שלום"))))
|
||||
(expected-padding (make-metadata-padding 6))
|
||||
(expected-seek-table (make-metadata-seek-table
|
||||
(list (make-metadata-seek-point 0 0 16))))
|
||||
(expected-padding (%make-metadata-padding 6))
|
||||
(expected-seek-table (%make-metadata-seek-table
|
||||
(list (%make-metadata-seek-point 0 0 16))))
|
||||
(expected-first-frame (%make-frame
|
||||
(make-frame-header 'fixed 16 44100 'right 16 0 153)
|
||||
(%make-frame-header 'fixed 16 44100 'right 16 0 153)
|
||||
47120
|
||||
'((4302 7496 6199 7427 6484 7436 6740 7508 6984 7583 7182 -5990 -6306 -6032 -6299 -6165)
|
||||
(6070 10545 8743 10449 9143 10463 9502 10569 9840 10680 10113 -8428 -8895 -8476 -8896 -8653))))
|
||||
(expected-second-frame (%make-frame
|
||||
(make-frame-header 'fixed 3 44100 'independent 16 1 164)
|
||||
(%make-frame-header 'fixed 3 44100 'independent 16 1 164)
|
||||
4912
|
||||
'((-15486 -15349 -16054)
|
||||
(-9072 -8958 -9410))))
|
||||
|
|
Loading…
Reference in New Issue