ese 519 include files

Dependents:   PROJECT_3D_AUDIO COG4050_adxl355_tilt COG4050_adxl355_tilt COG4050_adxl355_tilt_4050

Committer:
niv17
Date:
Tue Apr 07 21:09:51 2015 +0000
Revision:
0:5347612e39a3
april_7 _ sonic start

Who changed what in which revision?

UserRevisionLine numberNew 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