X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fevoral%2Fevoral%2Fmidi_util.h;h=20ff94956973826c3ac6ed5ca25a9c1468648157;hb=2f0dc088446d6fb4b7e58120f4faee951d6ac359;hp=8caf3fddc429ab203d4cd2baeba6a34e174b73dc;hpb=85ab34179583db06899105586e7ac2d264b437fb;p=ardour.git diff --git a/libs/evoral/evoral/midi_util.h b/libs/evoral/evoral/midi_util.h index 8caf3fddc4..20ff949569 100644 --- a/libs/evoral/evoral/midi_util.h +++ b/libs/evoral/evoral/midi_util.h @@ -1,16 +1,16 @@ /* This file is part of Evoral. - * Copyright(C) 2008 Dave Robillard + * Copyright(C) 2008 David Robillard * Copyright(C) 2000-2008 Paul Davis - * + * * Evoral is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or(at your option) any later * version. - * + * * Evoral is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA @@ -19,9 +19,14 @@ #ifndef EVORAL_MIDI_UTIL_H #define EVORAL_MIDI_UTIL_H +#include + #include -#include +#include +#include #include + +#include "evoral/visibility.h" #include "evoral/midi_events.h" namespace Evoral { @@ -62,11 +67,13 @@ midi_event_size(uint8_t status) case MIDI_CMD_COMMON_SENSING: case MIDI_CMD_COMMON_RESET: return 1; - + case MIDI_CMD_COMMON_SYSEX: + std::cerr << "event size called for sysex\n"; return -1; } + std::cerr << "event size called for unknown status byte " << std::hex << (int) status << "\n"; return -1; } @@ -77,18 +84,21 @@ static inline int midi_event_size(const uint8_t* buffer) { uint8_t status = buffer[0]; - + // Mask off channel if applicable if (status >= 0x80 && status < 0xF0) { status &= 0xF0; } - - // FIXME: This is not correct, read the size and verify - // A sysex can contain the byte MIDI_CMD_COMMON_SYSEX_END, so this - // is likely to result in corrupt buffers and catastrophic failure + + // see http://www.midi.org/techspecs/midimessages.php if (status == MIDI_CMD_COMMON_SYSEX) { int end; - for (end = 1; buffer[end] != MIDI_CMD_COMMON_SYSEX_END; end++) {} + + for (end = 1; buffer[end] != MIDI_CMD_COMMON_SYSEX_END; end++) { + if ((buffer[end] & 0x80) != 0) { + return -1; + } + } assert(buffer[end] == MIDI_CMD_COMMON_SYSEX_END); return end + 1; } else { @@ -110,10 +120,19 @@ midi_event_is_valid(const uint8_t* buffer, size_t len) if (size < 0 || (size_t)size != len) { return false; } + if (status < 0xf0) { + /* Channel messages: all start with status byte followed by + * non status bytes. + */ + for (size_t i = 1; i < len; ++i) { + if ((buffer[i] & 0x80) != 0) { + return false; // Non-status byte has MSb set + } + } + } return true; } - } // namespace Evoral #endif // EVORAL_MIDI_UTIL_H