@@ -14,17 +14,17 @@ namespace {
14
14
#pragma pack(1)
15
15
struct WaveHeader
16
16
{
17
- uint8_t chunkId[4 ];
17
+ uint8_t chunkId[4 ]; // "RIFF"
18
18
uint32_t chunkSize;
19
- uint8_t format[4 ];
20
- uint8_t subChunkId [4 ];
21
- uint32_t subChunkSize ;
19
+ uint8_t format[4 ]; // "WAVE"
20
+ uint8_t subchunk1Id [4 ]; // "fmt "
21
+ uint32_t subchunk1Size ;
22
22
uint16_t audioFormat;
23
23
uint16_t numChannels;
24
24
uint32_t sampleRate;
25
25
uint32_t byteRate;
26
26
uint16_t blockAlign;
27
- uint16_t bps ;
27
+ uint16_t bitsPerSample ;
28
28
};
29
29
struct WaveData
30
30
{
@@ -72,32 +72,38 @@ SoundSource* LoadWav(FileReader* file, String& title, String& artist)
72
72
if (file->read (&header, sizeof (WaveHeader), 1 ) == 0
73
73
|| memcmp (header.chunkId , " RIFF" , 4 ) != 0
74
74
|| memcmp (header.format , " WAVE" , 4 ) != 0
75
- || memcmp (header.subChunkId , " fmt " , 4 ) != 0
75
+ || memcmp (header.subchunk1Id , " fmt " , 4 ) != 0
76
76
|| header.audioFormat != 1
77
77
|| header.sampleRate == 0
78
78
|| header.numChannels == 0
79
- || (header.bps != 8 && header.bps != 16 && header.bps != 24 ))
79
+ || (header.bitsPerSample != 8 && header.bitsPerSample != 16 && header.bitsPerSample != 24 ))
80
80
{
81
81
return nullptr ;
82
82
}
83
83
84
84
// Skip over additional parameters at the end of the format chunk.
85
- file->skip (header.subChunkSize - 16 );
85
+ if (header.subchunk1Size > 16 )
86
+ {
87
+ size_t extraBytes = static_cast <size_t >(header.subchunk1Size ) - 16 ;
88
+ file->skip (extraBytes);
89
+ }
86
90
87
91
// Read the start of the data chunk.
88
92
WaveData data;
89
- if (file->read (&data, sizeof (WaveData), 1 ) == 0
90
- || memcmp (data.chunkId , " data" , 4 ) != 0 )
91
- {
92
- return nullptr ;
93
+ while (true ) {
94
+ if (file->read (&data, sizeof (WaveData), 1 ) == 0 )
95
+ return nullptr ;
96
+ if (memcmp (data.chunkId , " data" , 4 ) == 0 )
97
+ break ;
98
+ file->skip (data.chunkSize );
93
99
}
94
100
95
101
// Create a wav loader that will read the contents of the data chunk.
96
102
WavLoader* loader = new WavLoader;
97
103
98
104
loader->frequency = header.sampleRate ;
99
105
loader->numChannels = header.numChannels ;
100
- loader->bytesPerSample = header.bps / 8 ;
106
+ loader->bytesPerSample = header.bitsPerSample / 8 ;
101
107
loader->numFrames = data.chunkSize / (loader->bytesPerSample * loader->numChannels );
102
108
loader->numFramesLeft = loader->numFrames ;
103
109
loader->file = file;
0 commit comments