diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp index a6087f6bb5..aa866ee1f7 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp @@ -88,16 +88,7 @@ MidiMessage::MidiMessage (const void* const d, const int dataSize, const double size (dataSize) { jassert (dataSize > 0); - - if (dataSize > 4) - { - allocatedData.malloc (dataSize); - memcpy (allocatedData, d, (size_t) dataSize); - } - else - { - memcpy (preallocatedData.asBytes, d, (size_t) dataSize); - } + memcpy (allocateSpace (dataSize), d, (size_t) dataSize); // check that the length matches the data.. jassert (size > 3 || *(uint8*)d >= 0xf0 || getMessageLengthFromFirstByte (*(uint8*)d) == size); @@ -136,7 +127,7 @@ MidiMessage::MidiMessage (const int byte1, const int byte2, const int byte3, con MidiMessage::MidiMessage (const MidiMessage& other) : timeStamp (other.timeStamp), size (other.size) { - if (size > 4) + if (other.allocatedData != nullptr) { allocatedData.malloc (size); memcpy (allocatedData, other.allocatedData, (size_t) size); @@ -150,7 +141,7 @@ MidiMessage::MidiMessage (const MidiMessage& other) MidiMessage::MidiMessage (const MidiMessage& other, const double newTimeStamp) : timeStamp (newTimeStamp), size (other.size) { - if (size > 4) + if (other.allocatedData != nullptr) { allocatedData.malloc (size); memcpy (allocatedData, other.allocatedData, (size_t) size); @@ -214,9 +205,9 @@ MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const src += numVariableLengthSysexBytes; size = 1 + (int) (d - src); - allocatedData.malloc (size); - *allocatedData = (uint8) byte; - memcpy (allocatedData + 1, src, (size_t) (size - 1)); + uint8* dest = allocateSpace (size); + *dest = (uint8) byte; + memcpy (dest + 1, src, (size_t) (size - 1)); numBytesUsed += numVariableLengthSysexBytes; // (these aren't counted in the size) } @@ -226,9 +217,9 @@ MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const const int bytesLeft = readVariableLengthVal (src + 1, n); size = jmin (sz + 1, n + 2 + bytesLeft); - allocatedData.malloc (size); - *allocatedData = (uint8) byte; - memcpy (allocatedData + 1, src, (size_t) size - 1); + uint8* dest = allocateSpace (size); + *dest = (uint8) byte; + memcpy (dest + 1, src, (size_t) size - 1); } else { @@ -261,7 +252,7 @@ MidiMessage& MidiMessage::operator= (const MidiMessage& other) timeStamp = other.timeStamp; size = other.size; - if (size > 4) + if (other.allocatedData != nullptr) { allocatedData.malloc (size); memcpy (allocatedData, other.allocatedData, (size_t) size); @@ -301,6 +292,17 @@ MidiMessage& MidiMessage::operator= (MidiMessage&& other) noexcept MidiMessage::~MidiMessage() {} +uint8* MidiMessage::allocateSpace (int bytes) +{ + if (bytes > 4) + { + allocatedData.malloc (bytes); + return allocatedData; + } + + return preallocatedData.asBytes; +} + int MidiMessage::getChannel() const noexcept { const uint8* const data = getRawData(); diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.h b/modules/juce_audio_basics/midi/juce_MidiMessage.h index a8d1d89f4a..c775883d3d 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.h @@ -926,6 +926,7 @@ private: #endif inline uint8* getData() noexcept { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; } + uint8* allocateSpace (int); }; #endif // JUCE_MIDIMESSAGE_H_INCLUDED