47 #pragma pack (push, 1)
70 void copyTo (std::map<String, String>& values)
const
82 values.emplace (
"NumSampleLoops",
String (2));
109 inst.detune =
getValue8 (values,
"Detune",
"0");
110 inst.lowNote =
getValue8 (values,
"LowNote",
"0");
111 inst.highNote =
getValue8 (values,
"HighNote",
"127");
112 inst.lowVelocity =
getValue8 (values,
"LowVelocity",
"1");
113 inst.highVelocity =
getValue8 (values,
"HighVelocity",
"127");
116 inst.sustainLoop.type =
getValue16 (values,
"Loop0Type",
"0");
117 inst.sustainLoop.startIdentifier =
getValue16 (values,
"Loop0StartIdentifier",
"0");
118 inst.sustainLoop.endIdentifier =
getValue16 (values,
"Loop0EndIdentifier",
"0");
119 inst.releaseLoop.type =
getValue16 (values,
"Loop1Type",
"0");
120 inst.releaseLoop.startIdentifier =
getValue16 (values,
"Loop1StartIdentifier",
"0");
121 inst.releaseLoop.endIdentifier =
getValue16 (values,
"Loop1EndIdentifier",
"0");
154 const bool rootNoteSet =
rootNote != 0;
166 const char* keyString =
nullptr;
170 case minor: keyString =
"minor";
break;
171 case major: keyString =
"major";
break;
172 case neither: keyString =
"neither";
break;
173 case both: keyString =
"both";
break;
177 if (keyString !=
nullptr)
183 bool shouldBeSet)
const
185 values.emplace (
name, shouldBeSet ?
"1" :
"0");
214 static const char* appleGenres[] =
229 if (tag == appleGenres[
i])
243 auto*
data =
static_cast<const char*
> (mb.
getData());
246 while (
data < dataEnd)
248 bool isGenre =
false;
257 data += isGenre ? 118 : 50;
277 const String cueString (
"Cue");
278 const String noteString (
"CueNote");
279 const String identifierString (
"Identifier");
283 if (
key.startsWith (noteString))
286 if (
key.startsWith (cueString) &&
key.contains (identifierString))
301 out.writeShortBigEndian ((
short) numCues);
310 for (
int i = 0;
i < numCues; ++
i)
312 auto prefixCue =
"Cue" +
String (
i);
313 auto identifier = idOffset + values.
getValue (prefixCue +
"Identifier",
"1").
getIntValue();
317 identifiers.
add (identifier);
323 for (
int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex)
325 auto prefixLabel =
"CueLabel" +
String (labelIndex);
326 auto labelIdentifier = idOffset + values.
getValue (prefixLabel +
"Identifier",
"1").
getIntValue();
328 if (labelIdentifier == identifier)
335 out.writeShortBigEndian ((
short) identifier);
336 out.writeIntBigEndian (offset);
338 auto labelLength =
jmin ((
size_t) 254,
label.getNumBytesAsUTF8());
339 out.writeByte (
static_cast<char> (labelLength + 1));
340 out.write (
label.toUTF8(), labelLength);
343 if ((
out.getDataSize() & 1) != 0)
360 out.writeShortBigEndian ((
short) numNotes);
362 for (
int i = 0;
i < numNotes; ++
i)
364 auto prefix =
"CueNote" +
String (
i);
370 auto commentLength =
jmin (comment.getNumBytesAsUTF8(), (
size_t) 65534);
372 out.writeShortBigEndian (
static_cast<short> (commentLength + 1));
373 out.write (comment.toUTF8(), commentLength);
376 if ((
out.getDataSize() & 1) != 0)
393 std::map<String, String> metadataValuesMap;
397 metadataValuesMap.emplace (
metadataValues.getAllKeys().getReference (
i),
404 if (
input->readInt() == chunkName (
"FORM"))
406 auto len =
input->readIntBigEndian();
407 auto end =
input->getPosition() + len;
408 auto nextType =
input->readInt();
410 if (nextType == chunkName (
"AIFF") || nextType == chunkName (
"AIFC"))
412 bool hasGotVer =
false;
413 bool hasGotData =
false;
414 bool hasGotType =
false;
422 if (
type == chunkName (
"FVER"))
425 auto ver =
input->readIntBigEndian();
427 if (ver != 0 && ver != (
int) 0xa2805140)
430 else if (
type == chunkName (
"COMM"))
439 unsigned char sampleRateBytes[10];
440 input->read (sampleRateBytes, 10);
441 const int byte0 = sampleRateBytes[0];
443 if ((byte0 & 0x80) != 0
444 || byte0 <= 0x3F || byte0 > 0x40
445 || (byte0 == 0x40 && sampleRateBytes[1] > 0x1C))
460 auto compType =
input->readInt();
462 if (compType == chunkName (
"NONE") || compType == chunkName (
"twos"))
466 else if (compType == chunkName (
"sowt"))
470 else if (compType == chunkName (
"fl32") || compType == chunkName (
"FL32"))
482 else if (
type == chunkName (
"SSND"))
486 auto offset =
input->readIntBigEndian();
490 else if (
type == chunkName (
"MARK"))
492 auto numCues = (
uint16)
input->readShortBigEndian();
495 metadataValuesMap.emplace (
"NumCuePoints",
String (numCues));
496 metadataValuesMap.emplace (
"NumCueLabels",
String (numCues));
500 auto identifier = (
uint16)
input->readShortBigEndian();
502 auto stringLength = (
uint8)
input->readByte();
504 input->readIntoMemoryBlock (textBlock, stringLength);
509 if ((stringLength & 1) == 0)
512 auto prefixCue =
"Cue" +
String (
i);
513 metadataValuesMap.emplace (prefixCue +
"Identifier",
String (identifier));
514 metadataValuesMap.emplace (prefixCue +
"Offset",
String (offset));
516 auto prefixLabel =
"CueLabel" +
String (
i);
517 metadataValuesMap.emplace (prefixLabel +
"Identifier",
String (identifier));
518 metadataValuesMap.emplace (prefixLabel +
"Text", textBlock.
toString());
521 else if (
type == chunkName (
"COMT"))
523 auto numNotes = (
uint16)
input->readShortBigEndian();
524 metadataValuesMap.emplace (
"NumCueNotes",
String (numNotes));
528 auto timestamp = (
uint32)
input->readIntBigEndian();
529 auto identifier = (
uint16)
input->readShortBigEndian();
530 auto stringLength = (
uint16)
input->readShortBigEndian();
533 input->readIntoMemoryBlock (textBlock, stringLength + (stringLength & 1));
535 auto prefix =
"CueNote" +
String (
i);
536 metadataValuesMap.emplace (prefix +
"TimeStamp",
String (timestamp));
537 metadataValuesMap.emplace (prefix +
"Identifier",
String (identifier));
538 metadataValuesMap.emplace (prefix +
"Text", textBlock.
toString());
541 else if (
type == chunkName (
"INST"))
546 inst->copyTo (metadataValuesMap);
548 else if (
type == chunkName (
"basc"))
552 else if (
type == chunkName (
"cate"))
557 else if ((hasGotVer && hasGotData && hasGotType)
558 || chunkEnd < input->getPosition()
559 ||
input->isExhausted())
564 input->setPosition (chunkEnd + (chunkEnd & 1));
569 if (metadataValuesMap.size() > 0)
570 metadataValuesMap.emplace (
"MetaDataSource",
"AIFF");
576 bool readSamples (
int** destSamples,
int numDestChannels,
int startOffsetInDestBuffer,
577 int64 startSampleInFile,
int numSamples)
override
587 while (numSamples > 0)
589 const int tempBufSize = 480 * 3 * 4;
590 char tempBuffer [tempBufSize];
603 destSamples, startOffsetInDestBuffer, numDestChannels,
607 destSamples, startOffsetInDestBuffer, numDestChannels,
610 startOffsetInDestBuffer += numThisTime;
611 numSamples -= numThisTime;
617 template <
typename Endianness>
618 static void copySampleData (
unsigned int numBitsPerSample,
bool floatingPointData,
619 int*
const* destSamples,
int startOffsetInDestBuffer,
int numDestChannels,
620 const void* sourceData,
int numberOfChannels,
int numSamples)
noexcept
622 switch (numBitsPerSample)
647 unsigned int numChans,
unsigned int bits,
653 if (metadataValues.
size() > 0)
658 jassert (metadataValues.getValue (
"MetaDataSource",
"None") !=
"WAV");
660 MarkChunk::create (markChunk, metadataValues);
661 COMTChunk::create (comtChunk, metadataValues);
662 InstChunk::create (instChunk, metadataValues);
735 audioBytes += (audioBytes & 1);
737 output->writeInt (chunkName (
"FORM"));
738 output->writeIntBigEndian (headerLen + audioBytes - 8);
739 output->writeInt (chunkName (
"AIFF"));
740 output->writeInt (chunkName (
"COMM"));
741 output->writeIntBigEndian (18);
746 uint8 sampleRateBytes[10] = {};
750 sampleRateBytes[0] = 0x3f;
751 sampleRateBytes[1] = 0xff;
752 sampleRateBytes[2] = 0x80;
756 int mask = 0x40000000;
757 sampleRateBytes[0] = 0x40;
762 sampleRateBytes[1] = 0x1d;
769 for (
i = 0;
i <= 32 ; ++
i)
779 sampleRateBytes[1] = (
uint8) (29 -
i);
780 sampleRateBytes[2] = (
uint8) ((
n >> 24) & 0xff);
781 sampleRateBytes[3] = (
uint8) ((
n >> 16) & 0xff);
782 sampleRateBytes[4] = (
uint8) ((
n >> 8) & 0xff);
783 sampleRateBytes[5] = (
uint8) (
n & 0xff);
787 output->write (sampleRateBytes, 10);
791 output->writeInt (chunkName (
"MARK"));
798 output->writeInt (chunkName (
"COMT"));
805 output->writeInt (chunkName (
"INST"));
810 output->writeInt (chunkName (
"SSND"));
811 output->writeIntBigEndian (audioBytes + 8);
832 bool readSamples (
int** destSamples,
int numDestChannels,
int startOffsetInDestBuffer,
833 int64 startSampleInFile,
int numSamples)
override
907 for (
int i = 0;
i < numChannelsToRead; ++
i)
930 template <
typename SampleType>
933 for (
int i = 0;
i < numChannelsToRead; ++
i)
937 template <
typename SampleType>
953 return { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 };
958 return { 8, 16, 24 };
970 auto type =
f.getMacOSType();
973 return type == 0x41494646 ||
type == 0x41494643
974 ||
type == 0x61696666 ||
type == 0x61696663 ;
982 if (
w->sampleRate > 0 &&
w->numChannels > 0)
985 if (! deleteStreamIfOpeningFails)
1011 unsigned int numberOfChannels,
1018 (
unsigned int) bitsPerSample, metadataValues);
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static const unsigned long mask[]
Definition bitwise.c:31
static uint32 littleEndianInt(const void *bytes) noexcept
Definition ByteOrder.h:236
static uint16 swapIfLittleEndian(uint16 value) noexcept
Definition ByteOrder.h:227
static uint16 bigEndianShort(const void *bytes) noexcept
Definition ByteOrder.h:241
static uint32 bigEndianInt(const void *bytes) noexcept
Definition ByteOrder.h:239
Definition juce_Array.h:56
void add(const ElementType &newElement)
Definition juce_Array.h:418
bool contains(ParameterType elementToLookFor) const
Definition juce_Array.h:400
static Type swapIfLittleEndian(Type value) noexcept
Definition juce_ByteOrder.h:78
Definition juce_CharPointer_UTF8.h:35
static bool isLowerCase(juce_wchar character) noexcept
Definition juce_CharacterFunctions.cpp:47
static bool isLetterOrDigit(char character) noexcept
Definition juce_CharacterFunctions.cpp:90
static bool isUpperCase(juce_wchar character) noexcept
Definition juce_CharacterFunctions.cpp:38
Definition juce_File.h:45
Definition juce_HeapBlock.h:87
void calloc(SizeType newNumElements, const size_t elementSize=sizeof(ElementType))
Definition juce_HeapBlock.h:263
Definition juce_MemoryBlock.h:33
void * getData() noexcept
Definition juce_MemoryBlock.h:91
void setSize(const size_t newSize, bool initialiseNewSpaceToZero=false)
Definition juce_MemoryBlock.cpp:115
String toString() const
Definition juce_MemoryBlock.cpp:265
size_t getSize() const noexcept
Definition juce_MemoryBlock.h:127
Definition juce_AiffAudioFormat.cpp:823
void scanMinAndMax(int64 startSampleInFile, int64 numSamples, Range< float > *results, int numChannelsToRead) const noexcept
Definition juce_AiffAudioFormat.cpp:931
MemoryMappedAiffReader(const File &f, const AiffAudioFormatReader &reader)
Definition juce_AiffAudioFormat.cpp:825
Range< float > scanMinAndMaxForChannel(int channel, int64 startSampleInFile, int64 numSamples) const noexcept
Definition juce_AiffAudioFormat.cpp:938
const bool littleEndian
Definition juce_AiffAudioFormat.cpp:928
void readMaxLevels(int64 startSampleInFile, int64 numSamples, Range< float > *results, int numChannelsToRead) override
Definition juce_AiffAudioFormat.cpp:899
bool readSamples(int **destSamples, int numDestChannels, int startOffsetInDestBuffer, int64 startSampleInFile, int numSamples) override
Definition juce_AiffAudioFormat.cpp:832
void getSample(int64 sample, float *result) const noexcept override
Definition juce_AiffAudioFormat.cpp:856
Definition juce_MemoryOutputStream.h:36
Definition juce_OutputStream.h:38
Definition juce_Range.h:40
Definition juce_StringArray.h:35
String joinIntoString(StringRef separatorString, int startIndex=0, int numberOfElements=-1) const
Definition juce_StringArray.cpp:289
bool contains(StringRef stringToLookFor, bool ignoreCase=false) const
Definition juce_StringArray.cpp:189
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
Definition juce_String.h:53
int getIntValue() const noexcept
Definition juce_String.cpp:1871
Definition juce_StringPairArray.h:35
String getValue(StringRef, const String &defaultReturnValue) const
Definition juce_StringPairArray.cpp:86
int size() const noexcept
Definition juce_StringPairArray.h:93
const StringArray & getAllKeys() const noexcept
Definition juce_StringPairArray.h:87
UINT_D64 w
Definition inflate.c:942
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
static const char * name
Definition pugl.h:1582
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
Definition juce_AiffAudioFormat.cpp:204
static String read(InputStream &input, const uint32 length)
Definition juce_AiffAudioFormat.cpp:235
static bool isAppleGenre(const String &tag) noexcept
Definition juce_AiffAudioFormat.cpp:212
static bool isValidTag(const char *d) noexcept
Definition juce_AiffAudioFormat.cpp:205
Definition juce_AiffAudioFormat.cpp:352
static void create(MemoryBlock &block, const StringPairArray &values)
Definition juce_AiffAudioFormat.cpp:353
Definition juce_AiffAudioFormat.cpp:273
static void create(MemoryBlock &block, const StringPairArray &values)
Definition juce_AiffAudioFormat.cpp:294
static bool metaDataContainsZeroIdentifiers(const StringPairArray &values)
Definition juce_AiffAudioFormat.cpp:274
Definition juce_AiffAudioFormat.cpp:43
int chunkName(const char *name) noexcept
Definition juce_AiffAudioFormat.cpp:44
struct juce::AiffFileHelpers::InstChunk JUCE_PACKED
Definition carla_juce.cpp:31
void zerostruct(Type &structure) noexcept
Definition juce_Memory.h:32
unsigned short uint16
Definition juce_MathsFunctions.h:41
unsigned long long uint64
Definition juce_MathsFunctions.h:56
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
class JUCE_API juce::PixelARGB JUCE_PACKED
unsigned int uint32
Definition juce_MathsFunctions.h:45
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
static const char *const aiffFormatName
Definition juce_AiffAudioFormat.cpp:29
signed short int16
Definition juce_MathsFunctions.h:39
long long int64
Definition juce_MathsFunctions.h:54
wchar_t juce_wchar
Definition juce_CharacterFunctions.h:42
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
signed char int8
Definition juce_MathsFunctions.h:35
unsigned char uint8
Definition juce_MathsFunctions.h:37
@ label
Definition juce_AccessibilityRole.h:44
constexpr int numElementsInArray(Type(&)[N]) noexcept
Definition juce_MathsFunctions.h:344
void zeromem(void *memory, size_t numBytes) noexcept
Definition juce_Memory.h:28
png_uint_32 length
Definition png.c:2247
Definition juce_AiffAudioFormat.cpp:129
uint16 key
Definition juce_AiffAudioFormat.cpp:191
BASCChunk(InputStream &input)
Definition juce_AiffAudioFormat.cpp:138
uint16 timeSigNum
Definition juce_AiffAudioFormat.cpp:192
uint16 rootNote
Definition juce_AiffAudioFormat.cpp:190
Key
Definition juce_AiffAudioFormat.cpp:131
@ minor
Definition juce_AiffAudioFormat.cpp:132
@ neither
Definition juce_AiffAudioFormat.cpp:134
@ both
Definition juce_AiffAudioFormat.cpp:135
@ major
Definition juce_AiffAudioFormat.cpp:133
void setBoolFlag(std::map< String, String > &values, const char *name, bool shouldBeSet) const
Definition juce_AiffAudioFormat.cpp:181
uint32 flags
Definition juce_AiffAudioFormat.cpp:188
uint16 oneShot
Definition juce_AiffAudioFormat.cpp:194
void addToMetadata(std::map< String, String > &metadata) const
Definition juce_AiffAudioFormat.cpp:152
uint8 unknown[66]
Definition juce_AiffAudioFormat.cpp:195
uint32 numBeats
Definition juce_AiffAudioFormat.cpp:189
uint16 timeSigDen
Definition juce_AiffAudioFormat.cpp:193
Definition juce_AiffAudioFormat.cpp:54
uint16 startIdentifier
Definition juce_AiffAudioFormat.cpp:56
uint16 endIdentifier
Definition juce_AiffAudioFormat.cpp:57
uint16 type
Definition juce_AiffAudioFormat.cpp:55
Definition juce_AiffAudioFormat.cpp:52
Loop releaseLoop
Definition juce_AiffAudioFormat.cpp:68
int8 baseNote
Definition juce_AiffAudioFormat.cpp:60
int8 highVelocity
Definition juce_AiffAudioFormat.cpp:65
int8 lowVelocity
Definition juce_AiffAudioFormat.cpp:64
int16 gain
Definition juce_AiffAudioFormat.cpp:66
static void create(MemoryBlock &block, const StringPairArray &values)
Definition juce_AiffAudioFormat.cpp:101
int8 highNote
Definition juce_AiffAudioFormat.cpp:63
int8 lowNote
Definition juce_AiffAudioFormat.cpp:62
static int8 getValue8(const StringPairArray &values, const char *name, const char *def)
Definition juce_AiffAudioFormat.cpp:96
void copyTo(std::map< String, String > &values) const
Definition juce_AiffAudioFormat.cpp:70
int8 detune
Definition juce_AiffAudioFormat.cpp:61
static uint16 getValue16(const StringPairArray &values, const char *name, const char *def)
Definition juce_AiffAudioFormat.cpp:91
Loop sustainLoop
Definition juce_AiffAudioFormat.cpp:67
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458
ZCONST char * key
Definition crypt.c:587
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
struct zdirent * file
Definition win32.c:1500