libgig
4.3.0
|
#include <RIFF.h>
Public Member Functions | |
Chunk (File *pFile, file_offset_t StartPos, List *Parent) | |
String | GetChunkIDString () const |
Returns the String representation of the chunk's ID (e.g. More... | |
uint32_t | GetChunkID () const |
Chunk ID in unsigned integer representation. | |
File * | GetFile () const |
Returns pointer to the chunk's File object. | |
List * | GetParent () const |
Returns pointer to the chunk's parent list chunk. | |
file_offset_t | GetSize () const |
Chunk size in bytes (without header, thus the chunk data body) | |
file_offset_t | GetNewSize () const |
New chunk size if it was modified with Resize(), otherwise value returned will be equal to GetSize(). | |
file_offset_t | GetPos () const |
Position within the chunk data body (starting with 0). | |
file_offset_t | GetFilePos () const |
Current, actual offset in file of current chunk data body read/write position. | |
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). More... | |
file_offset_t | RemainingBytes () const |
Returns the number of bytes left to read in the chunk body. More... | |
stream_state_t | GetState () const |
Returns the current state of the chunk object. More... | |
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. More... | |
file_offset_t | ReadInt8 (int8_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 8 Bit signed integer words and copies it into the buffer pointed by pData. More... | |
file_offset_t | ReadUint8 (uint8_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 8 Bit unsigned integer words and copies it into the buffer pointed by pData. More... | |
file_offset_t | ReadInt16 (int16_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 16 Bit signed integer words and copies it into the buffer pointed by pData. More... | |
file_offset_t | ReadUint16 (uint16_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 16 Bit unsigned integer words and copies it into the buffer pointed by pData. More... | |
file_offset_t | ReadInt32 (int32_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 32 Bit signed integer words and copies it into the buffer pointed by pData. More... | |
file_offset_t | ReadUint32 (uint32_t *pData, file_offset_t WordCount=1) |
Reads WordCount number of 32 Bit unsigned integer words and copies it into the buffer pointed by pData. More... | |
int8_t | ReadInt8 () |
Reads one 8 Bit signed integer word and increments the position within the chunk. More... | |
uint8_t | ReadUint8 () |
Reads one 8 Bit unsigned integer word and increments the position within the chunk. More... | |
int16_t | ReadInt16 () |
Reads one 16 Bit signed integer word and increments the position within the chunk. More... | |
uint16_t | ReadUint16 () |
Reads one 16 Bit unsigned integer word and increments the position within the chunk. More... | |
int32_t | ReadInt32 () |
Reads one 32 Bit signed integer word and increments the position within the chunk. More... | |
uint32_t | ReadUint32 () |
Reads one 32 Bit unsigned integer word and increments the position within the chunk. More... | |
void | ReadString (String &s, int size) |
Reads a null-padded string of size characters and copies it into the string s. More... | |
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. More... | |
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 body, directly to the actual "physical" file. More... | |
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's body, directly to the actual "physical" file. More... | |
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's body, directly to the actual "physical" file. More... | |
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 chunk's body, directly to the actual "physical" file. More... | |
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's body, directly to the actual "physical" file. More... | |
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 chunk's body, directly to the actual "physical" file. More... | |
void * | LoadChunkData () |
Load chunk body into RAM. More... | |
void | ReleaseChunkData () |
Free loaded chunk body from RAM. More... | |
void | Resize (file_offset_t NewSize) |
Resize chunk. More... | |
Protected Member Functions | |
Chunk (File *pFile) | |
Chunk (File *pFile, List *pParent, uint32_t uiChunkID, file_offset_t ullBodySize) | |
void | ReadHeader (file_offset_t filePos) |
void | WriteHeader (file_offset_t filePos) |
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. More... | |
virtual file_offset_t | WriteChunk (file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL) |
Write chunk persistently e.g. More... | |
virtual void | __resetPos () |
Sets Chunk's read/write position to zero. | |
Static Protected Member Functions | |
static String | convertToString (uint32_t word) |
Protected Attributes | |
uint32_t | ChunkID |
file_offset_t | ullCurrentChunkSize |
file_offset_t | ullNewChunkSize |
List * | pParent |
File * | pFile |
file_offset_t | ullStartPos |
file_offset_t | ullPos |
uint8_t * | pChunkData |
file_offset_t | ullChunkDataSize |
Provides convenient methods to access data of ordinary RIFF chunks in general.
String RIFF::Chunk::GetChunkIDString | ( | ) | const |
stream_state_t RIFF::Chunk::GetState | ( | ) | const |
Returns the current state of the chunk object.
Following values are possible:
Definition at line 343 of file RIFF.cpp.
References RIFF::File::hFileRead.
void * RIFF::Chunk::LoadChunkData | ( | ) |
Load chunk body into RAM.
Loads the whole chunk body into memory. You can modify the data in RAM and save the data by calling File::Save() afterwards.
Caution: the buffer pointer will be invalidated once File::Save() was called. You have to call LoadChunkData() again to get a new, valid pointer whenever File::Save() was called.
You can call LoadChunkData() again if you previously scheduled to enlarge this chunk with a Resize() call. In that case the buffer will be enlarged to the new, scheduled chunk size and you can already place the new chunk data to the buffer and finally call File::Save() to enlarge the chunk physically and write the new data in one rush. This approach is definitely recommended if you have to enlarge and write new data to a lot of chunks.
Exception | if data buffer could not be enlarged |
Definition at line 865 of file RIFF.cpp.
References GetSize(), and RIFF::File::hFileRead.
Referenced by DLS::Sample::LoadSampleData(), gig::File::RebuildSampleChecksumTable(), DLS::Articulation::UpdateChunks(), DLS::Resource::UpdateChunks(), DLS::Sampler::UpdateChunks(), DLS::Sample::UpdateChunks(), DLS::Region::UpdateChunks(), DLS::Instrument::UpdateChunks(), DLS::File::UpdateChunks(), gig::DimensionRegion::UpdateChunks(), gig::Sample::UpdateChunks(), gig::Region::UpdateChunks(), gig::Script::UpdateChunks(), gig::Instrument::UpdateChunks(), gig::File::UpdateChunks(), gig::File::VerifySampleChecksumTable(), and WriteChunk().
file_offset_t RIFF::Chunk::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.
The buffer has to be allocated and be sure to provide the correct WordSize, as this will be important and taken into account for eventual endian correction (swapping of bytes due to different native byte order of a system). The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of data words to read |
WordSize | size of each data word to read |
Definition at line 374 of file RIFF.cpp.
References RIFF::File::hFileRead, and SetPos().
Referenced by DLS::Articulation::Articulation(), DLS::File::File(), DLS::Instrument::Instrument(), DLS::Sample::Read(), gig::Sample::Read(), Korg::KSFSample::Read(), ReadSceptical(), DLS::Resource::Resource(), gig::Sample::Sample(), and DLS::File::UpdateChunks().
int16_t RIFF::Chunk::ReadInt16 | ( | ) |
Reads one 16 Bit signed integer word and increments the position within the chunk.
Endian correction will automatically be done if needed.
RIFF::Exception | if an error occurred |
Definition at line 784 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadInt16 | ( | int16_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 16 Bit signed integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. Endian correction will automatically be done if needed. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 16 Bit signed integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 591 of file RIFF.cpp.
References ReadSceptical().
Referenced by gig::Sample::Sample().
int32_t RIFF::Chunk::ReadInt32 | ( | ) |
Reads one 32 Bit signed integer word and increments the position within the chunk.
Endian correction will automatically be done if needed.
RIFF::Exception | if an error occurred |
Definition at line 818 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadInt32 | ( | int32_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 32 Bit signed integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. Endian correction will automatically be done if needed. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 32 Bit signed integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 665 of file RIFF.cpp.
References ReadSceptical().
Referenced by gig::Sample::Sample().
int8_t RIFF::Chunk::ReadInt8 | ( | ) |
Reads one 8 Bit signed integer word and increments the position within the chunk.
RIFF::Exception | if an error occurred |
Definition at line 751 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadInt8 | ( | int8_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 8 Bit signed integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 8 Bit signed integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 517 of file RIFF.cpp.
References ReadSceptical().
void RIFF::Chunk::ReadString | ( | String & | s, |
int | size | ||
) |
Reads a null-padded string of size characters and copies it into the string s.
The position within the chunk will automatically be incremented.
s | destination string |
size | number of characters to read |
RIFF::Exception | if an error occurred or less than size characters could be read! |
Definition at line 719 of file RIFF.cpp.
References ReadSceptical().
uint16_t RIFF::Chunk::ReadUint16 | ( | ) |
Reads one 16 Bit unsigned integer word and increments the position within the chunk.
Endian correction will automatically be done if needed.
RIFF::Exception | if an error occurred |
Definition at line 801 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadUint16 | ( | uint16_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 16 Bit unsigned integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. Endian correction will automatically be done if needed. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 8 Bit unsigned integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 628 of file RIFF.cpp.
References ReadSceptical().
Referenced by DLS::Sample::Sample().
uint32_t RIFF::Chunk::ReadUint32 | ( | ) |
Reads one 32 Bit unsigned integer word and increments the position within the chunk.
Endian correction will automatically be done if needed.
RIFF::Exception | if an error occurred |
Definition at line 835 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadUint32 | ( | uint32_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 32 Bit unsigned integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. Endian correction will automatically be done if needed. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 32 Bit unsigned integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 702 of file RIFF.cpp.
References ReadSceptical().
Referenced by DLS::Articulation::Articulation(), DLS::File::File(), DLS::Instrument::Instrument(), and DLS::Sample::Sample().
uint8_t RIFF::Chunk::ReadUint8 | ( | ) |
Reads one 8 Bit unsigned integer word and increments the position within the chunk.
RIFF::Exception | if an error occurred |
Definition at line 767 of file RIFF.cpp.
References ReadSceptical().
file_offset_t RIFF::Chunk::ReadUint8 | ( | uint8_t * | pData, |
file_offset_t | WordCount = 1 |
||
) |
Reads WordCount number of 8 Bit unsigned integer words and copies it into the buffer pointed by pData.
The buffer has to be allocated. The position within the chunk will automatically be incremented.
pData | destination buffer |
WordCount | number of 8 Bit unsigned integers to read |
RIFF::Exception | if an error occurred or less than WordCount integers could be read! |
Definition at line 554 of file RIFF.cpp.
References ReadSceptical().
void RIFF::Chunk::ReleaseChunkData | ( | ) |
Free loaded chunk body from RAM.
Frees loaded chunk body data from memory (RAM). You should call File::Save() before calling this method if you modified the data to make the changes persistent.
Definition at line 911 of file RIFF.cpp.
Referenced by DLS::Sample::ReleaseSampleData(), and DLS::Sample::~Sample().
file_offset_t RIFF::Chunk::RemainingBytes | ( | ) | const |
Returns the number of bytes left to read in the chunk body.
When reading data from the chunk using the Read*() Methods, the position within the chunk data (that is the chunk body) will be incremented by the number of read bytes and RemainingBytes() returns how much data is left to read from the current position to the end of the chunk data.
Definition at line 312 of file RIFF.cpp.
Referenced by gig::Sample::Read().
|
protectedvirtual |
Returns the actual total size in bytes (including header) of this Chunk if being stored to a file.
fileOffsetSize | - RIFF file offset size (in bytes) assumed when being saved to a file |
Reimplemented in RIFF::List.
void RIFF::Chunk::Resize | ( | file_offset_t | NewSize | ) |
Resize chunk.
Resizes this chunk's body, that is the actual size of data possible to be written to this chunk. This call will return immediately and just schedule the resize operation. You should call File::Save() to actually perform the resize operation(s) "physically" to the file. As this can take a while on large files, it is recommended to call Resize() first on all chunks which have to be resized and finally to call File::Save() to perform all those resize operations in one rush.
Caution: You cannot directly write to enlarged chunks before calling File::Save() as this might exceed the current chunk's body boundary!
NewSize | - new chunk body size in bytes (must be greater than zero) |
RIFF::Exception | if NewSize is less than 1 or unrealistic large |
Definition at line 936 of file RIFF.cpp.
Referenced by RIFF::List::AddSubChunk(), gig::File::RebuildSampleChecksumTable(), DLS::Sample::Resize(), DLS::Articulation::UpdateChunks(), DLS::Sampler::UpdateChunks(), DLS::File::UpdateChunks(), gig::DimensionRegion::UpdateChunks(), gig::Script::UpdateChunks(), gig::Instrument::UpdateChunks(), and gig::File::UpdateChunks().
file_offset_t RIFF::Chunk::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).
Caution: the position will be reset to zero whenever File::Save() was called.
Where | - position offset (in bytes) |
Whence | - optional: defines to what Where relates to, if omitted Where relates to beginning of the chunk data |
Definition at line 280 of file RIFF.cpp.
Referenced by DLS::Articulation::Articulation(), DLS::Sample::CopyAssign(), DLS::File::File(), DLS::Instrument::Instrument(), gig::Sample::Read(), Read(), DLS::Resource::Resource(), DLS::Sample::Sample(), gig::Sample::Sample(), DLS::Sample::SetPos(), gig::Sample::SetPos(), Korg::KSFSample::SetPos(), gig::File::SetSampleChecksum(), and Write().
file_offset_t RIFF::Chunk::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.
Be sure to provide the correct WordSize, as this will be important and taken into account for eventual endian correction (swapping of bytes due to different native byte order of a system). The position within the chunk will automatically be incremented.
pData | source buffer (containing the data) |
WordCount | number of data words to write |
WordSize | size of each data word to write |
RIFF::Exception | if write operation would exceed current chunk size or any IO error occurred |
Definition at line 444 of file RIFF.cpp.
References RIFF::File::hFileWrite, and SetPos().
Referenced by DLS::Sample::Write(), gig::Sample::Write(), WriteInt16(), WriteInt32(), WriteInt8(), WriteUint16(), WriteUint32(), and WriteUint8().
|
protectedvirtual |
Write chunk persistently e.g.
to disk.
Stores the chunk persistently to its actual "physical" file.
ullWritePos | - position within the "physical" file where this chunk should be written to |
ullCurrentDataOffset | - offset of current (old) data within the file |
pProgress | - optional: callback function for progress notification |
Reimplemented in RIFF::List.
Definition at line 958 of file RIFF.cpp.
References RIFF::File::FileOffsetSize, RIFF::File::hFileRead, RIFF::File::hFileWrite, and LoadChunkData().
file_offset_t RIFF::Chunk::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's body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 16 Bit signed integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 612 of file RIFF.cpp.
References Write().
file_offset_t RIFF::Chunk::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's body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 32 Bit signed integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 686 of file RIFF.cpp.
References Write().
file_offset_t RIFF::Chunk::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 body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 8 Bit signed integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 538 of file RIFF.cpp.
References Write().
file_offset_t RIFF::Chunk::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 chunk's body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 16 Bit unsigned integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 649 of file RIFF.cpp.
References Write().
file_offset_t RIFF::Chunk::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 chunk's body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 32 Bit unsigned integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 740 of file RIFF.cpp.
References Write().
Referenced by gig::File::SetSampleChecksum().
file_offset_t RIFF::Chunk::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's body, directly to the actual "physical" file.
The position within the chunk will automatically be incremented. Note: you cannot write beyond the boundaries of the chunk, to append data to the chunk call Resize() before.
pData | source buffer (containing the data) |
WordCount | number of 8 Bit unsigned integers to write |
RIFF::Exception | if an IO error occurred |
Definition at line 575 of file RIFF.cpp.
References Write().