(bind-func audiofile_wave_read_samples
(lambda (filepath dest:SAMPLE*)
(let ((filedata (sys_slurp_file filepath)))
(if (null? filedata)
(begin (println "wavefile error: could not open file")
(free filedata)
#f)
(cond ((not (wave_validate filedata))
(println "wavefile error: there was a problem with the chunk IDs...\nis the file corrupt?")
(free filedata)
#f)
(else
(let ((fmt (iffchunk_find_dumb filedata "fmt "))
(chunksize (i32toi64 (iffchunk_size (cast fmt IffChunkHeader*) #t)))
(type (i16toi64 (pref (cast (pref-ptr fmt IFF_CHUNK_HEADER_SIZE) i16*) 0)))
(nchan (i16toi64 (pref (cast (pref-ptr fmt (+ IFF_CHUNK_HEADER_SIZE 2)) i16*) 0)))
(samplerate (i32toi64 (pref (cast (pref-ptr fmt (+ IFF_CHUNK_HEADER_SIZE 4)) i32*) 0)))
(bitdepth (i16toi64 (pref (cast (pref-ptr fmt (+ IFF_CHUNK_HEADER_SIZE 14)) i16*) 0)))
(data (iffchunk_find_dumb filedata "data"))
(nframes (/ (i32toi64 (iffchunk_size (cast data IffChunkHeader*) #t))
(* nchan (/ bitdepth 8))))
;; read data into memory
(res (audiofile_copy_samples (pref-ptr data IFF_CHUNK_HEADER_SIZE)
dest
(* nchan nframes)
bitdepth
type
#t)))
(free filedata)
res)))))))