;; currently, this will crash out if the AIFF sub-chunks are bad (it
;; doesn't know where the end of the file). It will gracefully handle
;; non AIFF files, though. Only corrupted ones would be a problem
(bind-func audiofile_aiff_read_samples
(lambda (filepath dest:SAMPLE*)
(let ((filedata (sys_slurp_file filepath)))
(if (null? filedata)
(begin (println "aiff file error: could not open file")
#f)
(let ((common (iffchunk_find_dumb filedata "COMM"))
(sounddata (iffchunk_find_dumb filedata "SSND")))
;; pull the data out of the common chunk
(let ((nchan (i16toi64 (swapi16 (pref (cast (pref-ptr common IFF_CHUNK_HEADER_SIZE) i16*) 0))))
(nframes (i32toi64 (swapi32 (pref (cast (pref-ptr common (+ IFF_CHUNK_HEADER_SIZE 2)) i32*) 0))))
(bitdepth (i16toi64 (swapi16 (pref (cast (pref-ptr common (+ IFF_CHUNK_HEADER_SIZE 6)) i16*) 0))))
(res (audiofile_copy_samples (pref-ptr sounddata (+ IFF_CHUNK_HEADER_SIZE 8))
dest
(* nchan nframes)
bitdepth
WAVE_FORMAT_PCM ;; AIFF is always PCM
#f))) ;; AIFF is *not* little-endian
(free filedata)
res))))))