27 #if __cplusplus < 201103L
28 # warning C++11 or higher required for libgig
45 # define CHUNK_ID_RIFF 0x52494646
46 # define CHUNK_ID_RIFX 0x52494658
47 # define CHUNK_ID_LIST 0x4C495354
49 # define LIST_TYPE_INFO 0x494E464F
50 # define CHUNK_ID_ICMT 0x49434D54
51 # define CHUNK_ID_ICOP 0x49434F50
52 # define CHUNK_ID_ICRD 0x49435244
53 # define CHUNK_ID_IENG 0x49454E47
54 # define CHUNK_ID_INAM 0x494E414D
55 # define CHUNK_ID_IPRD 0x49505244
56 # define CHUNK_ID_ISFT 0x49534654
58 # define CHUNK_ID_SMPL 0x736D706C
61 # define CHUNK_ID_RIFF 0x46464952
62 # define CHUNK_ID_RIFX 0x58464952
63 # define CHUNK_ID_LIST 0x5453494C
65 # define LIST_TYPE_INFO 0x4F464E49
66 # define CHUNK_ID_ICMT 0x544D4349
67 # define CHUNK_ID_ICOP 0x504F4349
68 # define CHUNK_ID_ICRD 0x44524349
69 # define CHUNK_ID_IENG 0x474E4549
70 # define CHUNK_ID_INAM 0x4D414E49
71 # define CHUNK_ID_IPRD 0x44525049
72 # define CHUNK_ID_ISFT 0x54465349
74 # define CHUNK_ID_SMPL 0x6C706D73
78 #define CHUNK_HEADER_SIZE(fileOffsetSize) (4 + fileOffsetSize)
79 #define LIST_HEADER_SIZE(fileOffsetSize) (8 + fileOffsetSize)
80 #define RIFF_HEADER_SIZE(fileOffsetSize) (8 + fileOffsetSize)
108 typedef std::string String;
115 stream_mode_read = 0,
116 stream_mode_read_write = 1,
117 stream_mode_closed = 2
123 stream_end_reached = 1,
177 std::vector<progress_t>
subdivide(
int iSubtasks)
const;
178 std::vector<progress_t>
subdivide(std::vector<float> vSubTaskPortions)
const;
236 mutable std::map<std::thread::id,file_offset_t> byThread;
237 mutable std::mutex mutex;
241 Chunk(File* pFile, List* pParent, uint32_t uiChunkID,
file_offset_t ullBodySize);
245 inline static String convertToString(uint32_t word) {
246 return String((
const char*)&word,
sizeof(word));
286 typedef std::map<uint32_t,
RIFF::
Chunk*> ChunkMap;
287 typedef std::vector<
Chunk*> ChunkList;
288 typedef std::set<
Chunk*> ChunkSet;
291 ChunkList* pSubChunks;
292 ChunkMap* pSubChunksMap;
293 ChunkList::iterator ChunksIterator;
294 ChunkList::iterator ListIterator;
300 void LoadSubChunks(
progress_t* pProgress = NULL);
301 void LoadSubChunksRecursively(
progress_t* pProgress = NULL);
305 void DeleteChunkList();
328 File(uint32_t FileType);
329 File(
const String& path);
334 String GetFileName()
const;
335 void SetFileName(
const String& path);
336 Handle FileHandle()
const;
342 int GetFileOffsetSize()
const;
343 int GetRequiredFileOffsetSize();
344 bool IsIOPerThread()
const;
345 void SetIOPerThread(
bool enable);
346 size_t totalDataChunkCount()
const;
347 size_t totalListChunkCount()
const;
348 size_t totalChunkCount()
const;
350 virtual void Save(
progress_t* pProgress = NULL);
351 virtual void Save(
const String& path,
progress_t* pProgress = NULL);
359 struct IO : HandlePair {
361 mutable std::map<std::thread::id,HandlePair> byThread;
362 mutable std::mutex mutex;
370 size_t nDataChunkCount;
371 size_t nListChunkCount;
373 Handle FileWriteHandle()
const;
374 HandlePair FileHandlePair()
const;
379 void __openExistingFile(
const String& path, uint32_t* FileType = NULL);
390 HandlePair& FileHandlePairUnsafeRef();
391 bool SetModeInternal(
stream_mode_t NewMode,
bool* pResetPos);
403 void PrintMessage()
const;
408 static String assemble(String format, va_list arg);
file_offset_t WriteInt16(int16_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 16 Bit signed integer words from the buffer pointed by pData to the chunk'...
virtual void __resetPos()
Sets Chunk's read/write position to zero.
void Resize(file_offset_t NewSize)
Resize chunk.
int8_t ReadInt8()
Reads one 8 Bit signed integer word and increments the position within the chunk.
uint32_t ReadUint32()
Reads one 32 Bit unsigned integer word and increments the position within the chunk.
stream_state_t GetState() const
Returns the current state of the chunk object.
file_offset_t SetPos(file_offset_t Where, stream_whence_t Whence=stream_start)
Sets the position within the chunk body, thus within the data portion of the chunk (in bytes).
file_offset_t GetFilePos() const
Current, actual offset in file of current chunk data body read/write position.
void ReleaseChunkData()
Free loaded chunk body from RAM.
file_offset_t Write(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Writes WordCount number of data words with given WordSize from the buffer pointed by pData.
file_offset_t RemainingBytes() const
Returns the number of bytes left to read in the chunk body.
int16_t ReadInt16()
Reads one 16 Bit signed integer word and increments the position within the chunk.
virtual file_offset_t WriteChunk(file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL)
Write chunk persistently e.g.
file_offset_t GetPos() const
Current read/write position within the chunk data body (starting with 0).
file_offset_t WriteInt32(int32_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 32 Bit signed integer words from the buffer pointed by pData to the chunk'...
file_offset_t ReadSceptical(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Just an internal wrapper for the main Read() method with additional Exception throwing on errors.
virtual file_offset_t RequiredPhysicalSize(int fileOffsetSize)
Returns the actual total size in bytes (including header) of this Chunk if being stored to a file.
file_offset_t Read(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Reads WordCount number of data words with given WordSize and copies it into a buffer pointed by pData...
uint32_t GetChunkID() const
Chunk ID in unsigned integer representation.
void * LoadChunkData()
Load chunk body into RAM.
String GetChunkIDString() const
Returns the String representation of the chunk's ID (e.g.
uint8_t ReadUint8()
Reads one 8 Bit unsigned integer word and increments the position within the chunk.
List * GetParent() const
Returns pointer to the chunk's parent list chunk.
file_offset_t WriteInt8(int8_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 8 Bit signed integer words from the buffer pointed by pData to the chunk's...
file_offset_t WriteUint16(uint16_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 16 Bit unsigned integer words from the buffer pointed by pData to the chun...
file_offset_t WriteUint32(uint32_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 32 Bit unsigned integer words from the buffer pointed by pData to the chun...
void ReadString(String &s, int size)
Reads a null-padded string of size characters and copies it into the string s.
uint16_t ReadUint16()
Reads one 16 Bit unsigned integer word and increments the position within the chunk.
file_offset_t GetSize() const
Chunk size in bytes (without header, thus the chunk data body)
File * GetFile() const
Returns pointer to the chunk's File object.
int32_t ReadInt32()
Reads one 32 Bit signed integer word and increments the position within the chunk.
file_offset_t WriteUint8(uint8_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 8 Bit unsigned integer words from the buffer pointed by pData to the chunk...
file_offset_t GetNewSize() const
New chunk size if it was modified with Resize(), otherwise value returned will be equal to GetSize().
Will be thrown whenever an error occurs while handling a RIFF file.
layout_t Layout
An ordinary RIFF file is always set to layout_standard.
int Handle
OS dependent type serving as file handle / descriptor for OS dependent file I/O operations.
int FileOffsetSize
Size of file offsets (in bytes) when this file was opened (or saved the last time).
size_t CountSubLists()
Returns number of sublists within the list.
Chunk * GetSubChunk(uint32_t ChunkID)
Returns subchunk with chunk ID ChunkID within this chunk list.
virtual file_offset_t RequiredPhysicalSize(int fileOffsetSize)
Returns the actual total size in bytes (including List chunk header and all subchunks) of this List C...
void MoveSubChunk(Chunk *pSrc, Chunk *pDst)
Moves a sub chunk witin this list.
List * GetFirstSubList()
Returns the first sublist within the list (that is a subchunk with chunk ID "LIST").
List * AddSubList(uint32_t uiListType)
Creates a new list sub chunk.
Chunk * GetFirstSubChunk()
Returns the first subchunk within the list (which may be an ordinary chunk as well as a list chunk).
virtual file_offset_t WriteChunk(file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL)
Write list chunk persistently e.g.
void DeleteSubChunk(Chunk *pSubChunk)
Removes a sub chunk.
List * GetSubListAt(size_t pos)
Returns sublist chunk with list type ListType at supplied pos position among all subchunks of type Li...
size_t CountSubChunks()
Returns number of subchunks within the list (including list chunks).
List * GetSubList(uint32_t ListType)
Returns sublist chunk with list type ListType within this chunk list.
Chunk * GetNextSubChunk()
Returns the next subchunk within the list (which may be an ordinary chunk as well as a list chunk).
uint32_t GetListType() const
Returns unsigned integer representation of the list's ID.
String GetListTypeString() const
Returns string representation of the lists's id.
List * GetNextSubList()
Returns the next sublist (that is a subchunk with chunk ID "LIST") within the list.
Chunk * AddSubChunk(uint32_t uiChunkID, file_offset_t ullBodySize)
Creates a new sub chunk.
virtual void __resetPos()
Sets List Chunk's read/write position to zero and causes all sub chunks to do the same.
Chunk * GetSubChunkAt(size_t pos)
Returns subchunk at supplied pos position within this chunk list.
RIFF specific classes and definitions.
String libraryVersion()
Returns version of this C++ library.
stream_whence_t
File stream position dependent to these relations.
stream_state_t
Current state of the file stream.
String libraryName()
Returns the name of this C++ library.
offset_size_t
Size of RIFF file offsets used in all RIFF chunks' headers.
@ offset_size_64bit
Always use 64 bit offsets (even for files smaller than 4 GB).
@ offset_size_auto
Use 32 bit offsets for files smaller than 4 GB, use 64 bit offsets for files equal or larger than 4 G...
@ offset_size_32bit
Always use 32 bit offsets (even for files larger than 4 GB).
stream_mode_t
Whether file stream is open in read or in read/write mode.
layout_t
General RIFF chunk structure of a RIFF file.
@ layout_standard
Standard RIFF file layout: First chunk in file is a List chunk which contains all other chunks and th...
@ layout_flat
Not a "real" RIFF file: First chunk in file is an ordinary data chunk, not a List chunk,...
endian_t
Alignment of data bytes in memory (system dependant).
uint64_t file_offset_t
Type used by libgig for handling file positioning during file I/O tasks.
Used for indicating the progress of a certain task.
float __range_min
Only for internal usage, do not modify!
void * __private
Only for internal usage, do not modify!
void(* callback)(progress_t *)
Callback function pointer which has to be assigned to a function for progress notification.
float factor
Reflects current progress as value between 0.0 and 1.0.
void * custom
This pointer can be used for arbitrary data.
const char * activity
Text which describes current ongoing action (e.g. to be displayed along a progress bar).
std::vector< progress_t > subdivide(int iSubtasks) const
Divides this progress task into the requested amount of equal weighted sub-progress tasks and returns...
float __range_max
Only for internal usage, do not modify!