Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const inline std::string WAVE_FORMAT = "WAVE";
- constexpr size_t uint32Size = sizeof(uint32_t);
- void read(std::ifstream &f, void *buffer, std::streamsize size, ChunkInfo *parent){
- if (!f.read(static_cast<char*>(buffer), size)){
- if (f.eof()){
- std::cout << "eof";
- return;
- }
- return;
- }
- if (parent) parent->position += size;
- }
- struct ChunkInfo {
- uint32_t chunkId; //"data" = 0x61746164
- uint32_t chunkSize; //Chunk data bytes
- uint32_t position;
- };
- struct WavFmtHeader {
- uint16_t audioFormat;
- uint16_t numChannels;
- uint32_t sampleRate;
- uint32_t byteRate;
- uint16_t blockAlign;
- uint16_t bitsPerSample;
- };
- void SoundProcessor::parseWavFile(std::ifstream &rawWavFile) {
- auto riff = ChunkInfo{};
- auto wave= ChunkInfo{};
- auto chunk= ChunkInfo{};
- read(rawWavFile, riff, nullptr);
- if(riff.chunkId != CT_RIFF){
- throw std::runtime_error("First chunk must be RIFF");
- }
- std::cout << "RIFF Size: " << riff.chunkSize << std::endl;
- read(rawWavFile, &wave.chunkId, uint32Size, &riff);
- wave.chunkSize = riff.chunkSize - uint32Size;
- wave.position = 0;
- if(wave.chunkId != CT_WAVE){
- throw std::runtime_error("File is not a WAV file");
- }
- std::cout << "RIFF Type: " << convert4ByteUIntToString(wave.chunkId) << std::endl;
- while (rawWavFile) {
- rawWavFile.read(reinterpret_cast<char *>(&chunk), sizeof(chunk));
- uint32_t next_chunk = static_cast<size_t>(rawWavFile.tellg()) + chunk.chunkSize + (chunk.chunkSize & 1);
- //std::cout << "Chunk: '" << convert4ByteUIntToString(chunk.chunkId) << "', Size: " << chunk.chunkSize << std::endl;
- if(chunk.chunkId == CT_fmt){
- auto fmtChunk = WavFmtHeader{};
- rawWavFile.read(reinterpret_cast<char *>(&fmtChunk), sizeof(fmtChunk));
- std::cout << convert4ByteUIntToString(chunk.chunkId);
- }
- if(chunk.chunkId == CT_data){
- std::cout << "DATA FOUND";
- }
- rawWavFile.seekg(next_chunk);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement