MCPcopy Create free account
hub / github.com/Illation/ETEngine / LoadWavFile

Method LoadWavFile

Engine/source/EtFramework/Audio/AudioData.cpp:117–199  ·  view source on GitHub ↗

--------------------------------- AudioAsset::LoadWavFile Read a WAV file from binary data

Source from the content-addressed store, hash-verified

115// Read a WAV file from binary data
116//
117bool AudioAsset::LoadWavFile(AudioBufferData &bufferData, std::vector<uint8> const& binaryContent)
118{
119 auto pBinReader = new core::BinaryReader();
120
121#define EXIT_FALSE {delete pBinReader;return false;}
122
123 pBinReader->Open(binaryContent);
124 if (!pBinReader->Exists()) EXIT_FALSE;
125
126 //Read RIFF chunk descriptor
127 std::string chunkID;
128 for (uint8 i = 0; i < 4; i++)chunkID += pBinReader->Read<char>();
129 if (chunkID != "RIFF") EXIT_FALSE;
130 pBinReader->Read<uint32>();//chunk size
131 std::string format;
132 for (uint8 i = 0; i < 4; i++)format += pBinReader->Read<char>();
133 if (format != "WAVE") EXIT_FALSE;
134
135 //Read fmt subchunk
136 std::string subChunk1ID;
137 for (uint8 i = 0; i < 4; i++)subChunk1ID += pBinReader->Read<char>();
138 if (subChunk1ID != "fmt ") EXIT_FALSE;
139 if (pBinReader->Read<uint32>() != 16) EXIT_FALSE;//SubChunk1Size
140 uint16 audioFormat = pBinReader->Read<uint16>();
141 if (audioFormat != 1)
142 {
143 LOG(std::string("Only uncompressed wave files are supported, audio format is: ") + std::to_string(audioFormat), core::LogLevel::Warning);
144 EXIT_FALSE;
145 }
146 uint16 numChannels = pBinReader->Read<uint16>();
147 uint32 sampleRate = pBinReader->Read<uint32>();
148 pBinReader->Read<uint32>();//byte rate
149 pBinReader->Read<uint16>();//block align
150 uint16 bitsPerSample = pBinReader->Read<uint16>();
151
152 //Read data subchunk
153 std::string subChunk2ID;
154 for (uint8 i = 0; i < 4; i++)subChunk2ID += pBinReader->Read<char>();
155 if (subChunk2ID != "data") EXIT_FALSE;
156 uint32 subChunk2Size = pBinReader->Read<uint32>();
157 uint32 bufferPos = (uint32)pBinReader->GetBufferPosition();
158
159 delete pBinReader;
160 pBinReader = nullptr;
161
162 uint8* data = new uint8[subChunk2Size];
163 for (uint32 i = 0; i < subChunk2Size; ++i)
164 {
165 if (i + bufferPos >= (uint32)binaryContent.size())
166 {
167 LOG("Unexpected end of wav files binary content", core::LogLevel::Warning);
168 return false;
169 }
170 data[i] = binaryContent[i + bufferPos];
171 }
172
173 //Format into openAL buffer
174 switch (numChannels)

Callers

nothing calls this directly

Calls 3

GetBufferPositionMethod · 0.80
OpenMethod · 0.45
ExistsMethod · 0.45

Tested by

no test coverage detected