MIDI interpreter using mbed

Dependencies:   MIDI TextLCD mbed

Committer:
kayekss
Date:
Fri Jun 14 12:41:54 2013 +0000
Revision:
1:af9dd50ffbc2
Parent:
0:93868ff6d1b1
Fixed pitchbend byte order

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kayekss 0:93868ff6d1b1 1 #include <stdint.h>
kayekss 0:93868ff6d1b1 2
kayekss 0:93868ff6d1b1 3 #ifndef __RINGBUFFER_H_
kayekss 0:93868ff6d1b1 4 #define __RINGBUFFER_H_
kayekss 0:93868ff6d1b1 5
kayekss 0:93868ff6d1b1 6 template <class T>
kayekss 0:93868ff6d1b1 7 class RingBuffer {
kayekss 0:93868ff6d1b1 8 public: // For experiment use
kayekss 0:93868ff6d1b1 9 uint32_t readPos;
kayekss 0:93868ff6d1b1 10 uint32_t writePos;
kayekss 0:93868ff6d1b1 11 uint32_t itemCount;
kayekss 0:93868ff6d1b1 12 uint32_t length;
kayekss 0:93868ff6d1b1 13 T* buffer;
kayekss 0:93868ff6d1b1 14
kayekss 0:93868ff6d1b1 15 public:
kayekss 0:93868ff6d1b1 16 RingBuffer(uint32_t);
kayekss 0:93868ff6d1b1 17 ~RingBuffer();
kayekss 0:93868ff6d1b1 18 uint32_t items();
kayekss 0:93868ff6d1b1 19 bool isWritable();
kayekss 0:93868ff6d1b1 20 bool isReadable();
kayekss 0:93868ff6d1b1 21 bool write(T&);
kayekss 0:93868ff6d1b1 22 T* read();
kayekss 0:93868ff6d1b1 23 T* peek();
kayekss 0:93868ff6d1b1 24 void flush();
kayekss 0:93868ff6d1b1 25 int find(T);
kayekss 0:93868ff6d1b1 26 };
kayekss 0:93868ff6d1b1 27
kayekss 0:93868ff6d1b1 28
kayekss 0:93868ff6d1b1 29 template <class T>
kayekss 0:93868ff6d1b1 30 RingBuffer<T>::RingBuffer(uint32_t len) {
kayekss 0:93868ff6d1b1 31 length = len;
kayekss 0:93868ff6d1b1 32 buffer = new T[length];
kayekss 0:93868ff6d1b1 33 readPos = 0;
kayekss 0:93868ff6d1b1 34 writePos = 0;
kayekss 0:93868ff6d1b1 35 itemCount = 0;
kayekss 0:93868ff6d1b1 36 }
kayekss 0:93868ff6d1b1 37
kayekss 0:93868ff6d1b1 38 template <class T>
kayekss 0:93868ff6d1b1 39 RingBuffer<T>::~RingBuffer() {
kayekss 0:93868ff6d1b1 40 delete[] buffer;
kayekss 0:93868ff6d1b1 41 }
kayekss 0:93868ff6d1b1 42
kayekss 0:93868ff6d1b1 43 template <class T>
kayekss 0:93868ff6d1b1 44 uint32_t RingBuffer<T>::items() {
kayekss 0:93868ff6d1b1 45 return itemCount;
kayekss 0:93868ff6d1b1 46 }
kayekss 0:93868ff6d1b1 47
kayekss 0:93868ff6d1b1 48 template <class T>
kayekss 0:93868ff6d1b1 49 bool RingBuffer<T>::isWritable() {
kayekss 0:93868ff6d1b1 50 return itemCount < length;
kayekss 0:93868ff6d1b1 51 }
kayekss 0:93868ff6d1b1 52
kayekss 0:93868ff6d1b1 53 template <class T>
kayekss 0:93868ff6d1b1 54 bool RingBuffer<T>::isReadable() {
kayekss 0:93868ff6d1b1 55 return itemCount > 0;
kayekss 0:93868ff6d1b1 56 }
kayekss 0:93868ff6d1b1 57
kayekss 0:93868ff6d1b1 58 template <class T>
kayekss 0:93868ff6d1b1 59 bool RingBuffer<T>::write(T& n) {
kayekss 0:93868ff6d1b1 60 if (!isWritable()) {
kayekss 0:93868ff6d1b1 61 return false;
kayekss 0:93868ff6d1b1 62 }
kayekss 0:93868ff6d1b1 63 buffer[writePos++] = n;
kayekss 0:93868ff6d1b1 64 if (writePos == length) {
kayekss 0:93868ff6d1b1 65 writePos = 0;
kayekss 0:93868ff6d1b1 66 }
kayekss 0:93868ff6d1b1 67 itemCount++;
kayekss 0:93868ff6d1b1 68 return true;
kayekss 0:93868ff6d1b1 69 }
kayekss 0:93868ff6d1b1 70
kayekss 0:93868ff6d1b1 71 template <class T>
kayekss 0:93868ff6d1b1 72 T* RingBuffer<T>::read() {
kayekss 0:93868ff6d1b1 73 uint32_t readPosTemp = readPos;
kayekss 0:93868ff6d1b1 74
kayekss 0:93868ff6d1b1 75 if (!isReadable()) {
kayekss 0:93868ff6d1b1 76 return NULL;
kayekss 0:93868ff6d1b1 77 }
kayekss 0:93868ff6d1b1 78 readPos++;
kayekss 0:93868ff6d1b1 79 if (readPos == length) {
kayekss 0:93868ff6d1b1 80 readPos = 0;
kayekss 0:93868ff6d1b1 81 }
kayekss 0:93868ff6d1b1 82 itemCount--;
kayekss 0:93868ff6d1b1 83 return &buffer[readPosTemp];
kayekss 0:93868ff6d1b1 84 }
kayekss 0:93868ff6d1b1 85
kayekss 0:93868ff6d1b1 86 template <class T>
kayekss 0:93868ff6d1b1 87 T* RingBuffer<T>::peek() {
kayekss 0:93868ff6d1b1 88 if (!isReadable()) {
kayekss 0:93868ff6d1b1 89 return NULL;
kayekss 0:93868ff6d1b1 90 }
kayekss 0:93868ff6d1b1 91 return &buffer[readPos];
kayekss 0:93868ff6d1b1 92 }
kayekss 0:93868ff6d1b1 93
kayekss 0:93868ff6d1b1 94 template <class T>
kayekss 0:93868ff6d1b1 95 void RingBuffer<T>::flush() {
kayekss 0:93868ff6d1b1 96 itemCount = 0;
kayekss 0:93868ff6d1b1 97 readPos = writePos;
kayekss 0:93868ff6d1b1 98 }
kayekss 0:93868ff6d1b1 99
kayekss 0:93868ff6d1b1 100 template <class T>
kayekss 0:93868ff6d1b1 101 int RingBuffer<T>::find(T key) {
kayekss 0:93868ff6d1b1 102 uint32_t p = readPos;
kayekss 1:af9dd50ffbc2 103
kayekss 0:93868ff6d1b1 104 for (uint32_t i = 0; i < itemCount; i++) {
kayekss 0:93868ff6d1b1 105 if (buffer[p] == key) {
kayekss 0:93868ff6d1b1 106 return i;
kayekss 0:93868ff6d1b1 107 }
kayekss 0:93868ff6d1b1 108 p++;
kayekss 0:93868ff6d1b1 109 if (p == length) p = 0;
kayekss 0:93868ff6d1b1 110 }
kayekss 0:93868ff6d1b1 111 return -1;
kayekss 0:93868ff6d1b1 112 }
kayekss 0:93868ff6d1b1 113
kayekss 0:93868ff6d1b1 114 #endif