diff --git a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp index 28f8f36456..1636f73b90 100644 --- a/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp @@ -119,29 +119,37 @@ void MidiBuffer::clear (int startSample, int numSamples) data.removeRange ((int) (start - data.begin()), (int) (end - start)); } -void MidiBuffer::addEvent (const MidiMessage& m, int sampleNumber) +bool MidiBuffer::addEvent (const MidiMessage& m, int sampleNumber) { - addEvent (m.getRawData(), m.getRawDataSize(), sampleNumber); + return addEvent (m.getRawData(), m.getRawDataSize(), sampleNumber); } -void MidiBuffer::addEvent (const void* newData, int maxBytes, int sampleNumber) +bool MidiBuffer::addEvent (const void* newData, int maxBytes, int sampleNumber) { auto numBytes = MidiBufferHelpers::findActualEventLength (static_cast (newData), maxBytes); - if (numBytes > 0) + if (numBytes <= 0) + return true; + + if (std::numeric_limits::max() < numBytes) { - auto newItemSize = (size_t) numBytes + sizeof (int32) + sizeof (uint16); - auto offset = (int) (MidiBufferHelpers::findEventAfter (data.begin(), data.end(), sampleNumber) - data.begin()); + // This method only supports messages smaller than (1 << 16) bytes + return false; + } - data.insertMultiple (offset, 0, (int) newItemSize); + auto newItemSize = (size_t) numBytes + sizeof (int32) + sizeof (uint16); + auto offset = (int) (MidiBufferHelpers::findEventAfter (data.begin(), data.end(), sampleNumber) - data.begin()); - auto* d = data.begin() + offset; - writeUnaligned (d, sampleNumber); - d += sizeof (int32); - writeUnaligned (d, static_cast (numBytes)); - d += sizeof (uint16); - memcpy (d, newData, (size_t) numBytes); - } + data.insertMultiple (offset, 0, (int) newItemSize); + + auto* d = data.begin() + offset; + writeUnaligned (d, sampleNumber); + d += sizeof (int32); + writeUnaligned (d, static_cast (numBytes)); + d += sizeof (uint16); + memcpy (d, newData, (size_t) numBytes); + + return true; } void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, diff --git a/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/modules/juce_audio_basics/midi/juce_MidiBuffer.h index 2c764af020..4cf927250f 100644 --- a/modules/juce_audio_basics/midi/juce_MidiBuffer.h +++ b/modules/juce_audio_basics/midi/juce_MidiBuffer.h @@ -184,9 +184,11 @@ public: If an event is added whose sample position is the same as one or more events already in the buffer, the new event will be placed after the existing ones. - To retrieve events, use a MidiBufferIterator object + To retrieve events, use a MidiBufferIterator object. + + Returns true on success, or false on failure. */ - void addEvent (const MidiMessage& midiMessage, int sampleNumber); + bool addEvent (const MidiMessage& midiMessage, int sampleNumber); /** Adds an event to the buffer from raw midi data. @@ -202,9 +204,11 @@ public: it'll actually only store 3 bytes. If the midi data is invalid, it might not add an event at all. - To retrieve events, use a MidiBufferIterator object + To retrieve events, use a MidiBufferIterator object. + + Returns true on success, or false on failure. */ - void addEvent (const void* rawMidiData, + bool addEvent (const void* rawMidiData, int maxBytesOfMidiData, int sampleNumber);