18
18
19
19
#include " SDWaveFile.h"
20
20
21
+ struct SubChunkHeader {
22
+ uint32_t id;
23
+ uint32_t size;
24
+ };
25
+
21
26
// based on: http://soundfile.sapp.org/doc/WaveFormat/
22
27
struct WaveFileHeader {
23
28
uint32_t chunkId;
24
29
uint32_t chunkSize;
25
30
uint32_t format;
26
31
struct {
27
- uint32_t id;
28
- uint32_t size;
32
+ struct SubChunkHeader header;
29
33
uint16_t audioFormat;
30
34
uint16_t numChannels;
31
35
uint32_t sampleRate;
32
36
uint32_t byteRate;
33
37
uint16_t blockAlign;
34
38
uint16_t bitsPerSample;
35
39
} subChunk1;
36
- struct {
37
- uint32_t id;
38
- uint32_t size;
39
- } subChunk2;
40
+ struct SubChunkHeader subChunk2Header;
40
41
} __attribute__((packed));
41
42
42
- struct SubChunkHeader {
43
- uint32_t id;
44
- uint32_t size;
45
- };
46
-
47
43
SDWaveFile::SDWaveFile () :
48
44
SDWaveFile(NULL )
49
45
{
@@ -58,7 +54,8 @@ SDWaveFile::SDWaveFile(const char* filename) :
58
54
_sampleRate(-1 ),
59
55
_bitsPerSample(-1 ),
60
56
_channels(-1 ),
61
- _frames(-1 )
57
+ _frames(-1 ),
58
+ _dataOffset(0 )
62
59
{
63
60
64
61
}
@@ -229,24 +226,21 @@ void SDWaveFile::readHeader()
229
226
_file.close ();
230
227
return ;
231
228
}
229
+
232
230
struct WaveFileHeader header;
233
- int headerSize, dataHeaderOffset;
231
+ int headerSize;
232
+ int dataHeaderOffset = 0 ;
234
233
struct SubChunkHeader sch;
235
234
236
- headerSize = sizeof (struct WaveFileHeader ) - sizeof (header.subChunk2 );
235
+ headerSize = sizeof (struct WaveFileHeader ) - sizeof (header.subChunk2Header );
237
236
if (_file.read ((void *)&header, headerSize) != headerSize) {
238
237
_file.close ();
239
238
return ;
240
239
}
241
240
242
- if (header.subChunk1 .size != 16 || header.subChunk1 .audioFormat != 1 ) {
243
- _file.close ();
244
- return ;
245
- }
246
-
247
241
header.chunkId = __REV (header.chunkId );
248
242
header.format = __REV (header.format );
249
- header.subChunk1 .id = __REV (header.subChunk1 .id );
243
+ header.subChunk1 .header . id = __REV (header.subChunk1 . header .id );
250
244
251
245
if (header.chunkId != 0x52494646 ) { // "RIFF"
252
246
return ;
@@ -260,7 +254,12 @@ void SDWaveFile::readHeader()
260
254
return ;
261
255
}
262
256
263
- if (header.subChunk1 .id != 0x666d7420 ) { // "fmt "
257
+ if (header.subChunk1 .header .id != 0x666d7420 ) { // "fmt "
258
+ return ;
259
+ }
260
+
261
+ if (header.subChunk1 .header .size != 16 || header.subChunk1 .audioFormat != 1 ) {
262
+ _file.close ();
264
263
return ;
265
264
}
266
265
@@ -269,16 +268,27 @@ void SDWaveFile::readHeader()
269
268
_file.close ();
270
269
return ;
271
270
}
271
+
272
272
sch.id = __REV (sch.id );
273
+
273
274
if (sch.id == 0x64617461 ) {
274
- header.subChunk2 .id = sch.id ;
275
- header.subChunk2 .size = sch.size ;
275
+ // found the data section
276
+ header.subChunk2Header .id = sch.id ;
277
+ header.subChunk2Header .size = sch.size ;
276
278
break ;
277
- } else {
278
- _file.seek (_file.position () + sch.size );
279
- dataHeaderOffset += 4 + sch.size ;
280
279
}
280
+
281
+ // skip this header section
282
+ _file.seek (_file.position () + sch.size );
283
+ dataHeaderOffset += (4 + sch.size );
281
284
}
285
+
286
+ if (header.subChunk2Header .id != 0x64617461 ) { // "data"
287
+ // no data section found
288
+ _file.close ();
289
+ return ;
290
+ }
291
+
282
292
_dataOffset = sizeof (struct WaveFileHeader ) + dataHeaderOffset;
283
293
_file.close ();
284
294
@@ -288,7 +298,7 @@ void SDWaveFile::readHeader()
288
298
_sampleRate = header.subChunk1 .sampleRate ;
289
299
_bitsPerSample = header.subChunk1 .bitsPerSample ;
290
300
_blockAlign = header.subChunk1 .blockAlign ;
291
- _frames = header.subChunk2 .size / _blockAlign;
301
+ _frames = header.subChunk2Header .size / _blockAlign;
292
302
293
303
_isValid = true ;
294
304
}
0 commit comments