@@ -39,6 +39,11 @@ struct WaveFileHeader {
39
39
} subChunk2;
40
40
} __attribute__((packed));
41
41
42
+ struct SubChunkHeader {
43
+ uint32_t id;
44
+ uint32_t size;
45
+ };
46
+
42
47
SDWaveFile::SDWaveFile () :
43
48
SDWaveFile(NULL )
44
49
{
@@ -129,8 +134,8 @@ long SDWaveFile::currentTime()
129
134
130
135
uint32_t position = _file.position ();
131
136
132
- if (position >= sizeof ( struct WaveFileHeader ) ) {
133
- position -= sizeof ( struct WaveFileHeader ) ;
137
+ if (position >= _dataOffset ) {
138
+ position -= _dataOffset ;
134
139
}
135
140
136
141
return (position) / (_blockAlign * _sampleRate);
@@ -142,7 +147,7 @@ int SDWaveFile::cue(long time)
142
147
return 1 ;
143
148
}
144
149
145
- long offset = (time * _blockAlign) - sizeof ( struct WaveFileHeader ) ;
150
+ long offset = (time * _blockAlign) - _dataOffset ;
146
151
147
152
if (offset < 0 ) {
148
153
offset = 0 ;
@@ -180,7 +185,7 @@ int SDWaveFile::read(void* buffer, size_t size)
180
185
181
186
if (position == 0 ) {
182
187
// replace the header with 0's
183
- memset (buffer, 0x00 , sizeof ( struct WaveFileHeader ) );
188
+ memset (buffer, 0x00 , _dataOffset );
184
189
}
185
190
186
191
if (read) {
@@ -224,21 +229,24 @@ void SDWaveFile::readHeader()
224
229
_file.close ();
225
230
return ;
226
231
}
227
-
228
232
struct WaveFileHeader header;
233
+ int headerSize, dataHeaderOffset;
234
+ struct SubChunkHeader sch;
229
235
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) {
231
238
_file.close ();
232
239
return ;
233
240
}
234
- _file.close ();
235
241
236
- _headerRead = true ;
242
+ if (header.subChunk1 .size != 16 || header.subChunk1 .audioFormat != 1 ) {
243
+ _file.close ();
244
+ return ;
245
+ }
237
246
238
247
header.chunkId = __REV (header.chunkId );
239
248
header.format = __REV (header.format );
240
249
header.subChunk1 .id = __REV (header.subChunk1 .id );
241
- header.subChunk2 .id = __REV (header.subChunk2 .id );
242
250
243
251
if (header.chunkId != 0x52494646 ) { // "RIFF"
244
252
return ;
@@ -256,14 +264,25 @@ void SDWaveFile::readHeader()
256
264
return ;
257
265
}
258
266
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
+ }
262
281
}
282
+ _dataOffset = sizeof (struct WaveFileHeader ) + dataHeaderOffset;
283
+ _file.close ();
263
284
264
- if (header.subChunk2 .id != 0x64617461 ) { // "data"
265
- return ;
266
- }
285
+ _headerRead = true ;
267
286
268
287
_channels = header.subChunk1 .numChannels ;
269
288
_sampleRate = header.subChunk1 .sampleRate ;
0 commit comments