Advertisement
Guest User

Untitled

a guest
Nov 24th, 2022
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1.  
  2. const inline std::string WAVE_FORMAT = "WAVE";
  3. constexpr size_t uint32Size = sizeof(uint32_t);
  4.  
  5. void read(std::ifstream &f, void *buffer, std::streamsize size, ChunkInfo *parent){
  6.   if (!f.read(static_cast<char*>(buffer), size)){
  7.     if (f.eof()){
  8.       std::cout << "eof";
  9.       return;
  10.     }
  11.     return;
  12.   }
  13.   if (parent) parent->position += size;
  14. }
  15.  
  16.  
  17. struct ChunkInfo {
  18.   uint32_t chunkId; //"data" = 0x61746164
  19.   uint32_t chunkSize;  //Chunk data bytes
  20.   uint32_t position;
  21. };
  22.  
  23. struct WavFmtHeader {
  24.   uint16_t audioFormat;
  25.   uint16_t numChannels;
  26.   uint32_t sampleRate;
  27.   uint32_t byteRate;
  28.   uint16_t blockAlign;
  29.   uint16_t bitsPerSample;
  30. };
  31.  
  32.  
  33. void SoundProcessor::parseWavFile(std::ifstream &rawWavFile) {
  34.   auto riff = ChunkInfo{};
  35.   auto wave= ChunkInfo{};
  36.   auto chunk= ChunkInfo{};
  37.  
  38.   read(rawWavFile, riff, nullptr);
  39.   if(riff.chunkId != CT_RIFF){
  40.     throw std::runtime_error("First chunk must be RIFF");
  41.   }
  42.   std::cout << "RIFF Size: " << riff.chunkSize << std::endl;
  43.  
  44.   read(rawWavFile, &wave.chunkId, uint32Size, &riff);
  45.   wave.chunkSize = riff.chunkSize - uint32Size;
  46.   wave.position = 0;
  47.  
  48.   if(wave.chunkId != CT_WAVE){
  49.     throw std::runtime_error("File is not a WAV file");
  50.   }
  51.   std::cout << "RIFF Type: " << convert4ByteUIntToString(wave.chunkId) << std::endl;
  52.  
  53.   while (rawWavFile) {
  54.     rawWavFile.read(reinterpret_cast<char *>(&chunk), sizeof(chunk));
  55.     uint32_t next_chunk = static_cast<size_t>(rawWavFile.tellg()) + chunk.chunkSize + (chunk.chunkSize & 1);
  56.     //std::cout << "Chunk: '" << convert4ByteUIntToString(chunk.chunkId) << "', Size: " << chunk.chunkSize << std::endl;
  57.  
  58.     if(chunk.chunkId == CT_fmt){
  59.       auto fmtChunk = WavFmtHeader{};
  60.       rawWavFile.read(reinterpret_cast<char *>(&fmtChunk), sizeof(fmtChunk));
  61.       std::cout << convert4ByteUIntToString(chunk.chunkId);
  62.     }
  63.  
  64.     if(chunk.chunkId == CT_data){
  65.       std::cout << "DATA FOUND";
  66.     }
  67.  
  68.  
  69.     rawWavFile.seekg(next_chunk);
  70.   }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement