58 return (uint32_t(uint8_t(a))) | (uint32_t(uint8_t(b)) << 8)
59 | (uint32_t(uint8_t(c)) << 16) | (uint32_t(uint8_t(d)) << 24);
82 if(!read_riff_header(r))
87 if(!read_chunk_header(r, ch))
91 if(!parse_fmt_chunk(r, ch))
100 if(!skip_chunk_payload(r, ch.size))
109 metadata_[metadataCount_].
fourcc = ch.id;
110 metadata_[metadataCount_].
size = ch.size;
114 if(!skip_chunk_payload(r, ch.size))
122 if(r.
read(&pad, 1) != 1)
126 if(haveFmt_ && haveData_)
129 return haveFmt_ && haveData_;
147 fmt_ = WavFormatInfo{};
156 static uint16_t rd_u16(
const uint8_t* b)
158 return uint16_t(b[0]) | (uint16_t(b[1]) << 8);
160 static uint32_t rd_u32(
const uint8_t* b)
162 return uint32_t(b[0]) | (uint32_t(b[1]) << 8) | (uint32_t(b[2]) << 16)
163 | (uint32_t(b[3]) << 24);
166 bool read_exact(IReader& r,
void* dst,
size_t n)
168 return r.read(dst, n) == n;
171 bool read_riff_header(IReader& r)
174 if(!read_exact(r, hdr, 12))
176 uint32_t riff = rd_u32(hdr + 0);
177 uint32_t fileSizeMinus8 = rd_u32(hdr + 4);
178 uint32_t wave = rd_u32(hdr + 8);
181 fileSize_ = fileSizeMinus8 + 8;
183 fileSize_ = r.size();
187 bool read_chunk_header(IReader& r, ChunkHeader& ch)
190 if(!read_exact(r, buf, 8))
193 ch.size = rd_u32(buf + 4);
197 bool skip_chunk_payload(IReader& r, uint32_t sz)
200 uint32_t target = r.position() + sz;
201 return r.seek(target);
204 bool parse_fmt_chunk(IReader& r,
const ChunkHeader& ch)
209 if(!read_exact(r, core, 16))
217 uint32_t consumed = 16;
223 skip_rest_of_chunk(r, ch, consumed);
227 if(ch.size > consumed)
230 uint32_t remain = ch.size - consumed;
234 uint8_t extSizeBuf[2];
235 if(!read_exact(r, extSizeBuf, 2))
238 uint16_t extSize = rd_u16(extSizeBuf);
239 if(extSize >= 22 && remain >= 2 + 22)
242 if(!read_exact(r, ext, 22))
253 uint32_t skip = extSize - 22;
254 if(!skip_bytes(r, skip))
262 if(!skip_bytes(r, remain - 2))
270 if(!skip_bytes(r, remain))
279 bool skip_bytes(IReader& r, uint32_t count)
281 uint32_t target = r.position() + count;
282 return r.seek(target);
286 skip_rest_of_chunk(IReader& r,
const ChunkHeader& ch, uint32_t consumed)
288 if(consumed < ch.size)
289 return skip_bytes(r, ch.size - consumed);
293 WavFormatInfo fmt_{};
294 bool haveFmt_ =
false;
295 bool haveData_ =
false;
296 uint32_t dataOffset_ = 0;
297 uint32_t dataSize_ = 0;
299 int metadataCount_ = 0;
300 uint32_t fileSize_ = 0;
Definition FileReader.h:15
virtual uint32_t position() const =0
virtual size_t read(void *dst, size_t bytes)=0
Definition WavParser.h:64
uint32_t dataSize() const
Definition WavParser.h:134
static constexpr uint32_t FOURCC_INFO
Definition WavParser.h:73
static constexpr int MAX_METADATA_CHUNKS
Definition WavParser.h:75
static constexpr uint32_t FOURCC_DATA
Definition WavParser.h:69
static constexpr uint32_t FOURCC_LIST
Definition WavParser.h:72
const WavFormatInfo & info() const
Definition WavParser.h:132
int metadataCount() const
Definition WavParser.h:136
static constexpr uint32_t FOURCC_JUNK
Definition WavParser.h:70
static constexpr uint32_t FOURCC_FMT
Definition WavParser.h:68
static constexpr uint32_t FOURCC_WAVE
Definition WavParser.h:67
static constexpr uint32_t FOURCC_RIFF
Definition WavParser.h:66
static constexpr uint32_t FOURCC_FACT
Definition WavParser.h:71
uint32_t dataOffset() const
Definition WavParser.h:133
const MetadataEntry * metadata() const
Definition WavParser.h:135
bool parse(IReader &r)
Definition WavParser.h:79
Hardware defines and helpers for daisy field platform.
Definition index.h:2
constexpr uint32_t make_fourcc(char a, char b, char c, char d)
Definition WavParser.h:56
Definition WavParser.h:48
uint32_t offset
Definition WavParser.h:51
uint32_t size
Definition WavParser.h:50
uint32_t fourcc
Definition WavParser.h:49