music main

Dependencies:   USBHost mbed

Fork of AppBoard_Waveplayer by jim hamblen

Committer:
niv17
Date:
Tue Apr 14 03:46:33 2015 +0000
Revision:
11:e48cb1e38995
Version that needs to be fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
niv17 11:e48cb1e38995 1
niv17 11:e48cb1e38995 2 #ifndef _CircularBuffer_h
niv17 11:e48cb1e38995 3 #define _CircularBuffer_h
niv17 11:e48cb1e38995 4
niv17 11:e48cb1e38995 5 #define INITIAL 3000
niv17 11:e48cb1e38995 6
niv17 11:e48cb1e38995 7 template <class T>
niv17 11:e48cb1e38995 8 class CircularBuffer{
niv17 11:e48cb1e38995 9 /* If wptr == rptr, it is empty */
niv17 11:e48cb1e38995 10 /* Remember: capacity-1 is all you can store */
niv17 11:e48cb1e38995 11 private:
niv17 11:e48cb1e38995 12 size_t rptr,wptr,capacity;
niv17 11:e48cb1e38995 13 T *data;
niv17 11:e48cb1e38995 14
niv17 11:e48cb1e38995 15 public:
niv17 11:e48cb1e38995 16 CircularBuffer(size_t cap){
niv17 11:e48cb1e38995 17 rptr = 0;
niv17 11:e48cb1e38995 18 wptr = cap-1;
niv17 11:e48cb1e38995 19 //printf("\r\n%u %u",rptr,wptr);
niv17 11:e48cb1e38995 20 //fflush(stdout);
niv17 11:e48cb1e38995 21 capacity = cap;
niv17 11:e48cb1e38995 22 data = new T[cap];
niv17 11:e48cb1e38995 23 clear();
niv17 11:e48cb1e38995 24 }
niv17 11:e48cb1e38995 25
niv17 11:e48cb1e38995 26 ~CircularBuffer(){
niv17 11:e48cb1e38995 27 delete[] data;
niv17 11:e48cb1e38995 28 }
niv17 11:e48cb1e38995 29
niv17 11:e48cb1e38995 30 size_t writeSizeRemaining();
niv17 11:e48cb1e38995 31 void write(T *dataPtr, size_t samples);
niv17 11:e48cb1e38995 32 size_t readSizeRemaining();
niv17 11:e48cb1e38995 33 void read(T *dataPtr, size_t samples);
niv17 11:e48cb1e38995 34 T readOneSample();
niv17 11:e48cb1e38995 35 void clear();
niv17 11:e48cb1e38995 36
niv17 11:e48cb1e38995 37 };
niv17 11:e48cb1e38995 38
niv17 11:e48cb1e38995 39 template <class T>
niv17 11:e48cb1e38995 40 size_t CircularBuffer<T>::writeSizeRemaining() {
niv17 11:e48cb1e38995 41 return capacity-readSizeRemaining()-1;
niv17 11:e48cb1e38995 42 }
niv17 11:e48cb1e38995 43
niv17 11:e48cb1e38995 44 template <class T>
niv17 11:e48cb1e38995 45 void CircularBuffer<T>::write(T *dataPtr, size_t samples)
niv17 11:e48cb1e38995 46 {
niv17 11:e48cb1e38995 47 /* Assumes enough space is avilable in data */
niv17 11:e48cb1e38995 48 //Condition 1 if wptr+samples<capacity
niv17 11:e48cb1e38995 49 //Condition 2 else two for loops
niv17 11:e48cb1e38995 50
niv17 11:e48cb1e38995 51 size_t sizeRemaining = capacity - wptr;
niv17 11:e48cb1e38995 52 if(sizeRemaining <= samples){
niv17 11:e48cb1e38995 53 size_t i=0;
niv17 11:e48cb1e38995 54 for(; wptr<capacity; i++)
niv17 11:e48cb1e38995 55 data[wptr++] = dataPtr[i];
niv17 11:e48cb1e38995 56 for(wptr = 0; i < samples; i++)
niv17 11:e48cb1e38995 57 data[wptr++] = dataPtr[i];
niv17 11:e48cb1e38995 58
niv17 11:e48cb1e38995 59 } else {
niv17 11:e48cb1e38995 60 for(size_t i=0; i<samples; i++)
niv17 11:e48cb1e38995 61 data[wptr++] = dataPtr[i];
niv17 11:e48cb1e38995 62 }
niv17 11:e48cb1e38995 63 }
niv17 11:e48cb1e38995 64
niv17 11:e48cb1e38995 65 template <class T>
niv17 11:e48cb1e38995 66 size_t CircularBuffer<T>::readSizeRemaining(){
niv17 11:e48cb1e38995 67 return (wptr >= rptr) ? wptr - rptr : (capacity-rptr+wptr);
niv17 11:e48cb1e38995 68 }
niv17 11:e48cb1e38995 69
niv17 11:e48cb1e38995 70 template <class T>
niv17 11:e48cb1e38995 71 void CircularBuffer<T>::read(T *buf, size_t samples)
niv17 11:e48cb1e38995 72 {
niv17 11:e48cb1e38995 73 /* Assumes enough space is avilable in data */
niv17 11:e48cb1e38995 74
niv17 11:e48cb1e38995 75 //Condition 1 if wptr+samples<capacity
niv17 11:e48cb1e38995 76 //Condition 2 else two for loops
niv17 11:e48cb1e38995 77
niv17 11:e48cb1e38995 78 size_t sizeRemaining = capacity - rptr;
niv17 11:e48cb1e38995 79 if(sizeRemaining <= samples){
niv17 11:e48cb1e38995 80 size_t i=0;
niv17 11:e48cb1e38995 81 for(; rptr < capacity; rptr++) {
niv17 11:e48cb1e38995 82 buf[i++] = data[rptr];
niv17 11:e48cb1e38995 83 }
niv17 11:e48cb1e38995 84 for(rptr = 0; i<samples; i++)
niv17 11:e48cb1e38995 85 buf[i] = data[rptr++];
niv17 11:e48cb1e38995 86 } else {
niv17 11:e48cb1e38995 87 for(size_t i=0; i < samples ; i++)
niv17 11:e48cb1e38995 88 buf[i] = data[rptr++];
niv17 11:e48cb1e38995 89 }
niv17 11:e48cb1e38995 90 }
niv17 11:e48cb1e38995 91
niv17 11:e48cb1e38995 92 template <class T>
niv17 11:e48cb1e38995 93 T CircularBuffer<T>::readOneSample() {
niv17 11:e48cb1e38995 94 return data[rptr++];
niv17 11:e48cb1e38995 95 }
niv17 11:e48cb1e38995 96
niv17 11:e48cb1e38995 97 template <class T>
niv17 11:e48cb1e38995 98 void CircularBuffer<T>::clear() {
niv17 11:e48cb1e38995 99 wptr = capacity-1;
niv17 11:e48cb1e38995 100 rptr = 0;
niv17 11:e48cb1e38995 101 for(size_t i = 0; i-1<capacity; i=i+2){
niv17 11:e48cb1e38995 102 data[i] = INITIAL;
niv17 11:e48cb1e38995 103 data[i+1] = 0;
niv17 11:e48cb1e38995 104 }
niv17 11:e48cb1e38995 105 }
niv17 11:e48cb1e38995 106
niv17 11:e48cb1e38995 107 #endif