| 
							- /*
 -  * MIDI Event Queue
 -  * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
 -  *
 -  * This program 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
 -  * any later version.
 -  *
 -  * This program 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 more details.
 -  *
 -  * For a full copy of the GNU General Public License see the COPYING file
 -  */
 - 
 - #ifndef MIDI_QUEUE_HPP_INCLUDED
 - #define MIDI_QUEUE_HPP_INCLUDED
 - 
 - #include "CarlaMutex.hpp"
 - 
 - template<uint16_t MAX_SIZE>
 - class MIDIEventQueue
 - {
 - public:
 -     MIDIEventQueue() noexcept
 -         : index(0),
 -           empty(true),
 -           full(false),
 -           mutex() {}
 - 
 -     bool isEmpty() const noexcept
 -     {
 -         return empty;
 -     }
 - 
 -     bool isNotEmpty() const noexcept
 -     {
 -         return !empty;
 -     }
 - 
 -     bool isFull() const noexcept
 -     {
 -         return full;
 -     }
 - 
 -     CarlaMutex& getMutex() noexcept
 -     {
 -         return mutex;
 -     }
 - 
 -     bool put(unsigned char d1, unsigned char d2, unsigned char d3)
 -     {
 -         CARLA_SAFE_ASSERT_RETURN(d1 != 0, false);
 - 
 -         if (full)
 -             return false;
 - 
 -         for (unsigned short i=0; i < MAX_SIZE; i++)
 -         {
 -             if (data[i].d1 == 0)
 -             {
 -                 data[i].d1 = d1;
 -                 data[i].d2 = d2;
 -                 data[i].d3 = d3;
 -                 empty = false;
 -                 full  = (i == MAX_SIZE-1);
 -                 break;
 -             }
 -         }
 - 
 -         return true;
 -     }
 - 
 -     bool get(uint8_t& d1, uint8_t& d2, uint8_t& d3)
 -     {
 -         if (empty)
 -             return false;
 - 
 -         full = false;
 - 
 -         if (data[index].d1 == 0)
 -         {
 -             index = 0;
 -             empty = true;
 - 
 -             return false;
 -         }
 - 
 -         d1 = data[index].d1;
 -         d2 = data[index].d2;
 -         d3 = data[index].d3;
 - 
 -         data[index].d1 = data[index].d2 = data[index].d3 = 0;
 -         empty = false;
 -         ++index;
 - 
 -         return true;
 -     }
 - 
 -     bool tryToCopyDataFrom(MIDIEventQueue& queue) noexcept
 -     {
 -         const CarlaMutexTryLocker cml(queue.mutex);
 - 
 -         if (cml.wasNotLocked())
 -             return false;
 - 
 -         // copy data from queue
 -         carla_copyStruct(data, queue.data);
 -         index = queue.index;
 -         empty = queue.empty;
 -         full  = queue.full;
 - 
 -         // reset queque
 -         carla_zeroStruct(queue.data);
 -         queue.index = 0;
 -         queue.empty = true;
 -         queue.full  = false;
 - 
 -         return true;
 -     }
 - 
 - private:
 -     struct MIDIEvent {
 -         uint8_t d1, d2, d3;
 - 
 -         MIDIEvent() noexcept
 -             : d1(0), d2(0), d3(0) {}
 -     };
 - 
 -     MIDIEvent data[MAX_SIZE];
 -     uint16_t index;
 -     volatile bool empty, full;
 - 
 -     CarlaMutex mutex;
 - };
 - 
 - #endif // MIDI_QUEUE_HPP_INCLUDED
 
 
  |