00001 #include "gapeaccumulator.h"
00002 #include <limits.h>
00003
00004 GapeAccumulator::GapeAccumulator(int numSamples)
00005 : GapeUnit(NULL),
00006 resizeSize(numSamples),
00007
00008 tickCounter(INT_MAX) {
00009 if (numSamples <= 0) {
00010 numSamples = 1;
00011 GapeConsts::reportError("Invalid number of samples in GapeAccumulator constructor, gapeaccumulator.cpp line 33\n");
00012 }
00013 d_numSamples = numSamples;
00014 d_writeIndex = 0;
00015 d_samples = new GapeFloat[d_numSamples];
00016 }
00017
00018 GapeAccumulator::~GapeAccumulator() { delete[] d_samples; }
00019
00020
00021 void GapeAccumulator::receiveTick( const GapeFloat* values, int numValues ) {
00022
00023 if(numValues == 0) return;
00024
00025
00026
00027 if (tickCounter >= GapeConsts::updateMutexPeriod) {
00028 bool needResize = false;
00029 int newSize;
00030 d_mutex.lock();
00031 if (resizeSize != d_numSamples) {
00032 needResize = true;
00033 newSize = resizeSize;
00034 }
00035 d_mutex.unlock();
00036 if (needResize) {
00037 adjustBuffers(newSize);
00038 }
00039 tickCounter = 0;
00040 }
00041
00042 const GapeFloat* readptr = values;
00043 int numunaccumulated = numValues;
00044 int numtocopy;
00045
00046 while(true) {
00047
00048
00049 if(numunaccumulated < spaceRemaining() ) {
00050 memcpy(d_samples + d_writeIndex, readptr,
00051 numunaccumulated * sizeof(GapeFloat));
00052 d_writeIndex += numunaccumulated;
00053 break;
00054 } else {
00055 numtocopy = spaceRemaining();
00056 memcpy(d_samples + d_writeIndex, readptr,
00057 numtocopy * sizeof(GapeFloat));
00058 readptr += numtocopy;
00059 d_writeIndex = 0;
00060 numunaccumulated -= numtocopy;
00061 emit emitTick(d_samples, d_numSamples);
00062 }
00063 }
00064 tickCounter++;
00065 }
00066
00067
00068
00069 void GapeAccumulator::adjustBuffers(int newSize) {
00070 if (newSize <= 0) {
00071 newSize = 1;
00072 GapeConsts::reportError("Invalid number of samples in GapeAccumulator adjustBuffers, gapeaccumulator.cpp line 79\n");
00073 }
00074
00075 int numTimesSmaller = d_writeIndex / newSize;
00076
00077
00078
00079
00080 int numEmitted = 0;
00081 for(int i = 0; i < numTimesSmaller; ++i) {
00082 emit emitTick(d_samples + (i * newSize), newSize);
00083 numEmitted += newSize;
00084 }
00085
00086 GapeFloat* temp = new GapeFloat[newSize];
00087 d_writeIndex -= numEmitted;
00088
00089 memcpy(temp, d_samples + numEmitted,
00090 d_writeIndex * sizeof(GapeFloat));
00091
00092 delete[] d_samples;
00093 d_samples = temp;
00094 d_numSamples = newSize;
00095 }
00096
00097
00098
00099
00100
00101 void GapeAccumulator::resizeAccumulator( int newSize ) {
00102 if (newSize <= 0) {
00103 newSize = 1;
00104 GapeConsts::reportError("Invalid number of samples in GapeAccumulator resize, gapeaccumulator.cpp line 79\n");
00105 }
00106 d_mutex.lock();
00107 resizeSize = newSize;
00108 d_mutex.unlock();
00109 }