186 BufferStreamReadOnly stream{chunkData};
188 std::optional<ChunkFMT> chunk = std::nullopt;
189 if (chunkData.size() >=
sizeof(uint32_t) * 2 +
sizeof(uint16_t) * 4) {
191 const auto fmtExtraCompressionInfoLength = stream.size() - 16;
192 stream >> chunk->
format >> chunk->channels >> chunk->samplesPerSecond >> chunk->averageBytesPerSecond >> chunk->blockAlign >> chunk->bitsPerSample;
193 if (fmtExtraCompressionInfoLength) {
194 chunk->extraCompressionInfo = stream.read_bytes(fmtExtraCompressionInfoLength);
198 }
else if constexpr (Type ==
CHUNK_CUE) {
199 std::optional<ChunkCUE> chunk = std::nullopt;
200 if (stream.size() >=
sizeof(uint32_t) && stream.size() -
sizeof(uint32_t) %
sizeof(
ChunkCUE::CuePoint) == 0) {
202 const auto cueNumPoints = stream.read<uint32_t>();
203 for (uint32_t i = 0; i < cueNumPoints; i++) {
206 chunk->cuePoints.push_back(point);
211 std::optional<ChunkPLST> chunk = std::nullopt;
212 if (stream.size() >=
sizeof(uint32_t) && (stream.size() -
sizeof(uint32_t)) %
sizeof(
ChunkPLST::Segment) == 0) {
214 const auto plstNumSegments = stream.read<uint32_t>();
215 for (uint32_t i = 0; i < plstNumSegments; i++) {
218 chunk->segments.push_back(segment);
223 std::optional<ChunkFACT> chunk = std::nullopt;
224 if (stream.size() >=
sizeof(uint32_t)) {
226 const auto factExtraCompressionInfoLength = stream.size() -
sizeof(uint32_t);
228 if (factExtraCompressionInfoLength) {
229 chunk->extraCompressionInfo = stream.read_bytes(factExtraCompressionInfoLength);
234 std::optional<ChunkSMPL> chunk = std::nullopt;
235 if (stream.size() >=
sizeof(uint32_t) * 10) {
237 stream >> chunk->
manufacturer >> chunk->product >> chunk->samplePeriod >> chunk->midiUnityNote >> chunk->midiPitchFraction >> chunk->smpteFormat >> chunk->smpteOffset >> chunk->sampleLoops >> chunk->samplerData;
238 const auto smplNumLoops = stream.read<uint32_t>();
239 for (uint32_t i = 0; i < smplNumLoops; i++) {
241 auto& sampleLoop = chunk->loops.emplace_back();
242 stream >> sampleLoop.id >> sampleLoop.type >> sampleLoop.start >> sampleLoop.end >> sampleLoop.fraction >> sampleLoop.playCount;
247 std::optional<ChunkINST> chunk = std::nullopt;
248 if (stream.size() ==
sizeof(uint8_t) * 7) {
250 stream >> chunk->
unshiftedNote >> chunk->fineTune >> chunk->gain >> chunk->lowNote >> chunk->highNote >> chunk->lowVelocity >> chunk->highVelocity;
254 std::optional<ChunkCSET> chunk = std::nullopt;
255 if (stream.size() ==
sizeof(uint16_t) * 4) {
257 stream >> chunk->
codePage >> chunk->countryCode >> chunk->language >> chunk->dialect;
260 }
else if constexpr (Type ==
CHUNK_MD5) {
261 std::optional<ChunkMD5> chunk = std::nullopt;
262 if (stream.size() ==
sizeof(uint8_t) * 16) {
264 stream >> chunk->
md5;
268 return this->
hasNthChunk(Type, n) ? std::optional{std::move(chunkData)} : std::nullopt;