diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index 2cc3eac66e..e70e2afd57 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -55,6 +55,17 @@ StringPairArray WavAudioFormat::createBWAVMetadata (const String& description, return m; } +const char* const WavAudioFormat::acidOneShot = "acid one shot"; +const char* const WavAudioFormat::acidRootSet = "acid root set"; +const char* const WavAudioFormat::acidStretch = "acid stretch"; +const char* const WavAudioFormat::acidDiskBased = "acid disk based"; +const char* const WavAudioFormat::acidizerFlag = "acidizer flag"; +const char* const WavAudioFormat::acidRootNote = "acid root note"; +const char* const WavAudioFormat::acidBeats = "acid beats"; +const char* const WavAudioFormat::acidDenominator = "acid denominator"; +const char* const WavAudioFormat::acidNumerator = "acid numerator"; +const char* const WavAudioFormat::acidTempo = "acid tempo"; + //============================================================================== namespace WavFileHelpers @@ -457,6 +468,49 @@ namespace WavFileHelpers } } + //============================================================================== + struct AcidChunk + { + /** Reads an acid RIFF chunk from a stream positioned just after the size byte. */ + AcidChunk (InputStream& input, int length) + { + zerostruct (*this); + input.read (this, jmin ((int) sizeof (*this), length)); + } + + void addToMetadata (StringPairArray& values) const + { + setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); + setBoolFlag (values, WavAudioFormat::acidRootSet, 0x02); + setBoolFlag (values, WavAudioFormat::acidStretch, 0x04); + setBoolFlag (values, WavAudioFormat::acidDiskBased, 0x08); + setBoolFlag (values, WavAudioFormat::acidizerFlag, 0x10); + + if (flags & 0x02) // root note set + values.set (WavAudioFormat::acidRootNote, String (rootNote)); + + values.set (WavAudioFormat::acidBeats, String (numBeats)); + values.set (WavAudioFormat::acidDenominator, String (meterDenominator)); + values.set (WavAudioFormat::acidNumerator, String (meterNumerator)); + values.set (WavAudioFormat::acidTempo, String (tempo)); + } + + void setBoolFlag (StringPairArray& values, const char* name, int32 mask) const + { + values.set (name, (flags & mask) ? "1" : "0"); + } + + int32 flags; + int16 rootNote; + int16 reserved1; + float reserved2; + int32 numBeats; + int16 meterDenominator; + int16 meterNumerator; + float tempo; + + } JUCE_PACKED; + //============================================================================== struct ExtensibleWavSubFormat { @@ -693,6 +747,10 @@ public: } } } + else if (chunkType == chunkName ("acid")) + { + AcidChunk (*input, length).addToMetadata (metadataValues); + } else if (chunkEnd <= input->getPosition()) { break; diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h index 45b569a377..56bcf02e5b 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h @@ -110,6 +110,28 @@ public: const int64 timeReferenceSamples, const String& codingHistory); + //============================================================================== + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidOneShot; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidRootSet; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidStretch; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidDiskBased; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidizerFlag; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidRootNote; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidBeats; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidDenominator; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidNumerator; + /** Metadata property name used when reading a WAV file with an acid chunk. */ + static const char* const acidTempo; + //============================================================================== Array getPossibleSampleRates(); Array getPossibleBitDepths();