diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index c90af056f3..591b16aeef 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -482,6 +482,38 @@ namespace WavFileHelpers 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 { setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); @@ -504,13 +536,6 @@ namespace WavFileHelpers values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0"); } - template - 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) { return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0; @@ -528,34 +553,6 @@ namespace WavFileHelpers #endif } - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data (sizeof (AcidChunk), true); - AcidChunk* const acid = static_cast (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; uint16 rootNote; uint16 reserved1;