void wav_reader_c::scan_chunks() { wav_chunk_t new_chunk; bool debug_chunks = debugging_c::requested("wav_reader|wav_reader_chunks"); try { int64_t file_size = m_in->get_size(); while (true) { new_chunk.pos = m_in->getFilePointer(); if (m_in->read(new_chunk.id, 4) != 4) return; new_chunk.len = m_in->read_uint32_le(); if (debug_chunks) mxinfo(boost::format("wav_reader_c::scan_chunks() new chunk at %1% type %2% length %3%\n") % new_chunk.pos % get_displayable_string(new_chunk.id, 4) % new_chunk.len); if (!strncasecmp(new_chunk.id, "data", 4)) m_bytes_in_data_chunks += new_chunk.len; else if (!m_chunks.empty() && !strncasecmp(m_chunks.back().id, "data", 4) && (file_size > 0x100000000ll)) { wav_chunk_t &previous_chunk = m_chunks.back(); int64_t this_chunk_len = file_size - previous_chunk.pos - sizeof(struct chunk_struct); m_bytes_in_data_chunks -= previous_chunk.len; m_bytes_in_data_chunks += this_chunk_len; previous_chunk.len = this_chunk_len; if (debug_chunks) mxinfo(boost::format("wav_reader_c::scan_chunks() hugh data chunk with wrong length at %1%; re-calculated from file size; new length %2%\n") % previous_chunk.pos % previous_chunk.len); break; } m_chunks.push_back(new_chunk); m_in->setFilePointer(new_chunk.len, seek_current); } } catch (...) { } }
std::string get_displayable_string(std::string const &src) { return get_displayable_string(src.c_str(), src.length()); }