diff --git a/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/modules/juce_audio_basics/midi/juce_MidiFile.cpp index a4cd279604..f1be520328 100644 --- a/modules/juce_audio_basics/midi/juce_MidiFile.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiFile.cpp @@ -231,7 +231,7 @@ namespace MidiFileHelpers { const auto delay = MidiMessage::readVariableLengthValue (data, (int) size); - if (delay.bytesUsed == 0) + if (! delay.isValid()) break; data += delay.bytesUsed; diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp index c9513ee6ff..e1a2150457 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.cpp @@ -79,7 +79,6 @@ MidiMessage::VariableLengthValue MidiMessage::readVariableLengthValue (const uin // bytes of input to construct a full value, or no terminating byte was // found. This implementation only supports variable-length values of up // to four bytes. - jassertfalse; return {}; } @@ -1225,6 +1224,7 @@ struct MidiMessageTest : public UnitTest const auto result = MidiMessage::readVariableLengthValue (copy.data(), (int) copy.size()); + expect (result.isValid()); expectEquals (result.value, outputs[index]); expectEquals (result.bytesUsed, (int) inputs[index].size()); @@ -1252,6 +1252,7 @@ struct MidiMessageTest : public UnitTest const auto result = MidiMessage::readVariableLengthValue (input.data(), (int) input.size()); + expect (! result.isValid()); expectEquals (result.value, 0); expectEquals (result.bytesUsed, 0); } diff --git a/modules/juce_audio_basics/midi/juce_MidiMessage.h b/modules/juce_audio_basics/midi/juce_MidiMessage.h index d3370accf5..22ac794830 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ b/modules/juce_audio_basics/midi/juce_MidiMessage.h @@ -872,7 +872,6 @@ public: from a stream of bytes. A valid value requires that `bytesUsed` is greater than 0. - If `bytesUsed <= 0` this object should be considered invalid. */ struct VariableLengthValue { @@ -881,6 +880,8 @@ public: VariableLengthValue (int valueIn, int bytesUsedIn) : value (valueIn), bytesUsed (bytesUsedIn) {} + bool isValid() const noexcept { return bytesUsed > 0; } + int value = 0; int bytesUsed = 0; }; @@ -891,7 +892,8 @@ public: @param maxBytesToUse the number of bytes in the region following `data` @returns a struct containing the parsed value, and the number of bytes that were read. If parsing fails, both the - `value` and `bytesUsed` fields will be set to 0. + `value` and `bytesUsed` fields will be set to 0 and + `isValid()` will return false */ static VariableLengthValue readVariableLengthValue (const uint8* data, int maxBytesToUse) noexcept;