| @@ -482,6 +482,38 @@ namespace WavFileHelpers | |||||
| input.read (this, (int) jmin (sizeof (*this), length)); | input.read (this, (int) jmin (sizeof (*this), length)); | ||||
| } | } | ||||
| AcidChunk (const StringPairArray& values) | |||||
| { | |||||
| zerostruct (*this); | |||||
| flags = getFlagIfPresent (values, WavAudioFormat::acidOneShot, 0x01) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidRootSet, 0x02) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidStretch, 0x04) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidizerFlag, 0x10); | |||||
| if (values[WavAudioFormat::acidRootSet].getIntValue() != 0) | |||||
| rootNote = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidRootNote].getIntValue()); | |||||
| numBeats = ByteOrder::swapIfBigEndian ((uint32) values[WavAudioFormat::acidBeats].getIntValue()); | |||||
| meterDenominator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidDenominator].getIntValue()); | |||||
| meterNumerator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidNumerator].getIntValue()); | |||||
| if (values.containsKey (WavAudioFormat::acidTempo)) | |||||
| tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue()); | |||||
| } | |||||
| static MemoryBlock createFrom (const StringPairArray& values) | |||||
| { | |||||
| return AcidChunk (values).toMemoryBlock(); | |||||
| } | |||||
| MemoryBlock toMemoryBlock() const | |||||
| { | |||||
| return (flags != 0 || rootNote != 0 || numBeats != 0 || meterDenominator != 0 || meterNumerator != 0) | |||||
| ? MemoryBlock (this, sizeof (*this)) : MemoryBlock(); | |||||
| } | |||||
| void addToMetadata (StringPairArray& values) const | void addToMetadata (StringPairArray& values) const | ||||
| { | { | ||||
| setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); | setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); | ||||
| @@ -504,13 +536,6 @@ namespace WavFileHelpers | |||||
| values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0"); | values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0"); | ||||
| } | } | ||||
| template<typename IntType> | |||||
| static void setIntFlagIfPresent (IntType& flag, const StringPairArray& values, const char* name) | |||||
| { | |||||
| if (values.containsKey (name)) | |||||
| flag = ByteOrder::swapIfBigEndian ((IntType) values[name].getIntValue()); | |||||
| } | |||||
| static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag) | static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag) | ||||
| { | { | ||||
| return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0; | return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0; | ||||
| @@ -528,34 +553,6 @@ namespace WavFileHelpers | |||||
| #endif | #endif | ||||
| } | } | ||||
| static MemoryBlock createFrom (const StringPairArray& values) | |||||
| { | |||||
| MemoryBlock data (sizeof (AcidChunk), true); | |||||
| AcidChunk* const acid = static_cast<AcidChunk*> (data.getData()); | |||||
| acid->flags = getFlagIfPresent (values, WavAudioFormat::acidOneShot, 0x01) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidRootSet, 0x02) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidStretch, 0x04) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08) | |||||
| | getFlagIfPresent (values, WavAudioFormat::acidizerFlag, 0x10); | |||||
| if (values[WavAudioFormat::acidRootSet].getIntValue() != 0) | |||||
| setIntFlagIfPresent (acid->rootNote, values, WavAudioFormat::acidRootNote); | |||||
| setIntFlagIfPresent (acid->numBeats, values, WavAudioFormat::acidBeats); | |||||
| setIntFlagIfPresent (acid->meterDenominator, values, WavAudioFormat::acidDenominator); | |||||
| setIntFlagIfPresent (acid->meterNumerator, values, WavAudioFormat::acidNumerator); | |||||
| if (values.containsKey (WavAudioFormat::acidTempo)) | |||||
| acid->tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue()); | |||||
| if (acid->flags == 0 && acid->rootNote == 0 && acid->numBeats == 0 | |||||
| && acid->meterDenominator == 0 && acid->meterNumerator == 0) | |||||
| return MemoryBlock(); | |||||
| return data; | |||||
| } | |||||
| uint32 flags; | uint32 flags; | ||||
| uint16 rootNote; | uint16 rootNote; | ||||
| uint16 reserved1; | uint16 reserved1; | ||||