inline bool tapetums::Wave::ReadAllChunks() { auto p = file.pointer(); // RIFFチャンクの読み込み if ( ! ReadHeader(p) ) { return false; } // データサイズを取得 const auto end = p + *(uint32_t*)(p + 4) + 8; // ポインタを進める p += sizeof(RiffChunk); char chunkId[4]; uint32_t chunkSize; // RIFFサブチャンクの読み込み while ( p < end ) { ::memcpy(chunkId, p, sizeof(chunkId)); ::memcpy(&chunkSize, p + 4, sizeof(chunkSize)); // チャンクデータの読み込み if ( 0 == ::memcmp(chunkId, chunkId_ds64, sizeof(chunkId)) ) { // 'ds64' chunk ReadDataSize64Chunk(p + 8, chunkSize); } else if ( 0 == ::memcmp(chunkId, chunkId_fmt, sizeof(chunkId)) ) { // 'fmt ' chunk if ( ! ReadFormatChunk(p + 8) ) { return false; } } else if ( 0 == memcmp(chunkId, chunkId_data, sizeof(chunkId)) ) { // 'data' chunk if ( chunkSize < UINT32_MAX ) { data_size = chunkSize; } data_offset = p + 8; } // ポインタを次のチャンクまで進める p = ForwardPointer(p, chunkId, chunkSize); if ( nullptr == p ) { return false; } } return true; }
wave_reader(char* file) : file(file), stream(file, file_stream::Readable), size(0), compression(Unknown), read_samples(0) { try { ReadHeader(); ReadFormatChunk(); total_samples = ReadDataHeader() / 2; data_start = stream.get_position(); } catch (wave_reader_exception&) { } }