292
287
/* gets the length of the actual sample data (without the header) */
293
unsigned int SND_GetNumberOfSamples(void* sample)
288
unsigned int SND_GetNumberOfSamples(void* sample, int sample_length)
295
unsigned int chunklength, length = 0, offset = 16;
290
unsigned int chunklength, length = 0, offset;
291
unsigned short block_align;
298
292
if (CheckSample(sample))
300
memcpy(&chunklength, ((char*)sample) + offset, 4);
294
memcpy(&chunklength, ((char*)sample) + 16, 4);
295
memcpy(&block_align, ((char*)sample) + 32, 2); /* always 2 or 4 it seems */
301
297
/* This was endian unsafe. See top of the file for the define. */
302
if (SND_fEndian == SND_endianBig) SWITCH_INT(chunklength);
304
offset = offset + chunklength + 4;
305
memcpy(data, ((char*)sample) + offset, 4);
298
if (SND_fEndian == SND_endianBig)
300
SWITCH_INT(chunklength);
301
SWITCH_SHORT(block_align);
304
offset = 16 + chunklength + 4;
307
306
/* This seems very unsafe, what if data is never found (f.i. corrupt file)... */
308
307
// lets find "data"
309
while (memcmp(data, "data", 4))
308
while (memcmp(((char*)sample) + offset, "data", 4))
312
memcpy(data, ((char*)sample) + offset, 4);
310
offset += block_align;
312
if (offset+block_align > sample_length) /* save us from crashing */
315
316
memcpy(&length, ((char*)sample) + offset, 4);
326
327
/* gets the size of the entire header (file - sampledata) */
327
unsigned int SND_GetHeaderSize(void* sample)
328
unsigned int SND_GetHeaderSize(void* sample, int sample_length)
329
330
unsigned int chunklength, headersize = 0, offset = 16;
331
unsigned short block_align;
332
332
if (CheckSample(sample))
334
334
memcpy(&chunklength, ((char*)sample) + offset, 4);
335
memcpy(&block_align, ((char*)sample) + 32, 2); /* always 2 or 4 it seems */
335
337
/* This was endian unsafe. See top of the file for the define. */
336
if (SND_fEndian == SND_endianBig) SWITCH_INT(chunklength);
338
if (SND_fEndian == SND_endianBig)
340
SWITCH_INT(chunklength);
341
SWITCH_SHORT(block_align);
337
343
offset = offset + chunklength + 4;
338
memcpy(data, ((char*)sample) + offset, 4);
340
345
// lets find "data"
341
while (memcmp(data, "data", 4))
346
while (memcmp(((char*)sample) + offset, "data", 4))
344
memcpy(data, ((char*)sample) + offset, 4);
348
offset += block_align;
350
if (offset+block_align > sample_length) /* save us from crashing */
346
353
headersize = offset + 8;
350
356
return headersize;
355
360
unsigned int SND_GetExtraChunk(void* sample)
357
362
unsigned int extrachunk = 0, chunklength, offset = 16;
387
392
if (CheckSample(sample))
389
394
memcpy(&fileheader, sample, sizeof(WavFileHeader));
390
fileheader.size = SND_GetHeaderSize(sample);
391
sample += sizeof(WavFileHeader);
392
fileheader.size = ((fileheader.size+1) & ~1) - 4;
395
fileheader.size = SND_GetHeaderSize(sample, waveslot->GetFileSize());
396
if (fileheader.size) { /* this may fail for corrupt files */
397
sample += sizeof(WavFileHeader);
398
fileheader.size = ((fileheader.size+1) & ~1) - 4;
394
while ((fileheader.size > 0) && (memcpy(&chunkheader, sample, sizeof(WavChunkHeader))))
396
sample += sizeof(WavChunkHeader);
397
if (!memcmp(chunkheader.id, "fmt ", 4))
400
while ((fileheader.size > 0) && (memcpy(&chunkheader, sample, sizeof(WavChunkHeader))))
399
memcpy(&fmtheader, sample, sizeof(WavFmtHeader));
400
waveslot->SetSampleFormat(fmtheader.format);
402
sample += sizeof(WavChunkHeader);
403
if (!memcmp(chunkheader.id, "fmt ", 4))
405
memcpy(&fmtheader, sample, sizeof(WavFmtHeader));
406
waveslot->SetSampleFormat(fmtheader.format);
402
if (fmtheader.format == 0x0001)
404
waveslot->SetNumberOfChannels(fmtheader.numberofchannels);
405
waveslot->SetBitRate(fmtheader.bitrate);
406
waveslot->SetSampleRate(fmtheader.samplerate);
408
if (fmtheader.format == 0x0001)
410
waveslot->SetNumberOfChannels(fmtheader.numberofchannels);
411
waveslot->SetBitRate(fmtheader.bitrate);
412
waveslot->SetSampleRate(fmtheader.samplerate);
413
sample += chunkheader.size;
417
memcpy(&fmtexheader, sample, sizeof(WavFmtExHeader));
418
sample += chunkheader.size;
421
else if (!memcmp(chunkheader.id, "data", 4))
423
if (fmtheader.format == 0x0001)
425
waveslot->SetNumberOfSamples(chunkheader.size);
426
sample += chunkheader.size;
428
else if (fmtheader.format == 0x0011)
432
else if (fmtheader.format == 0x0055)
437
else if (!memcmp(chunkheader.id, "smpl", 4))
439
memcpy(&sampleheader, sample, sizeof(WavSampleHeader));
440
//loop = sampleheader.loops;
407
441
sample += chunkheader.size;
411
memcpy(&fmtexheader, sample, sizeof(WavFmtExHeader));
412
sample += chunkheader.size;
415
else if (!memcmp(chunkheader.id, "data", 4))
417
if (fmtheader.format == 0x0001)
419
waveslot->SetNumberOfSamples(chunkheader.size);
420
sample += chunkheader.size;
422
else if (fmtheader.format == 0x0011)
426
else if (fmtheader.format == 0x0055)
431
else if (!memcmp(chunkheader.id, "smpl", 4))
433
memcpy(&sampleheader, sample, sizeof(WavSampleHeader));
434
//loop = sampleheader.loops;
435
sample += chunkheader.size;
438
sample += chunkheader.size;
444
sample += chunkheader.size;
440
sample += chunkheader.size & 1;
441
fileheader.size -= (((chunkheader.size + 1) & ~1) + 8);
446
sample += chunkheader.size & 1;
447
fileheader.size -= (((chunkheader.size + 1) & ~1) + 8);