NO-OP document Evoral::ControlList
[ardour.git] / libs / evoral / evoral / midi_util.h
index c30aa861ff7603e2eb50f6ffe637beda437baeb6..2ad5b3f3288ad8b6f23d25432b54d88b33bf091a 100644 (file)
 #ifndef EVORAL_MIDI_UTIL_H
 #define EVORAL_MIDI_UTIL_H
 
+#include <iostream>
+
 #include <stdint.h>
-#include <stdbool.h>
 #include <string>
 #include <sys/types.h>
 #include <assert.h>
+
+#include "evoral/visibility.h"
 #include "evoral/midi_events.h"
 
 namespace Evoral {
@@ -66,9 +69,11 @@ midi_event_size(uint8_t status)
                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;
 }
 
@@ -88,8 +93,11 @@ midi_event_size(const uint8_t* buffer)
        // 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++) {
-                       assert((buffer[end] & 0x80) == 0);
+                       if ((buffer[end] & 0x80) != 0) {
+                               return -1;
+                       }
                }
                assert(buffer[end] == MIDI_CMD_COMMON_SYSEX_END);
                return end + 1;
@@ -112,10 +120,20 @@ 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;
 }
 
-std::string midi_note_name (uint8_t noteval);
+LIBEVORAL_API std::string midi_note_name (uint8_t noteval);
 
 } // namespace Evoral