Skip to content

Commit ca6743c

Browse files
committed
edits
1 parent 03af447 commit ca6743c

File tree

2 files changed

+38
-28
lines changed

2 files changed

+38
-28
lines changed

src/SDWaveFile.cpp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,28 @@
1818

1919
#include "SDWaveFile.h"
2020

21+
struct SubChunkHeader {
22+
uint32_t id;
23+
uint32_t size;
24+
};
25+
2126
// based on: http://soundfile.sapp.org/doc/WaveFormat/
2227
struct WaveFileHeader {
2328
uint32_t chunkId;
2429
uint32_t chunkSize;
2530
uint32_t format;
2631
struct {
27-
uint32_t id;
28-
uint32_t size;
32+
struct SubChunkHeader header;
2933
uint16_t audioFormat;
3034
uint16_t numChannels;
3135
uint32_t sampleRate;
3236
uint32_t byteRate;
3337
uint16_t blockAlign;
3438
uint16_t bitsPerSample;
3539
} subChunk1;
36-
struct {
37-
uint32_t id;
38-
uint32_t size;
39-
} subChunk2;
40+
struct SubChunkHeader subChunk2Header;
4041
} __attribute__((packed));
4142

42-
struct SubChunkHeader {
43-
uint32_t id;
44-
uint32_t size;
45-
};
46-
4743
SDWaveFile::SDWaveFile() :
4844
SDWaveFile(NULL)
4945
{
@@ -58,7 +54,8 @@ SDWaveFile::SDWaveFile(const char* filename) :
5854
_sampleRate(-1),
5955
_bitsPerSample(-1),
6056
_channels(-1),
61-
_frames(-1)
57+
_frames(-1),
58+
_dataOffset(0)
6259
{
6360

6461
}
@@ -229,24 +226,21 @@ void SDWaveFile::readHeader()
229226
_file.close();
230227
return;
231228
}
229+
232230
struct WaveFileHeader header;
233-
int headerSize, dataHeaderOffset;
231+
int headerSize;
232+
int dataHeaderOffset = 0;
234233
struct SubChunkHeader sch;
235234

236-
headerSize = sizeof(struct WaveFileHeader) - sizeof(header.subChunk2);
235+
headerSize = sizeof(struct WaveFileHeader) - sizeof(header.subChunk2Header);
237236
if (_file.read((void *)&header, headerSize) != headerSize) {
238237
_file.close();
239238
return;
240239
}
241240

242-
if (header.subChunk1.size != 16 || header.subChunk1.audioFormat != 1) {
243-
_file.close();
244-
return;
245-
}
246-
247241
header.chunkId = __REV(header.chunkId);
248242
header.format = __REV(header.format);
249-
header.subChunk1.id = __REV(header.subChunk1.id);
243+
header.subChunk1.header.id = __REV(header.subChunk1.header.id);
250244

251245
if (header.chunkId != 0x52494646) { // "RIFF"
252246
return;
@@ -260,7 +254,12 @@ void SDWaveFile::readHeader()
260254
return;
261255
}
262256

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();
264263
return;
265264
}
266265

@@ -269,16 +268,27 @@ void SDWaveFile::readHeader()
269268
_file.close();
270269
return;
271270
}
271+
272272
sch.id = __REV(sch.id);
273+
273274
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;
276278
break;
277-
} else {
278-
_file.seek(_file.position() + sch.size);
279-
dataHeaderOffset += 4 + sch.size;
280279
}
280+
281+
// skip this header section
282+
_file.seek(_file.position() + sch.size);
283+
dataHeaderOffset += (4 + sch.size);
281284
}
285+
286+
if (header.subChunk2Header.id != 0x64617461) { // "data"
287+
// no data section found
288+
_file.close();
289+
return;
290+
}
291+
282292
_dataOffset = sizeof(struct WaveFileHeader) + dataHeaderOffset;
283293
_file.close();
284294

@@ -288,7 +298,7 @@ void SDWaveFile::readHeader()
288298
_sampleRate = header.subChunk1.sampleRate;
289299
_bitsPerSample = header.subChunk1.bitsPerSample;
290300
_blockAlign = header.subChunk1.blockAlign;
291-
_frames = header.subChunk2.size / _blockAlign;
301+
_frames = header.subChunk2Header.size / _blockAlign;
292302

293303
_isValid = true;
294304
}

src/SDWaveFile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class SDWaveFile : public SoundFile
6969
int _channels;
7070
long _frames;
7171
int _blockAlign;
72-
int _dataOffset;
72+
uint32_t _dataOffset;
7373
};
7474

7575
#endif

0 commit comments

Comments
 (0)