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 60 #else // little endian 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 76 #endif // WORDS_BIGENDIAN 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 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...
int16_t ReadInt16()
Reads one 16 Bit signed integer word and increments the position within the chunk.
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...
int FileOffsetSize
Size of file offsets (in bytes) when this file was opened (or saved the last time).
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...
size_t CountSubLists()
Returns number of sublists within the list.
stream_whence_t
File stream position dependent to these relations.
Chunk * GetFirstSubChunk()
Returns the first subchunk within the list (which may be an ordinary chunk as well as a list chunk)...
String libraryName()
Returns the name of this C++ library.
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 GetSize() const
Chunk size in bytes (without header, thus the chunk data body)
List * GetSubListAt(size_t pos)
Returns sublist chunk with list type ListType at supplied pos position among all subchunks of type Li...
layout_t Layout
An ordinary RIFF file is always set to layout_standard.
void(* callback)(progress_t *)
Callback function pointer which has to be assigned to a function for progress notification.
stream_state_t
Current state of the file stream.
void ReadString(String &s, int size)
Reads a null-padded string of size characters and copies it into the string s.
String libraryVersion()
Returns version of this C++ library.
List * GetSubList(uint32_t ListType)
Returns sublist chunk with list type ListType within this chunk list.
void DeleteSubChunk(Chunk *pSubChunk)
Removes a sub chunk.
Use 32 bit offsets for files smaller than 4 GB, use 64 bit offsets for files equal or larger than 4 G...
List * GetFirstSubList()
Returns the first sublist within the list (that is a subchunk with chunk ID "LIST").
void * __private
Only for internal usage, do not modify!
virtual file_offset_t WriteChunk(file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL)
Write chunk persistently e.g.
stream_mode_t
Whether file stream is open in read or in read/write mode.
String GetListTypeString() const
Returns string representation of the lists's id.
List * GetParent() const
Returns pointer to the chunk's parent list chunk.
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'...
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...
int Handle
OS dependent type serving as file handle / descriptor for OS dependent file I/O operations.
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...
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 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)...
int8_t ReadInt8()
Reads one 8 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 list chunk persistently e.g.
offset_size_t
Size of RIFF file offsets used in all RIFF chunks' headers.
std::vector< progress_t > subdivide(int iSubtasks) const
Divides this progress task into the requested amount of equal weighted sub-progress tasks and returns...
uint64_t file_offset_t
Type used by libgig for handling file positioning during file I/O tasks.
float __range_min
Only for internal usage, do not modify!
Chunk * GetSubChunk(uint32_t ChunkID)
Returns subchunk with chunk ID ChunkID 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)...
int32_t ReadInt32()
Reads one 32 Bit signed integer word and increments the position within the chunk.
layout_t
General RIFF chunk structure of a RIFF file.
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...
uint32_t ReadUint32()
Reads one 32 Bit unsigned integer word and increments the position within the chunk.
uint32_t GetChunkID() const
Chunk ID in unsigned integer representation.
void * custom
This pointer can be used for arbitrary data.
file_offset_t RemainingBytes() const
Returns the number of bytes left to read in the chunk body.
Used for indicating the progress of a certain task.
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...
uint32_t GetListType() const
Returns unsigned integer representation of the list's ID.
Not a "real" RIFF file: First chunk in file is an ordinary data chunk, not a List chunk...
Chunk * GetSubChunkAt(size_t pos)
Returns subchunk at supplied pos position within this chunk list.
virtual void __resetPos()
Sets Chunk's read/write position to zero.
uint16_t ReadUint16()
Reads one 16 Bit unsigned integer word and increments the position within the chunk.
virtual void __resetPos()
Sets List Chunk's read/write position to zero and causes all sub chunks to do the same...
endian_t
Alignment of data bytes in memory (system dependant).
void * LoadChunkData()
Load chunk body into RAM.
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...
Standard RIFF file layout: First chunk in file is a List chunk which contains all other chunks and th...
void Resize(file_offset_t NewSize)
Resize chunk.
List * AddSubList(uint32_t uiListType)
Creates a new list sub chunk.
RIFF specific classes and definitions.
float factor
Reflects current progress as value between 0.0 and 1.0.
file_offset_t GetNewSize() const
New chunk size if it was modified with Resize(), otherwise value returned will be equal to GetSize()...
void MoveSubChunk(Chunk *pSrc, Chunk *pDst)
Moves a sub chunk witin this list.
Always use 32 bit offsets (even for files larger than 4 GB).
File * GetFile() const
Returns pointer to the chunk's File object.
size_t CountSubChunks()
Returns number of subchunks within the list (including list chunks).
stream_state_t GetState() const
Returns the current state of the chunk object.
float __range_max
Only for internal usage, do not modify!
String GetChunkIDString() const
Returns the String representation of the chunk's ID (e.g.
Will be thrown whenever an error occurs while handling a RIFF file.
file_offset_t GetFilePos() const
Current, actual offset in file of current chunk data body read/write position.
Always use 64 bit offsets (even for files smaller than 4 GB).
void ReleaseChunkData()
Free loaded chunk body from RAM.
const char * activity
Text which describes current ongoing action (e.g. to be displayed along a progress bar)...
file_offset_t GetPos() const
Current read/write position within the chunk data body (starting with 0).
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.
uint8_t ReadUint8()
Reads one 8 Bit unsigned integer word and increments the position within the chunk.