nivedita velagaleti
/
lab3_musicplayer
music main
Fork of AppBoard_Waveplayer by
CircularBuffer.h@11:e48cb1e38995, 2015-04-14 (annotated)
- 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?
User | Revision | Line number | New 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 |