2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2007 by Christian Schoenebeck * |
* Copyright (C) 2003-2019 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
28 |
|
|
29 |
#if WORDS_BIGENDIAN |
#if WORDS_BIGENDIAN |
30 |
# define RIFF_TYPE_DLS 0x444C5320 |
# define RIFF_TYPE_DLS 0x444C5320 |
|
# define LIST_TYPE_INFO 0x494E464F |
|
31 |
# define LIST_TYPE_WVPL 0x7776706C |
# define LIST_TYPE_WVPL 0x7776706C |
32 |
# define LIST_TYPE_DWPL 0x6477706C ///< Seen on some files instead of a wvpl list chunk. |
# define LIST_TYPE_DWPL 0x6477706C ///< Seen on some files instead of a wvpl list chunk. |
33 |
# define LIST_TYPE_WAVE 0x77617665 |
# define LIST_TYPE_WAVE 0x77617665 |
41 |
# define CHUNK_ID_IARL 0x4941524C |
# define CHUNK_ID_IARL 0x4941524C |
42 |
# define CHUNK_ID_IART 0x49415254 |
# define CHUNK_ID_IART 0x49415254 |
43 |
# define CHUNK_ID_ICMS 0x49434D53 |
# define CHUNK_ID_ICMS 0x49434D53 |
|
# define CHUNK_ID_ICMT 0x49434D54 |
|
|
# define CHUNK_ID_ICOP 0x49434F50 |
|
|
# define CHUNK_ID_ICRD 0x49435244 |
|
|
# define CHUNK_ID_IENG 0x49454E47 |
|
44 |
# define CHUNK_ID_IGNR 0x49474E52 |
# define CHUNK_ID_IGNR 0x49474E52 |
45 |
# define CHUNK_ID_IKEY 0x494B4559 |
# define CHUNK_ID_IKEY 0x494B4559 |
46 |
# define CHUNK_ID_IMED 0x494D4544 |
# define CHUNK_ID_IMED 0x494D4544 |
|
# define CHUNK_ID_INAM 0x494E414D |
|
|
# define CHUNK_ID_IPRD 0x49505244 |
|
47 |
# define CHUNK_ID_ISBJ 0x4953424A |
# define CHUNK_ID_ISBJ 0x4953424A |
|
# define CHUNK_ID_ISFT 0x49534654 |
|
48 |
# define CHUNK_ID_ISRC 0x49535243 |
# define CHUNK_ID_ISRC 0x49535243 |
49 |
# define CHUNK_ID_ISRF 0x49535246 |
# define CHUNK_ID_ISRF 0x49535246 |
50 |
# define CHUNK_ID_ITCH 0x49544348 |
# define CHUNK_ID_ITCH 0x49544348 |
60 |
# define CHUNK_ID_COLH 0x636F6C68 |
# define CHUNK_ID_COLH 0x636F6C68 |
61 |
# define CHUNK_ID_ARTL 0x6172746C |
# define CHUNK_ID_ARTL 0x6172746C |
62 |
# define CHUNK_ID_ART2 0x61727432 |
# define CHUNK_ID_ART2 0x61727432 |
63 |
|
# define CHUNK_ID_XFIL 0x7866696C |
64 |
|
# define CHUNK_ID_DOXF 0x646F7866 |
65 |
#else // little endian |
#else // little endian |
66 |
# define RIFF_TYPE_DLS 0x20534C44 |
# define RIFF_TYPE_DLS 0x20534C44 |
|
# define LIST_TYPE_INFO 0x4F464E49 |
|
67 |
# define LIST_TYPE_WVPL 0x6C707677 |
# define LIST_TYPE_WVPL 0x6C707677 |
68 |
# define LIST_TYPE_DWPL 0x6C707764 ///< Seen on some files instead of a wvpl list chunk. |
# define LIST_TYPE_DWPL 0x6C707764 ///< Seen on some files instead of a wvpl list chunk. |
69 |
# define LIST_TYPE_WAVE 0x65766177 |
# define LIST_TYPE_WAVE 0x65766177 |
77 |
# define CHUNK_ID_IARL 0x4C524149 |
# define CHUNK_ID_IARL 0x4C524149 |
78 |
# define CHUNK_ID_IART 0x54524149 |
# define CHUNK_ID_IART 0x54524149 |
79 |
# define CHUNK_ID_ICMS 0x534D4349 |
# define CHUNK_ID_ICMS 0x534D4349 |
|
# define CHUNK_ID_ICMT 0x544D4349 |
|
|
# define CHUNK_ID_ICOP 0x504F4349 |
|
|
# define CHUNK_ID_ICRD 0x44524349 |
|
|
# define CHUNK_ID_IENG 0x474E4549 |
|
80 |
# define CHUNK_ID_IGNR 0x524E4749 |
# define CHUNK_ID_IGNR 0x524E4749 |
81 |
# define CHUNK_ID_IKEY 0x59454B49 |
# define CHUNK_ID_IKEY 0x59454B49 |
82 |
# define CHUNK_ID_IMED 0x44454D49 |
# define CHUNK_ID_IMED 0x44454D49 |
|
# define CHUNK_ID_INAM 0x4D414E49 |
|
|
# define CHUNK_ID_IPRD 0x44525049 |
|
83 |
# define CHUNK_ID_ISBJ 0x4A425349 |
# define CHUNK_ID_ISBJ 0x4A425349 |
|
# define CHUNK_ID_ISFT 0x54465349 |
|
84 |
# define CHUNK_ID_ISRC 0x43525349 |
# define CHUNK_ID_ISRC 0x43525349 |
85 |
# define CHUNK_ID_ISRF 0x46525349 |
# define CHUNK_ID_ISRF 0x46525349 |
86 |
# define CHUNK_ID_ITCH 0x48435449 |
# define CHUNK_ID_ITCH 0x48435449 |
96 |
# define CHUNK_ID_COLH 0x686C6F63 |
# define CHUNK_ID_COLH 0x686C6F63 |
97 |
# define CHUNK_ID_ARTL 0x6C747261 |
# define CHUNK_ID_ARTL 0x6C747261 |
98 |
# define CHUNK_ID_ART2 0x32747261 |
# define CHUNK_ID_ART2 0x32747261 |
99 |
|
# define CHUNK_ID_XFIL 0x6C696678 |
100 |
|
# define CHUNK_ID_DOXF 0x66786F64 |
101 |
#endif // WORDS_BIGENDIAN |
#endif // WORDS_BIGENDIAN |
102 |
|
|
103 |
#define DLS_WAVE_FORMAT_PCM 0x0001 |
#define DLS_WAVE_FORMAT_PCM 0x0001 |
108 |
namespace DLS { |
namespace DLS { |
109 |
|
|
110 |
typedef std::string String; |
typedef std::string String; |
111 |
|
typedef RIFF::progress_t progress_t; |
112 |
|
typedef RIFF::file_offset_t file_offset_t; |
113 |
|
|
114 |
/** Quadtuple version number ("major.minor.release.build"). */ |
/** Quadtuple version number ("major.minor.release.build"). */ |
115 |
struct version_t { |
struct version_t { |
128 |
}; |
}; |
129 |
|
|
130 |
/** Connection Sources */ |
/** Connection Sources */ |
131 |
typedef enum { |
enum conn_src_t { |
132 |
// Modulator Sources |
// Modulator Sources |
133 |
conn_src_none = 0x0000, |
conn_src_none = 0x0000, |
134 |
conn_src_lfo = 0x0001, |
conn_src_lfo = 0x0001, |
151 |
conn_src_rpn0 = 0x0100, |
conn_src_rpn0 = 0x0100, |
152 |
conn_src_rpn1 = 0x0101, |
conn_src_rpn1 = 0x0101, |
153 |
conn_src_rpn2 = 0x0102 |
conn_src_rpn2 = 0x0102 |
154 |
} conn_src_t; |
}; |
155 |
|
|
156 |
/** Connection Destinations */ |
/** Connection Destinations */ |
157 |
typedef enum { |
enum conn_dst_t { |
158 |
// Generic Destinations |
// Generic Destinations |
159 |
conn_dst_none = 0x0000, |
conn_dst_none = 0x0000, |
160 |
conn_dst_gain = 0x0001, |
conn_dst_gain = 0x0001, |
196 |
// Filter Destinations |
// Filter Destinations |
197 |
conn_dst_filter_cutoff = 0x0500, |
conn_dst_filter_cutoff = 0x0500, |
198 |
conn_dst_filter_q = 0x0501 |
conn_dst_filter_q = 0x0501 |
199 |
} conn_dst_t; |
}; |
200 |
|
|
201 |
/** Connection Transforms */ |
/** Connection Transforms */ |
202 |
typedef enum { |
enum conn_trn_t { |
203 |
conn_trn_none = 0x0000, |
conn_trn_none = 0x0000, |
204 |
conn_trn_concave = 0x0001, |
conn_trn_concave = 0x0001, |
205 |
conn_trn_convex = 0x0002, |
conn_trn_convex = 0x0002, |
206 |
conn_trn_switch = 0x0003 |
conn_trn_switch = 0x0003 |
207 |
} conn_trn_t; |
}; |
208 |
|
|
209 |
/** Lower and upper limit of a range. */ |
/** Lower and upper limit of a range. */ |
210 |
struct range_t { |
struct range_t { |
211 |
uint16_t low; ///< Low value of range. |
uint16_t low; ///< Low value of range. |
212 |
uint16_t high; ///< High value of range. |
uint16_t high; ///< High value of range. |
213 |
|
|
214 |
|
inline bool operator< (const range_t& other) const { |
215 |
|
if (low < other.low) return true; |
216 |
|
if (low > other.low) return false; |
217 |
|
return high < other.high; |
218 |
|
} |
219 |
|
|
220 |
|
inline bool operator== (const range_t& other) const { |
221 |
|
return low == other.low && high == other.high; |
222 |
|
} |
223 |
|
|
224 |
|
inline bool overlaps(uint16_t scalar) const { |
225 |
|
return low <= scalar && scalar <= high; |
226 |
|
} |
227 |
|
|
228 |
|
inline bool overlaps(const range_t& other) const { |
229 |
|
return overlaps(other.low) || overlaps(other.high) || |
230 |
|
other.overlaps(low) || other.overlaps(high); |
231 |
|
} |
232 |
}; |
}; |
233 |
|
|
234 |
/** Defines Sample Loop Points. */ |
/** Defines Sample Loop Points. */ |
267 |
uint16_t transform; |
uint16_t transform; |
268 |
uint32_t scale; |
uint32_t scale; |
269 |
}; |
}; |
270 |
Connection() {}; |
Connection() {} |
271 |
void Init(conn_block_t* Header); |
void Init(conn_block_t* Header); |
272 |
conn_block_t ToConnBlock(); |
conn_block_t ToConnBlock(); |
273 |
virtual ~Connection() {}; |
virtual ~Connection() {} |
274 |
friend class Articulation; |
friend class Articulation; |
275 |
}; |
}; |
276 |
|
|
282 |
|
|
283 |
Articulation(RIFF::Chunk* artl); |
Articulation(RIFF::Chunk* artl); |
284 |
virtual ~Articulation(); |
virtual ~Articulation(); |
285 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
286 |
protected: |
protected: |
287 |
RIFF::Chunk* pArticulationCk; |
RIFF::Chunk* pArticulationCk; |
288 |
uint32_t HeaderSize; |
uint32_t HeaderSize; |
294 |
Articulator(RIFF::List* ParentList); |
Articulator(RIFF::List* ParentList); |
295 |
Articulation* GetFirstArticulation(); |
Articulation* GetFirstArticulation(); |
296 |
Articulation* GetNextArticulation(); |
Articulation* GetNextArticulation(); |
297 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
298 |
|
virtual void CopyAssign(const Articulator* orig); |
299 |
protected: |
protected: |
300 |
typedef std::list<Articulation*> ArticulationList; |
typedef std::list<Articulation*> ArticulationList; |
301 |
RIFF::List* pParentList; |
RIFF::List* pParentList; |
326 |
String SourceForm; ///< <ISRF-ck>. Identifies the original form of the material that was digitized, such as record, sampling CD, TV sound track. This is not neccessarily the same as <i>Medium</i>. |
String SourceForm; ///< <ISRF-ck>. Identifies the original form of the material that was digitized, such as record, sampling CD, TV sound track. This is not neccessarily the same as <i>Medium</i>. |
327 |
String Commissioned; ///< <ICMS-ck>. Lists the name of the person or organization that commissioned the subject of the file, e.g., Pope Julian II. |
String Commissioned; ///< <ICMS-ck>. Lists the name of the person or organization that commissioned the subject of the file, e.g., Pope Julian II. |
328 |
String Subject; ///< <ISBJ-ck>. Describes the contents of the file. |
String Subject; ///< <ISBJ-ck>. Describes the contents of the file. |
329 |
bool UseFixedLengthStrings; ///< Deprecated. Use #FixedStringLengths instead. |
bool UseFixedLengthStrings; ///< @deprecated Not used anymore, use SetFixedStringLengths() instead. |
330 |
|
|
331 |
struct FixedStringLength { |
struct string_length_t { |
332 |
uint32_t chunkId; |
uint32_t chunkId; |
333 |
int length; |
int length; |
334 |
}; |
}; |
335 |
const FixedStringLength* FixedStringLengths; ///< List of IDs and string lengths for strings that should be stored in a fixed length format. This is used for gig files, not for ordinary DLS files. |
|
336 |
Info(RIFF::List* list); |
Info(RIFF::List* list); |
337 |
|
void SetFixedStringLengths(const string_length_t* lengths); |
338 |
virtual ~Info(); |
virtual ~Info(); |
339 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
340 |
|
virtual void CopyAssign(const Info* orig); |
341 |
private: |
private: |
342 |
RIFF::List* pResourceListChunk; |
RIFF::List* pResourceListChunk; |
343 |
|
const string_length_t* pFixedStringLengths; ///< List of IDs and string lengths for strings that should be stored in a fixed length format. This is used for gig files, not for ordinary DLS files. |
344 |
|
|
345 |
static void LoadString(uint32_t ChunkID, RIFF::List* lstINFO, String& s); |
static void LoadString(uint32_t ChunkID, RIFF::List* lstINFO, String& s); |
346 |
void SaveString(uint32_t ChunkID, RIFF::List* lstINFO, const String& s, const String& sDefault); |
void SaveString(uint32_t ChunkID, RIFF::List* lstINFO, const String& s, const String& sDefault); |
352 |
Info* pInfo; ///< Points (in any case) to an <i>Info</i> object, providing additional, optional infos and comments. |
Info* pInfo; ///< Points (in any case) to an <i>Info</i> object, providing additional, optional infos and comments. |
353 |
dlsid_t* pDLSID; ///< Points to a <i>dlsid_t</i> structure if the file provided a DLS ID else is <i>NULL</i>. |
dlsid_t* pDLSID; ///< Points to a <i>dlsid_t</i> structure if the file provided a DLS ID else is <i>NULL</i>. |
354 |
|
|
355 |
Resource* GetParent() { return pParent; }; |
Resource* GetParent() { return pParent; } |
356 |
virtual void UpdateChunks(); |
const Resource* GetParent() const { return pParent; } |
357 |
|
virtual void UpdateChunks(progress_t* pProgress); |
358 |
|
void GenerateDLSID(); |
359 |
|
static void GenerateDLSID(dlsid_t* pDLSID); |
360 |
|
virtual void CopyAssign(const Resource* orig); |
361 |
protected: |
protected: |
362 |
Resource* pParent; |
Resource* pParent; |
363 |
RIFF::List* pResourceList; |
RIFF::List* pResourceList; |
371 |
public: |
public: |
372 |
uint8_t UnityNote; |
uint8_t UnityNote; |
373 |
int16_t FineTune; |
int16_t FineTune; |
374 |
int32_t Gain; |
int32_t Gain; ///< @deprecated Don't alter directly, use SetGain() instead! |
375 |
bool NoSampleDepthTruncation; |
bool NoSampleDepthTruncation; |
376 |
bool NoSampleCompression; |
bool NoSampleCompression; |
377 |
uint32_t SampleLoops; ///< Reflects the number of sample loops. |
uint32_t SampleLoops; ///< Reflects the number of sample loops. |
379 |
|
|
380 |
void AddSampleLoop(sample_loop_t* pLoopDef); |
void AddSampleLoop(sample_loop_t* pLoopDef); |
381 |
void DeleteSampleLoop(sample_loop_t* pLoopDef); |
void DeleteSampleLoop(sample_loop_t* pLoopDef); |
382 |
virtual void UpdateChunks(); |
virtual void SetGain(int32_t gain); |
383 |
|
virtual void UpdateChunks(progress_t* pProgress); |
384 |
|
virtual void CopyAssign(const Sampler* orig); |
385 |
protected: |
protected: |
386 |
RIFF::List* pParentList; |
RIFF::List* pParentList; |
387 |
uint32_t uiHeaderSize; |
uint32_t uiHeaderSize; |
406 |
uint32_t AverageBytesPerSecond; ///< The average number of bytes per second at which the waveform data should be transferred (Playback software can estimate the buffer size using this value). |
uint32_t AverageBytesPerSecond; ///< The average number of bytes per second at which the waveform data should be transferred (Playback software can estimate the buffer size using this value). |
407 |
uint16_t BlockAlign; ///< The block alignment (in bytes) of the waveform data. Playback software needs to process a multiple of <i>BlockAlign</i> bytes of data at a time, so the value of <i>BlockAlign</i> can be used for buffer alignment. |
uint16_t BlockAlign; ///< The block alignment (in bytes) of the waveform data. Playback software needs to process a multiple of <i>BlockAlign</i> bytes of data at a time, so the value of <i>BlockAlign</i> can be used for buffer alignment. |
408 |
uint16_t BitDepth; ///< Size of each sample per channel (only if known sample data format is used, 0 otherwise). |
uint16_t BitDepth; ///< Size of each sample per channel (only if known sample data format is used, 0 otherwise). |
409 |
unsigned long SamplesTotal; ///< Reflects total number of sample points (only if known sample data format is used, 0 otherwise), do not bother to change this value, it will not be saved. |
file_offset_t SamplesTotal; ///< Reflects total number of sample points (only if known sample data format is used, 0 otherwise), do not bother to change this value, it will not be saved. |
410 |
uint FrameSize; ///< Reflects the size (in bytes) of one single sample point (only if known sample data format is used, 0 otherwise). <b>Caution:</b> with the current version of libgig you have to upate this field by yourself whenever you change one of the following fields: Channels, BitDepth ! Ignoring this might lead to undesired behavior when i.e. calling Resize(), SetPos(), Write() or Read(). |
uint FrameSize; ///< Reflects the size (in bytes) of one single sample point (only if known sample data format is used, 0 otherwise). <b>Caution:</b> with the current version of libgig you have to upate this field by yourself whenever you change one of the following fields: Channels, BitDepth ! Ignoring this might lead to undesired behavior when i.e. calling Resize(), SetPos(), Write() or Read(). |
411 |
|
|
412 |
void* LoadSampleData(); |
void* LoadSampleData(); |
413 |
void ReleaseSampleData(); |
void ReleaseSampleData(); |
414 |
unsigned long GetSize(); |
file_offset_t GetSize() const; |
415 |
void Resize(int iNewSize); |
void Resize(file_offset_t NewSize); |
416 |
unsigned long SetPos(unsigned long SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
file_offset_t SetPos(file_offset_t SampleCount, RIFF::stream_whence_t Whence = RIFF::stream_start); |
417 |
unsigned long Read(void* pBuffer, unsigned long SampleCount); |
file_offset_t Read(void* pBuffer, file_offset_t SampleCount); |
418 |
unsigned long Write(void* pBuffer, unsigned long SampleCount); |
file_offset_t Write(void* pBuffer, file_offset_t SampleCount); |
419 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
420 |
|
virtual void CopyAssign(const Sample* orig); |
421 |
|
|
422 |
protected: |
protected: |
423 |
RIFF::List* pWaveList; |
RIFF::List* pWaveList; |
424 |
RIFF::Chunk* pCkData; |
RIFF::Chunk* pCkData; |
425 |
RIFF::Chunk* pCkFormat; |
RIFF::Chunk* pCkFormat; |
426 |
unsigned long ulWavePoolOffset; // needed for comparison with the wave pool link table, thus the link to instruments |
file_offset_t ullWavePoolOffset; // needed for comparison with the wave pool link table, thus the link to instruments |
427 |
|
|
428 |
Sample(File* pFile, RIFF::List* waveList, unsigned long WavePoolOffset); |
Sample(File* pFile, RIFF::List* waveList, file_offset_t WavePoolOffset); |
429 |
virtual ~Sample(); |
virtual ~Sample(); |
430 |
|
void CopyAssignCore(const Sample* orig); |
431 |
friend class File; |
friend class File; |
432 |
friend class Region; // Region has to compare the wave pool offset to get its sample |
friend class Region; // Region has to compare the wave pool offset to get its sample |
433 |
}; |
}; |
435 |
/** Defines <i>Region</i> information of an <i>Instrument</i>. */ |
/** Defines <i>Region</i> information of an <i>Instrument</i>. */ |
436 |
class Region : public Resource, public Articulator, public Sampler { |
class Region : public Resource, public Articulator, public Sampler { |
437 |
public: |
public: |
438 |
range_t KeyRange; |
range_t KeyRange; ///< @deprecated Only read, don't write! Use SetKeyRange() instead. |
439 |
range_t VelocityRange; |
range_t VelocityRange; |
440 |
uint16_t KeyGroup; |
uint16_t KeyGroup; |
441 |
uint16_t Layer; |
uint16_t Layer; |
447 |
|
|
448 |
Sample* GetSample(); |
Sample* GetSample(); |
449 |
void SetSample(Sample* pSample); |
void SetSample(Sample* pSample); |
450 |
virtual void UpdateChunks(); |
virtual void SetKeyRange(uint16_t Low, uint16_t High); |
451 |
|
virtual void UpdateChunks(progress_t* pProgress); |
452 |
|
virtual void CopyAssign(const Region* orig); |
453 |
protected: |
protected: |
454 |
RIFF::List* pCkRegion; |
RIFF::List* pCkRegion; |
455 |
uint32_t WavePoolTableIndex; // index in the wave pool table to the sample wave this region is linked to |
uint32_t WavePoolTableIndex; // index in the wave pool table to the sample wave this region is linked to |
475 |
Region* GetFirstRegion(); |
Region* GetFirstRegion(); |
476 |
Region* GetNextRegion(); |
Region* GetNextRegion(); |
477 |
Region* AddRegion(); |
Region* AddRegion(); |
|
void MoveRegion(Region* pSrc, Region* pDst); |
|
478 |
void DeleteRegion(Region* pRegion); |
void DeleteRegion(Region* pRegion); |
479 |
virtual void UpdateChunks(); |
virtual void UpdateChunks(progress_t* pProgress); |
480 |
|
virtual void CopyAssign(const Instrument* orig); |
481 |
protected: |
protected: |
482 |
typedef std::list<Region*> RegionList; |
typedef std::list<Region*> RegionList; |
483 |
struct midi_locale_t { |
struct midi_locale_t { |
490 |
RegionList::iterator RegionsIterator; |
RegionList::iterator RegionsIterator; |
491 |
|
|
492 |
Instrument(File* pFile, RIFF::List* insList); |
Instrument(File* pFile, RIFF::List* insList); |
493 |
|
void CopyAssignCore(const Instrument* orig); |
494 |
virtual void LoadRegions(); |
virtual void LoadRegions(); |
495 |
virtual ~Instrument(); |
virtual ~Instrument(); |
496 |
friend class File; |
friend class File; |
497 |
|
friend class Region; |
498 |
|
private: |
499 |
|
void MoveRegion(Region* pSrc, Region* pDst); |
500 |
}; |
}; |
501 |
|
|
502 |
/** Parses DLS Level 1 and 2 compliant files and provides abstract access to the data. */ |
/** Parses DLS Level 1 and 2 compliant files and provides abstract access to the data. */ |
507 |
|
|
508 |
File(); |
File(); |
509 |
File(RIFF::File* pRIFF); |
File(RIFF::File* pRIFF); |
510 |
|
String GetFileName(); |
511 |
|
void SetFileName(const String& name); |
512 |
Sample* GetFirstSample(); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetFirstSample(); ///< Returns a pointer to the first <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
513 |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
Sample* GetNextSample(); ///< Returns a pointer to the next <i>Sample</i> object of the file, <i>NULL</i> otherwise. |
514 |
Sample* AddSample(); |
Sample* AddSample(); |
517 |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
Instrument* GetNextInstrument(); ///< Returns a pointer to the next <i>Instrument</i> object of the file, <i>NULL</i> otherwise. |
518 |
Instrument* AddInstrument(); |
Instrument* AddInstrument(); |
519 |
void DeleteInstrument(Instrument* pInstrument); |
void DeleteInstrument(Instrument* pInstrument); |
520 |
virtual void UpdateChunks(); |
RIFF::File* GetExtensionFile(int index); |
521 |
virtual void Save(const String& Path); |
virtual void UpdateChunks(progress_t* pProgress); |
522 |
virtual void Save(); |
virtual void Save(const String& Path, progress_t* pProgress = NULL); |
523 |
|
virtual void Save(progress_t* pProgress = NULL); |
524 |
virtual ~File(); |
virtual ~File(); |
525 |
protected: |
protected: |
526 |
typedef std::list<Sample*> SampleList; |
typedef std::list<Sample*> SampleList; |
527 |
typedef std::list<Instrument*> InstrumentList; |
typedef std::list<Instrument*> InstrumentList; |
528 |
|
|
529 |
RIFF::File* pRIFF; |
RIFF::File* pRIFF; |
530 |
std::list<RIFF::File*> ExtensionFiles; |
std::list<RIFF::File*> ExtensionFiles; //FIXME: These should automatically be freed, since implicitly allocated. |
531 |
SampleList* pSamples; |
SampleList* pSamples; |
532 |
SampleList::iterator SamplesIterator; |
SampleList::iterator SamplesIterator; |
533 |
InstrumentList* pInstruments; |
InstrumentList* pInstruments; |
537 |
uint32_t* pWavePoolTable; |
uint32_t* pWavePoolTable; |
538 |
uint32_t* pWavePoolTableHi; |
uint32_t* pWavePoolTableHi; |
539 |
bool b64BitWavePoolOffsets; |
bool b64BitWavePoolOffsets; |
540 |
|
bool bOwningRiff; ///< If @c true then @c pRIFF was implicitly allocated by this class and hence pRIFF will automatically be freed by the @c DLS::File destructor in that case. |
541 |
|
|
542 |
virtual void LoadSamples(); |
virtual void LoadSamples(); |
543 |
virtual void LoadInstruments(); |
virtual void LoadInstruments(); |
544 |
|
virtual void UpdateFileOffsets(); |
545 |
void __ensureMandatoryChunksExist(); |
void __ensureMandatoryChunksExist(); |
546 |
friend class Region; // Region has to look in the wave pool table to get its sample |
friend class Region; // Region has to look in the wave pool table to get its sample |
547 |
private: |
private: |
558 |
*/ |
*/ |
559 |
class Exception : public RIFF::Exception { |
class Exception : public RIFF::Exception { |
560 |
public: |
public: |
561 |
Exception(String Message); |
Exception(String format, ...); |
562 |
|
Exception(String format, va_list arg); |
563 |
void PrintMessage(); |
void PrintMessage(); |
564 |
|
protected: |
565 |
|
Exception(); |
566 |
}; |
}; |
567 |
|
|
568 |
String libraryName(); |
String libraryName(); |