ese 519 include files
Dependents: PROJECT_3D_AUDIO COG4050_adxl355_tilt COG4050_adxl355_tilt COG4050_adxl355_tilt_4050
CircularBuffer.h@0:5347612e39a3, 2015-04-07 (annotated)
- Committer:
- niv17
- Date:
- Tue Apr 07 21:09:51 2015 +0000
- Revision:
- 0:5347612e39a3
april_7 _ sonic start
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
niv17 | 0:5347612e39a3 | 1 | // |
niv17 | 0:5347612e39a3 | 2 | // CircularBuffer.h |
niv17 | 0:5347612e39a3 | 3 | // |
niv17 | 0:5347612e39a3 | 4 | // |
niv17 | 0:5347612e39a3 | 5 | // Created by Philadelphia Game Lab on 6/30/14. |
niv17 | 0:5347612e39a3 | 6 | // |
niv17 | 0:5347612e39a3 | 7 | // |
niv17 | 0:5347612e39a3 | 8 | |
niv17 | 0:5347612e39a3 | 9 | #ifndef _CircularBuffer_h |
niv17 | 0:5347612e39a3 | 10 | #define _CircularBuffer_h |
niv17 | 0:5347612e39a3 | 11 | |
niv17 | 0:5347612e39a3 | 12 | #include <stddef.h> |
niv17 | 0:5347612e39a3 | 13 | //#include <atomic> |
niv17 | 0:5347612e39a3 | 14 | #include <stdio.h> |
niv17 | 0:5347612e39a3 | 15 | #include <stdlib.h> |
niv17 | 0:5347612e39a3 | 16 | //#include <sndfile.h> |
niv17 | 0:5347612e39a3 | 17 | #include <iostream> |
niv17 | 0:5347612e39a3 | 18 | #include <fstream> |
niv17 | 0:5347612e39a3 | 19 | #include <cstring> |
niv17 | 0:5347612e39a3 | 20 | #include <string> |
niv17 | 0:5347612e39a3 | 21 | |
niv17 | 0:5347612e39a3 | 22 | template <class T> |
niv17 | 0:5347612e39a3 | 23 | class CircularBuffer{ |
niv17 | 0:5347612e39a3 | 24 | protected: |
niv17 | 0:5347612e39a3 | 25 | /*Declaring variables for use by circular buffer functions |
niv17 | 0:5347612e39a3 | 26 | _begIndex is buffer head, 3DMixer will read from here |
niv17 | 0:5347612e39a3 | 27 | _endIndex is buffer tail, buffer will write from wav file here |
niv17 | 0:5347612e39a3 | 28 | _capacity is circular buffer capacity |
niv17 | 0:5347612e39a3 | 29 | */ |
niv17 | 0:5347612e39a3 | 30 | size_t _begIndex, _endIndex, _capacity; |
niv17 | 0:5347612e39a3 | 31 | |
niv17 | 0:5347612e39a3 | 32 | //_size is the current size of the buffer, amount of data written to buffer |
niv17 | 0:5347612e39a3 | 33 | // std::atomic<size_t> _size; |
niv17 | 0:5347612e39a3 | 34 | size_t _size; |
niv17 | 0:5347612e39a3 | 35 | //pointer to circular buffer, start writing data from here |
niv17 | 0:5347612e39a3 | 36 | T *_data; |
niv17 | 0:5347612e39a3 | 37 | |
niv17 | 0:5347612e39a3 | 38 | public: |
niv17 | 0:5347612e39a3 | 39 | CircularBuffer(size_t capacity) |
niv17 | 0:5347612e39a3 | 40 | : _begIndex(0) |
niv17 | 0:5347612e39a3 | 41 | , _endIndex(0) |
niv17 | 0:5347612e39a3 | 42 | , _size(0) |
niv17 | 0:5347612e39a3 | 43 | , _capacity(capacity) |
niv17 | 0:5347612e39a3 | 44 | { |
niv17 | 0:5347612e39a3 | 45 | _data = new T[capacity*sizeof(T)]; |
niv17 | 0:5347612e39a3 | 46 | } |
niv17 | 0:5347612e39a3 | 47 | |
niv17 | 0:5347612e39a3 | 48 | ~CircularBuffer() |
niv17 | 0:5347612e39a3 | 49 | { |
niv17 | 0:5347612e39a3 | 50 | delete[] _data; |
niv17 | 0:5347612e39a3 | 51 | } |
niv17 | 0:5347612e39a3 | 52 | |
niv17 | 0:5347612e39a3 | 53 | //Define write audio data to circular buffer |
niv17 | 0:5347612e39a3 | 54 | size_t write(T *dataPtr, size_t samples); |
niv17 | 0:5347612e39a3 | 55 | size_t writeSizeRemaining(); |
niv17 | 0:5347612e39a3 | 56 | size_t readSizeRemaining(); |
niv17 | 0:5347612e39a3 | 57 | template <class V> |
niv17 | 0:5347612e39a3 | 58 | size_t read(V *dataPtr, size_t samples); |
niv17 | 0:5347612e39a3 | 59 | |
niv17 | 0:5347612e39a3 | 60 | void clear(); |
niv17 | 0:5347612e39a3 | 61 | }; |
niv17 | 0:5347612e39a3 | 62 | |
niv17 | 0:5347612e39a3 | 63 | template <class T> |
niv17 | 0:5347612e39a3 | 64 | size_t CircularBuffer<T>::write(T *dataPtr, size_t samples) |
niv17 | 0:5347612e39a3 | 65 | { |
niv17 | 0:5347612e39a3 | 66 | size_t capacity = _capacity; |
niv17 | 0:5347612e39a3 | 67 | size_t samples_to_write = std::min(samples, capacity-_size); |
niv17 | 0:5347612e39a3 | 68 | |
niv17 | 0:5347612e39a3 | 69 | _size += samples_to_write; |
niv17 | 0:5347612e39a3 | 70 | //writing to buffer |
niv17 | 0:5347612e39a3 | 71 | |
niv17 | 0:5347612e39a3 | 72 | if (samples_to_write <= capacity - _endIndex) { |
niv17 | 0:5347612e39a3 | 73 | // samples to write will fit in buffer without wrapping |
niv17 | 0:5347612e39a3 | 74 | for(int i = 0; i < samples_to_write; i++) { |
niv17 | 0:5347612e39a3 | 75 | _data[_endIndex+i] = dataPtr[i]; |
niv17 | 0:5347612e39a3 | 76 | } |
niv17 | 0:5347612e39a3 | 77 | _endIndex += samples_to_write; |
niv17 | 0:5347612e39a3 | 78 | if (_endIndex == capacity) { |
niv17 | 0:5347612e39a3 | 79 | _endIndex = 0; |
niv17 | 0:5347612e39a3 | 80 | } |
niv17 | 0:5347612e39a3 | 81 | } else { |
niv17 | 0:5347612e39a3 | 82 | // TODO: pretty sure this can be done with modulo arithmetic... |
niv17 | 0:5347612e39a3 | 83 | size_t size1 = capacity - _endIndex; |
niv17 | 0:5347612e39a3 | 84 | for(int i = 0; i < size1; i++) { |
niv17 | 0:5347612e39a3 | 85 | _data[_endIndex+i] = dataPtr[i]; |
niv17 | 0:5347612e39a3 | 86 | } |
niv17 | 0:5347612e39a3 | 87 | size_t size2 = samples_to_write - size1; |
niv17 | 0:5347612e39a3 | 88 | for(int i = 0; i < size2; i++) { |
niv17 | 0:5347612e39a3 | 89 | _data[i] = dataPtr[i+size1]; |
niv17 | 0:5347612e39a3 | 90 | } |
niv17 | 0:5347612e39a3 | 91 | _endIndex = size2; |
niv17 | 0:5347612e39a3 | 92 | } |
niv17 | 0:5347612e39a3 | 93 | |
niv17 | 0:5347612e39a3 | 94 | return samples_to_write; |
niv17 | 0:5347612e39a3 | 95 | } |
niv17 | 0:5347612e39a3 | 96 | |
niv17 | 0:5347612e39a3 | 97 | template <class T> |
niv17 | 0:5347612e39a3 | 98 | size_t CircularBuffer<T>::writeSizeRemaining() |
niv17 | 0:5347612e39a3 | 99 | { |
niv17 | 0:5347612e39a3 | 100 | return (_capacity - _size); |
niv17 | 0:5347612e39a3 | 101 | } |
niv17 | 0:5347612e39a3 | 102 | |
niv17 | 0:5347612e39a3 | 103 | template <class T> |
niv17 | 0:5347612e39a3 | 104 | size_t CircularBuffer<T>::readSizeRemaining() |
niv17 | 0:5347612e39a3 | 105 | { |
niv17 | 0:5347612e39a3 | 106 | return _size; |
niv17 | 0:5347612e39a3 | 107 | } |
niv17 | 0:5347612e39a3 | 108 | |
niv17 | 0:5347612e39a3 | 109 | template <class T> template <class V> |
niv17 | 0:5347612e39a3 | 110 | size_t CircularBuffer<T>::read(V *dataPtr, size_t samples) |
niv17 | 0:5347612e39a3 | 111 | { |
niv17 | 0:5347612e39a3 | 112 | if (samples == 0){ |
niv17 | 0:5347612e39a3 | 113 | return 0; |
niv17 | 0:5347612e39a3 | 114 | } |
niv17 | 0:5347612e39a3 | 115 | size_t capacity = _capacity; |
niv17 | 0:5347612e39a3 | 116 | size_t samples_to_read; |
niv17 | 0:5347612e39a3 | 117 | if (samples >= _size){ |
niv17 | 0:5347612e39a3 | 118 | samples_to_read = _size; |
niv17 | 0:5347612e39a3 | 119 | }else{ |
niv17 | 0:5347612e39a3 | 120 | samples_to_read = samples; |
niv17 | 0:5347612e39a3 | 121 | } |
niv17 | 0:5347612e39a3 | 122 | // Read in a single step |
niv17 | 0:5347612e39a3 | 123 | if (samples_to_read <= capacity - _begIndex){ |
niv17 | 0:5347612e39a3 | 124 | for(int i = 0; i < samples_to_read; i++) { |
niv17 | 0:5347612e39a3 | 125 | dataPtr[i] = _data[_begIndex+i]; |
niv17 | 0:5347612e39a3 | 126 | } |
niv17 | 0:5347612e39a3 | 127 | |
niv17 | 0:5347612e39a3 | 128 | _begIndex += samples_to_read; |
niv17 | 0:5347612e39a3 | 129 | if (_begIndex == capacity){ |
niv17 | 0:5347612e39a3 | 130 | _begIndex = 0; |
niv17 | 0:5347612e39a3 | 131 | } |
niv17 | 0:5347612e39a3 | 132 | }else{ |
niv17 | 0:5347612e39a3 | 133 | size_t size_1 = capacity - _begIndex; |
niv17 | 0:5347612e39a3 | 134 | for(int i = 0; i < size_1; i++) { |
niv17 | 0:5347612e39a3 | 135 | dataPtr[i] = _data[_begIndex+i]; |
niv17 | 0:5347612e39a3 | 136 | } |
niv17 | 0:5347612e39a3 | 137 | size_t size_2 = samples_to_read - size_1; |
niv17 | 0:5347612e39a3 | 138 | |
niv17 | 0:5347612e39a3 | 139 | for(int i = 0; i < size_2; i++) { |
niv17 | 0:5347612e39a3 | 140 | dataPtr[i+size_1] = _data[i]; |
niv17 | 0:5347612e39a3 | 141 | } |
niv17 | 0:5347612e39a3 | 142 | _begIndex = size_2; |
niv17 | 0:5347612e39a3 | 143 | } |
niv17 | 0:5347612e39a3 | 144 | _size -= samples_to_read; |
niv17 | 0:5347612e39a3 | 145 | return samples_to_read; |
niv17 | 0:5347612e39a3 | 146 | } |
niv17 | 0:5347612e39a3 | 147 | |
niv17 | 0:5347612e39a3 | 148 | template <class T> |
niv17 | 0:5347612e39a3 | 149 | void CircularBuffer<T>::clear() { |
niv17 | 0:5347612e39a3 | 150 | _size = 0; |
niv17 | 0:5347612e39a3 | 151 | _begIndex = 0; |
niv17 | 0:5347612e39a3 | 152 | _endIndex = 0; |
niv17 | 0:5347612e39a3 | 153 | } |
niv17 | 0:5347612e39a3 | 154 | |
niv17 | 0:5347612e39a3 | 155 | #endif |