Skip to content

Commit 03af447

Browse files
committed
Add support for fmt's extrabyte
Added, in readheader internal API, a logic to ignore the extrabyte in fmt header's chunk in WAV file.
1 parent 80f7202 commit 03af447

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

src/SDWaveFile.cpp

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ struct WaveFileHeader {
3939
} subChunk2;
4040
} __attribute__((packed));
4141

42+
struct SubChunkHeader {
43+
uint32_t id;
44+
uint32_t size;
45+
};
46+
4247
SDWaveFile::SDWaveFile() :
4348
SDWaveFile(NULL)
4449
{
@@ -129,8 +134,8 @@ long SDWaveFile::currentTime()
129134

130135
uint32_t position = _file.position();
131136

132-
if (position >= sizeof(struct WaveFileHeader)) {
133-
position -= sizeof(struct WaveFileHeader);
137+
if (position >= _dataOffset) {
138+
position -= _dataOffset;
134139
}
135140

136141
return (position) / (_blockAlign * _sampleRate);
@@ -142,7 +147,7 @@ int SDWaveFile::cue(long time)
142147
return 1;
143148
}
144149

145-
long offset = (time * _blockAlign) - sizeof(struct WaveFileHeader);
150+
long offset = (time * _blockAlign) - _dataOffset;
146151

147152
if (offset < 0) {
148153
offset = 0;
@@ -180,7 +185,7 @@ int SDWaveFile::read(void* buffer, size_t size)
180185

181186
if (position == 0) {
182187
// replace the header with 0's
183-
memset(buffer, 0x00, sizeof(struct WaveFileHeader));
188+
memset(buffer, 0x00, _dataOffset);
184189
}
185190

186191
if (read) {
@@ -224,21 +229,24 @@ void SDWaveFile::readHeader()
224229
_file.close();
225230
return;
226231
}
227-
228232
struct WaveFileHeader header;
233+
int headerSize, dataHeaderOffset;
234+
struct SubChunkHeader sch;
229235

230-
if (_file.read(&header, sizeof(header)) != sizeof(header)) {
236+
headerSize = sizeof(struct WaveFileHeader) - sizeof(header.subChunk2);
237+
if (_file.read((void *)&header, headerSize) != headerSize) {
231238
_file.close();
232239
return;
233240
}
234-
_file.close();
235241

236-
_headerRead = true;
242+
if (header.subChunk1.size != 16 || header.subChunk1.audioFormat != 1) {
243+
_file.close();
244+
return;
245+
}
237246

238247
header.chunkId = __REV(header.chunkId);
239248
header.format = __REV(header.format);
240249
header.subChunk1.id = __REV(header.subChunk1.id);
241-
header.subChunk2.id = __REV(header.subChunk2.id);
242250

243251
if (header.chunkId != 0x52494646) { // "RIFF"
244252
return;
@@ -256,14 +264,25 @@ void SDWaveFile::readHeader()
256264
return;
257265
}
258266

259-
if (header.subChunk1.size != 16 || header.subChunk1.audioFormat != 1) {
260-
// not PCM
261-
return;
267+
while (_file.available()) {
268+
if (_file.read((void *)&(sch), sizeof(sch)) != sizeof(sch)) {
269+
_file.close();
270+
return;
271+
}
272+
sch.id = __REV(sch.id);
273+
if (sch.id == 0x64617461) {
274+
header.subChunk2.id = sch.id;
275+
header.subChunk2.size = sch.size;
276+
break;
277+
} else {
278+
_file.seek(_file.position() + sch.size);
279+
dataHeaderOffset += 4 + sch.size;
280+
}
262281
}
282+
_dataOffset = sizeof(struct WaveFileHeader) + dataHeaderOffset;
283+
_file.close();
263284

264-
if (header.subChunk2.id != 0x64617461) { // "data"
265-
return;
266-
}
285+
_headerRead = true;
267286

268287
_channels = header.subChunk1.numChannels;
269288
_sampleRate = header.subChunk1.sampleRate;

src/SDWaveFile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class SDWaveFile : public SoundFile
6969
int _channels;
7070
long _frames;
7171
int _blockAlign;
72+
int _dataOffset;
7273
};
7374

7475
#endif

0 commit comments

Comments
 (0)