ese 519 include files
Dependents: PROJECT_3D_AUDIO COG4050_adxl355_tilt COG4050_adxl355_tilt COG4050_adxl355_tilt_4050
CircBuff.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 | // CircBuff.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 _CircBuff_h |
niv17 | 0:5347612e39a3 | 10 | #define _CircBuff_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 CircBuff{ |
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 | |
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 | CircBuff(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 | ~CircBuff() |
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 | |
niv17 | 0:5347612e39a3 | 61 | template <class T> |
niv17 | 0:5347612e39a3 | 62 | size_t CircBuff<T>::write(T *dataPtr, size_t samples) |
niv17 | 0:5347612e39a3 | 63 | { |
niv17 | 0:5347612e39a3 | 64 | size_t capacity = _capacity; |
niv17 | 0:5347612e39a3 | 65 | size_t samples_to_write = std::min(samples, capacity-_size); |
niv17 | 0:5347612e39a3 | 66 | |
niv17 | 0:5347612e39a3 | 67 | _size += samples_to_write; |
niv17 | 0:5347612e39a3 | 68 | //writing to buffer |
niv17 | 0:5347612e39a3 | 69 | |
niv17 | 0:5347612e39a3 | 70 | if (samples_to_write <= capacity - _endIndex) { |
niv17 | 0:5347612e39a3 | 71 | for(int i = 0; i < samples_to_write; i++) { |
niv17 | 0:5347612e39a3 | 72 | _data[_endIndex+i] = dataPtr[i]; |
niv17 | 0:5347612e39a3 | 73 | } |
niv17 | 0:5347612e39a3 | 74 | _endIndex += samples_to_write; |
niv17 | 0:5347612e39a3 | 75 | if (_endIndex == capacity) { |
niv17 | 0:5347612e39a3 | 76 | _endIndex = 0; |
niv17 | 0:5347612e39a3 | 77 | } |
niv17 | 0:5347612e39a3 | 78 | } else { |
niv17 | 0:5347612e39a3 | 79 | size_t size1 = capacity - _endIndex; |
niv17 | 0:5347612e39a3 | 80 | for(int i = 0; i < size1; i++) { |
niv17 | 0:5347612e39a3 | 81 | _data[_endIndex+i] = dataPtr[i]; |
niv17 | 0:5347612e39a3 | 82 | } |
niv17 | 0:5347612e39a3 | 83 | size_t size2 = samples_to_write - size1; |
niv17 | 0:5347612e39a3 | 84 | for(int i = 0; i < size2; i++) { |
niv17 | 0:5347612e39a3 | 85 | _data[i] = dataPtr[i+size1]; |
niv17 | 0:5347612e39a3 | 86 | } |
niv17 | 0:5347612e39a3 | 87 | _endIndex = size2; |
niv17 | 0:5347612e39a3 | 88 | } |
niv17 | 0:5347612e39a3 | 89 | |
niv17 | 0:5347612e39a3 | 90 | return samples_to_write; |
niv17 | 0:5347612e39a3 | 91 | } |
niv17 | 0:5347612e39a3 | 92 | |
niv17 | 0:5347612e39a3 | 93 | template <class T> |
niv17 | 0:5347612e39a3 | 94 | size_t CircBuff<T>::writeSizeRemaining() |
niv17 | 0:5347612e39a3 | 95 | { |
niv17 | 0:5347612e39a3 | 96 | return (_capacity - _size); |
niv17 | 0:5347612e39a3 | 97 | } |
niv17 | 0:5347612e39a3 | 98 | |
niv17 | 0:5347612e39a3 | 99 | template <class T> |
niv17 | 0:5347612e39a3 | 100 | size_t CircBuff<T>::readSizeRemaining() |
niv17 | 0:5347612e39a3 | 101 | { |
niv17 | 0:5347612e39a3 | 102 | return _size; |
niv17 | 0:5347612e39a3 | 103 | } |
niv17 | 0:5347612e39a3 | 104 | |
niv17 | 0:5347612e39a3 | 105 | template <class T> template <class V> |
niv17 | 0:5347612e39a3 | 106 | size_t CircBuff<T>::read(V *dataPtr, size_t samples) |
niv17 | 0:5347612e39a3 | 107 | { |
niv17 | 0:5347612e39a3 | 108 | if (samples == 0){ |
niv17 | 0:5347612e39a3 | 109 | return 0; |
niv17 | 0:5347612e39a3 | 110 | } |
niv17 | 0:5347612e39a3 | 111 | size_t capacity = _capacity; |
niv17 | 0:5347612e39a3 | 112 | size_t samples_to_read; |
niv17 | 0:5347612e39a3 | 113 | if (samples >= _size){ |
niv17 | 0:5347612e39a3 | 114 | samples_to_read = _size; |
niv17 | 0:5347612e39a3 | 115 | }else{ |
niv17 | 0:5347612e39a3 | 116 | samples_to_read = samples; |
niv17 | 0:5347612e39a3 | 117 | } |
niv17 | 0:5347612e39a3 | 118 | // Read in a single step |
niv17 | 0:5347612e39a3 | 119 | if (samples_to_read <= capacity - _begIndex){ |
niv17 | 0:5347612e39a3 | 120 | for(int i = 0; i < samples_to_read; i++) { |
niv17 | 0:5347612e39a3 | 121 | dataPtr[i] = _data[_begIndex+i]; |
niv17 | 0:5347612e39a3 | 122 | } |
niv17 | 0:5347612e39a3 | 123 | |
niv17 | 0:5347612e39a3 | 124 | _begIndex += samples_to_read; |
niv17 | 0:5347612e39a3 | 125 | if (_begIndex == capacity){ |
niv17 | 0:5347612e39a3 | 126 | _begIndex = 0; |
niv17 | 0:5347612e39a3 | 127 | } |
niv17 | 0:5347612e39a3 | 128 | }else{ |
niv17 | 0:5347612e39a3 | 129 | size_t size_1 = capacity - _begIndex; |
niv17 | 0:5347612e39a3 | 130 | for(int i = 0; i < size_1; i++) { |
niv17 | 0:5347612e39a3 | 131 | dataPtr[i] = _data[_begIndex+i]; |
niv17 | 0:5347612e39a3 | 132 | } |
niv17 | 0:5347612e39a3 | 133 | size_t size_2 = samples_to_read - size_1; |
niv17 | 0:5347612e39a3 | 134 | |
niv17 | 0:5347612e39a3 | 135 | for(int i = 0; i < size_2; i++) { |
niv17 | 0:5347612e39a3 | 136 | dataPtr[i+size_1] = _data[i]; |
niv17 | 0:5347612e39a3 | 137 | } |
niv17 | 0:5347612e39a3 | 138 | _begIndex = size_2; |
niv17 | 0:5347612e39a3 | 139 | } |
niv17 | 0:5347612e39a3 | 140 | _size -= samples_to_read; |
niv17 | 0:5347612e39a3 | 141 | return samples_to_read; |
niv17 | 0:5347612e39a3 | 142 | } |
niv17 | 0:5347612e39a3 | 143 | |
niv17 | 0:5347612e39a3 | 144 | |
niv17 | 0:5347612e39a3 | 145 | |
niv17 | 0:5347612e39a3 | 146 | #endif |