Esempio n. 1
0
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;
}
Esempio n. 2
0
		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&)
			{
			}
		}