From bb1b362162484fbcc4059534448e62b3ec96b968 Mon Sep 17 00:00:00 2001 From: jules Date: Fri, 29 Jan 2016 12:16:42 +0000 Subject: [PATCH] Added support for getting metadata from .caf files in the CoreAudioFormat class --- .../codecs/juce_CoreAudioFormat.cpp | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index d11b17b34b..ceb8a5ee20 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -112,19 +112,28 @@ struct CoreAudioFormatMetatdata }; //============================================================================== - struct UserDefinedChunk + static StringPairArray parseUserDefinedChunk (InputStream& input, int64 size) { - UserDefinedChunk (InputStream& input, int64 size) - { - // a user defined chunk contains 16 bytes of a UUID first - uuid[1] = input.readInt64BigEndian(); - uuid[0] = input.readInt64BigEndian(); + StringPairArray infoStrings; + const int64 originalPosition = input.getPosition(); - input.skipNextBytes (size - 16); + uint8 uuid[16]; + input.read (uuid, sizeof (uuid)); + + if (memcmp (uuid, "\x29\x81\x92\x73\xB5\xBF\x4A\xEF\xB7\x8D\x62\xD1\xEF\x90\xBB\x2C", 16) == 0) + { + const uint32 numEntries = (uint32) input.readIntBigEndian(); + + for (uint32 i = 0; i < numEntries && input.getPosition() < originalPosition + size; ++i) + { + String keyName = input.readString(); + infoStrings.set (keyName, input.readString()); + } } - int64 uuid[2]; - }; + input.setPosition (originalPosition + size); + return infoStrings; + } //============================================================================== static StringPairArray parseMidiChunk (InputStream& input, int64 size) @@ -288,7 +297,7 @@ struct CoreAudioFormatMetatdata } else if (chunkHeader.chunkType == chunkName ("uuid")) { - UserDefinedChunk userDefinedChunk (input, chunkHeader.chunkSize); + metadataValues.addArray (parseUserDefinedChunk (input, chunkHeader.chunkSize)); } else if (chunkHeader.chunkType == chunkName ("data")) {