summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/wavfile.cc
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2013-11-15 17:11:40 +0100
committerJohnathan Corgan <johnathan@corganlabs.com>2013-11-16 10:24:18 -0800
commita4cd0033ec46c406a5126f72a53140780a5141e7 (patch)
tree51f8342dc3e319fa0c159a15a55b61829189516e /gr-blocks/lib/wavfile.cc
parent02e7ee131c812ea090111fff95c8493d2fe4f257 (diff)
blocks: allow extra header chunks in wav_file_source
Diffstat (limited to 'gr-blocks/lib/wavfile.cc')
-rw-r--r--gr-blocks/lib/wavfile.cc22
1 files changed, 19 insertions, 3 deletions
diff --git a/gr-blocks/lib/wavfile.cc b/gr-blocks/lib/wavfile.cc
index 0a4336f443..865082e05f 100644
--- a/gr-blocks/lib/wavfile.cc
+++ b/gr-blocks/lib/wavfile.cc
@@ -138,10 +138,26 @@ namespace gr {
}
}
- // data chunk
+ // find data chunk
fresult = fread(str_buf, 1, 4, fp);
- if(strncmp(str_buf, "data", 4)) {
- return false;
+ // keep parsing chunk until we hit the data chunk
+ while(fresult != 4 || strncmp(str_buf, "data", 4))
+ {
+ // all good?
+ if(fresult != 4 || ferror(fp) || feof(fp)) {
+ return false;
+ }
+ // get chunk body size and skip
+ fresult = fread(&chunk_size, 1, 4, fp);
+ if(fresult != 4 || ferror(fp) || feof(fp)) {
+ return false;
+ }
+ chunk_size = wav_to_host(chunk_size);
+ if(fseek(fp, chunk_size, SEEK_CUR) != 0) {
+ return false;
+ }
+ // read next chunk type
+ fresult = fread(str_buf, 1, 4, fp);
}
fresult = fread(&chunk_size, 1, 4, fp);