--------------------------------- AudioAsset::LoadWavFile Read a WAV file from binary data
| 115 | // Read a WAV file from binary data |
| 116 | // |
| 117 | bool 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) |
nothing calls this directly
no test coverage detected